首页 > TAG信息列表 > POI2014

LG3565 [POI2014]HOT-Hotels 题解

P3565 [POI2014]HOT-Hotels 给定一棵树,在树上选 \(3\) 个点,要求两两距离相等,求方案数。 原题数据范围 \(n\leq 5000\),可做到线性,空间 \(62.5\text{MB}\)。 sub1 \(n\leq 5000\) 不用多说,直接枚举每一个点作为中点,统计这个点不同的三颗子树中点的选取方案数。定义 \(f_i\) 为先前

[POI2014]HOT-Hotels 加强版

长链剖分优化 \(dp\) 模板 不过这 \(dp\) 真毒 \(\text{Code}\) #include <cstdio> #define RE register #define IN inline using namespace std; typedef long long LL; const int N = 1e5 + 5; int n, h[N], tot, len[N], son[N]; struct edge{int to, nxt;}e[N <<

题解-[POI2014]PRZ-Criminals

一道看起来蛮套路的题。首先如果确定了两端的起点的话这题就非常好做了。 贪心地来想,每次走到第一个该走的颜色。举个栗子,假设数据是这样的: 10 5 1 2 3 2 4 3 5 2 2 1 3 2 2 3 4 2 4 那么如果第一个人的位置是1,下一个他会到位置2的 \(2\),然后再到位置3的 \(3\),再到位置5的 \(4\)

P3577-[POI2014]TUR-Tourism【状压dp】

正题 题目链接:https://www.luogu.com.cn/problem/P3577 题目大意 给出\(n\)个点\(m\)条边的一张图,每个点有费用\(C_i\),求选出费用和最小的点使得每个点都至少有一个相邻的点(或自己)被选择。保证图上不存在超过\(10\)个点的简单路径。 \(1\leq n\leq 20000,1\leq m\leq 25000\)

P3572 [POI2014]PTA-Little Bird

Jisoo 显然满足单调性,可以用单调队列优化 但是要维护两个值 考虑一下这两个值来说,因为每次疲劳值最多加1,那么无论如何优先选择疲劳值最小的来进行转移, 答案肯定不会更差 如果有两个数疲劳值相同但是高度不一样的话,显然保留高度更高的比较好 #include<iostream> #include<cstdio> #

P3571 [POI2014]SUP-Supercomputer

*X. P3571 [POI2014]SUP-Supercomputer 题意简述:一棵以 \(1\) 为根的树。\(q\) 次询问,每次给出 \(k\),求至少要多少次同时访问不超过 \(k\) 次父节点已经被访问过的节点,才能访问完整棵树。根节点无限制。 \(n,q\leq 10^6\)。 节选自 DP 优化方法大杂烩 7. 斜率优化例题 X。 sweet

P3573 [POI2014]RAJ-Rally

Problem 给一个\(n\)个点,\(m\)条边的DAG,找到一个点,使得删去这个点后的最长路径最短。 \(2 \le n \le 500000,1 \le m \le 1000000\)。 Solution 看到DAG就想到拓扑。 求出以\(x\)为起点的最长路径长度\(ds_x\)和以\(x\)为终点的最长路径长度\(dt_x\)。可以通过跑正反图拓扑实现。

[POI2014]RAJ-Rally

考虑到图是\(tag\),我们依次按拓扑序考虑: 我们发现,如果我们按这个顺序考虑,则会有两个集合\(S,T\),其中所有跨集合边都是从一个固定集合到另外一个集合的。 我们利用这个性质,对每个点拓扑求出从他出发,和以他结尾的边的最长路径。 那么我们只要按拓扑序依次考虑删掉某个点后的变化,以及

P3574 [POI2014]FAR-FarmCraft (树形DP)

这题直接贪心显然不可行. 考虑树形dp,用 \(f_i\) 表示到 \(i\) 人后,以 \(i\) 为根的所有人安装完的最短时间. 对于一个节点 \(u\), 假设拜访子节点的顺序为 \(v_1,v_2,...,v_m\) ,那么得到转移方程. \[f_u = max(f_v + \sum\limits_{j = 1}^{i - 1}sum_j) \]其中 \(sum_i\) 表示拜访

P3580 [POI2014]ZAL-Freight(单调队列dp)

P3580 [POI2014]ZAL-Freight(单调队列dp) 考虑两辆车怎么样是最优的。 t 1 , t 2

【洛谷3573】[POI2014] RAJ-Rally(拓扑+堆)

点此看题面 一张\(n\)个点的\(DAG\),你可以删去一个点,要求最小化剩余图中的最长路径。 \(n\le5\times10^5,m\le10^6\) 过去点集与未来点集 一个非常奇妙的做法。 首先我们跑一遍拓扑,预处理出到每个点为止的最长路\(d1_x\)和从每个点开始的最长路\(d2_x\),这只要简单地\(DAG\)上\(D

[POI2014]HOT-Hotels 加强版

I.II.[POI2014]HOT-Hotels 加强版 易于发现,三点间两两距离相等,当且仅当两个LCA较深的点到它们的LCA距离相等,且第三个点到该LCA的距离与前两个点相同。 于是我们设 \(f_{x,i}\) 表示 \(x\) 子树中有多少对点,它们到LCA距离相同,且上述距离比该LCA到 \(x\) 的距离长 \(i\)。考虑现在将

#2466. 「POI2014」卡片 Card

将每个位置拆成两个状态 \(0/1\),分别表示该牌选择正面/反面,如果 \(v_{i,a} \le v_{i + 1, b}\) 则在这两个状态间连边, 最终就是看两头是否存在一条通路。 可以用线段树来维护每段区间两头的四种情况是否可能连通即可。 #include <bits/stdc++.h> using namespace std; #define rep

BZOJ-3834 [Poi2014]Solar Panels(数论分块)

题目描述   已知 \(A\leq x\leq B,C\leq y\leq D\),求 \(\gcd(x,y)\) 的最大值。   数据范围:\(1\leq T\leq 1000,1\leq A\leq B\leq 10^9,1\leq C\leq D\leq 10^9\)。 分析   考虑枚举 \(x,y\) 的公因子 \(d\)。   首先可以发现一个性质:区间 \([l,r]\) 中有 \(d\) 的倍数的

P3565 [POI2014]HOT-Hotels

洛谷传送门 为什么总有人说这是长链剖分板子题? Solution 题意非常简洁,这让我少了转化题意这一步。 我们考虑什么样的三个点在树上满足两两之间距离 \(d\) 相等: 对于某一个点,它的子树内以它为LCA,距它 \(d\) 的三个点 对于某一个点,它的 \(d\) 级祖先以及子树内两个以它为LCA,距它 \(

luogu P3565 [POI2014]HOT-Hotels 普通的树形dp

#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int N=10005; int e[N],ne[N],idx,h[N]; int n; int cnt,bian[N],deep,tot[N],c1[N],c2[N]; long long ans; void add(int a,int b) { e[id

POI2014 FAR-FarmCraft 树形DP+贪心

题目链接 https://www.luogu.org/problem/P3574 题意 翻译其实已经很明确了 分析 这题一眼就是贪心啊,但贪心的方法要思索一下,首先是考虑先走时间多的子树,但不太现实,因为时间跟点的个数也有关系,而且很有可能另外一棵子树不去走会闲置很长时间,就是这棵子树本来可以走一遍然后在子树

BZOJ3524:[POI2014]Couriers

浅谈主席树:https://www.cnblogs.com/AKMer/p/9956734.html 题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=3524 假设数列不是一开始就给你的,而是一次一次修改操作让你插入数值xx,而询问是问你从第L次插入到第R次操作间,有没有哪个数值插入次数超过(R−L+1)/2,把题意这

orz syk040424 orz chc_1235467890 (POI题目选)

POI2015 LAS 环状dp,状态为第i个食物不被选,被左边选,被右边选,被两边选,枚举第一个食物的状态 POI2014 ZAL-Freight dp,列出方程后发现由于每辆车发车时间和前i辆车的答案单增,所以两个指针扫一下O(n) POI2015 MYJ 区间dp,设dp[i][r][k]为i到r区间内价格为k的收益,然后把c[i]离散化一下O(n

BZOJ:3832: [Poi2014]Rally

题意: 给出$DAG$,询问删掉哪个点之后最长路径最短 思路: 我们令$f[x]$表示从最远的点到达它的距离,$g[x]$表示它能够到达最远的点的距离 那么对于$(x -> y)$一条边来说,它所在的最长路径就是 $f[x] + 1 + g[y]$ 我们按照拓扑序依次删点 我们发现此时删去一个点,那么可能存在的最长的路径

[BZOJ]3522: [Poi2014]Hotel

  题解:  $ n<=5000 $  那我们考虑暴力枚举根    $ dp[x] $表示任意两个属于不同根儿子子树且深度为x个数的乘积和   $ sum[x] $表示不同根儿子子树 深度为x的个数和   然后统计方案就行了 #include <algorithm>#include <iostream>#include <cstring>#include <cstdio

主席树||可持久化线段树||BZOJ 3524: [Poi2014]Couriers||BZOJ 2223: [Coci 2009]PATULJCI||Luogu P3567 [POI2014]KUR

题目:[POI2014]KUR-Couriers 题解: 要求出现次数大于(R-L+1)/2的数,这样的数最多只有一个。我们对序列做主席树,每个节点记录出现的次数和(sum)。(这里忽略版本差值问题)对于一个节点,如果左儿子的sum小于等于(R-L+1)/2,则答案不可能在左儿子中;右儿子同理。然后对有可能的儿子递归寻找答案,如果左

[BZOJ]3526: [Poi2014]Card

题解: 线段树区间合并 只需要维护两端  再选正面或反面时4种情况是否满足情况   合并的话 考虑左儿子的右端点  右儿子的左端点的大小关系 然后合并 #include <algorithm>#include <iostream>#include <cstring>#include <cstdio>#include <vector>#include <stack>#include <

3832: [Poi2014]Rally

3832: [Poi2014]Rally 链接 分析:   首先可以考虑删除掉一个点后,计算最长路。   设$f[i]$表示从起点到i的最长路,$g[i]$表示从i出发到终点的最长路。那么经过一条边的最长路就是$f[u]+1+g[v]$。   删除一个点后,这个点可能会使一些 代码: #include<cstdio>#include<algorithm>#i