![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Poi
L_0_Forever_LF
一个热爱OI的OIer
展开
-
BZOJ1132: [POI2008]Tro
所以为啥用long long本地能过所有数据交上去就WA,一定要改int啊一开始写了个用点到直线距离公式的,维护两个指针扫过去 emmmmmm并不能过样例,因为有根号什么的东西,调不动….膜题解发现可以用叉积(好有道理..) 改成叉积,继续用两个指针扫….过了样例WA了… 调一下发现排序出的结果不是我想要的qwq 所以说我不会做各种几何题qwq那把题解看完吧 按x排序所有点,枚举每个点为原原创 2017-12-08 10:18:08 · 286 阅读 · 0 评论 -
BZOJ1138: [POI2009]Baj 最短回文路
开始想建个n^2个点的图跑最短路来着…因为显然会T,一直在想优化结果不会就弃疗了..dp f[i][j]表示i到j的最短回文路长度 转移:f[i][j]=2+minc(f[u][v]),u∈S,v∈Tf[i][j]=2+min_c(f[u][v]),u∈S,v∈T,其中S是i走c边能到达的点集,T是走c边能到达j的点集 发现转移是O(n2)O(n^2)的 但我们可以通过dp时顺便处理一个mi原创 2017-12-11 18:28:28 · 278 阅读 · 0 评论 -
BZOJ1137: [POI2009]Wsp 岛屿
看错题了qwq看对题了也不会呀… 题解说是半平面交裸题 于是学了一下半平面交 贴个板子qwqcode:#include<set>#include<map>#include<deque>#include<queue>#include<stack>#include<cmath>#include<ctime>#include<bitset>#include<string>#incl原创 2017-12-11 16:30:49 · 296 阅读 · 0 评论 -
BZOJ1135: [POI2009]Lyz
似乎是hall定理的经典模型贪心的想,对于人的任意一个集合,肯定编号是连续的l~r一段更容易使匹配不合法 写成柿子就是∑ri=lsi>(d+r−l+1)k\sum_{i=l}^rsi>(d+r-l+1)k 把l,r移项,令ci=si−kci=si-k 柿子可以化为∑ri=lci>dk\sum_{i=l}^rci>dk 用线段树维护序列里的最大连续子序列和判一下code:#include<se原创 2017-12-11 16:28:19 · 353 阅读 · 0 评论 -
BZOJ1119: [POI2009]SLO
建一个n个点的图,若ax在b中的位置是y,就连一条x->y的边,每次可以交换两个出度,代价是wx+wy,问让所有边连成自环的最小花费每个环显然选出最小的wx顺着环换,也可以额外花费一些,和其他环并在一起,用其他环的wx换 判一下就行了code:#include<set>#include<map>#include<deque>#include<queue>#include<stack>#i原创 2017-12-11 16:22:17 · 281 阅读 · 0 评论 -
BZOJ1118: [POI2009]Prz
这题好像是个论文题??有个论文证明了这题做法的复杂度但是我太懒了没去看….一开始我以为这题是反着构造使F(x,y)为true的x,y序列,然后得到什么结论什么的 想了一会没得到什么有用的东西就弃疗了 (连续相同的元素可以合并好像对搜索还是挺有用的一个性质 问了Claris这题居然是搜索qwq注意到元素集合|S|<=100,因为F(x,y)的柿子每次去掉一种元素,所以不会超过100层 然后这个原创 2017-12-11 15:57:12 · 604 阅读 · 0 评论 -
BZOJ1117: [POI2009]救火站Gas
考虑贪心的去放消防站,让每个消防站的层数尽量浅,从而覆盖子树里的点的同时能对子树外产生贡献那么x要放消防站的时候,一定是x的子树里还未被覆盖的最远的点距离x的距离为k,如果这样的点有c个,我们要放⌈cs⌉\lceil \dfrac{c}{s} \rceil个消防站,这些消防站覆盖完了这c个点后,再去覆盖距离x距离为k-1的点,都覆盖完了后还能覆盖的点数上传给父亲 为什么这样是最优的,因为此时距离x原创 2017-12-11 15:44:47 · 439 阅读 · 1 评论 -
BZOJ3834: [Poi2014]Solar Panels
一开始看错题了,后来重新看了题…emmmm还是不会啊啊啊啊,写了个貌似复杂度很对的暴力交上去过了???(先讲一下我这个比较搞笑?的做法) 求a~b,c~d的数之间的最大的gcd,尝试枚举一下? 因为一个数x,他的>x√> \sqrt x的约数可以通过枚举<x√< \sqrt x的约数求得,我们枚举从1到b√\sqrt b枚举dd,对于x=from a to bx=from\ a\ to\ b,原创 2017-11-29 21:52:08 · 287 阅读 · 0 评论 -
BZOJ3836: [Poi2014]Tourism
因为任意两点间不存在点数超过10的简单路径,所以dfs搜索树的层数不超过10 对每个联通块建dfs搜索树,因为所有非树边都是返祖边,可以顺着dfs序dp,三进制状态压每一层的状态,0表示未被覆盖,1表示建了旅游站,2表示没建被覆盖其实感觉这个复杂度很虚qwqcode:#include<set>#include<map>#include<deque>#include<queue>#inclu原创 2017-12-01 20:31:09 · 428 阅读 · 0 评论 -
BZOJ3835: [Poi2014]Supercomputer
不会做看题解qwq,感觉这个结论…不知道怎么想啊qwq 用sum[i]表示层数>=i的点数,那么有ans=maxi=1 to maxdep(i+⌈sum[i+1]k⌉)ans=max_{i=1\ to\ maxdep}( i+\lceil \dfrac{sum[i+1]}{k} \rceil) 这个柿子的意思是:用i次操作搞定前i层,接下来每次操作都能取满k个或把剩余不足k个取完为什么答案就是这原创 2017-12-01 20:28:42 · 436 阅读 · 0 评论 -
BZOJ3833: [Poi2014]Solar lamps
可以将给出的直线视作向量,那么当这两个向量不共线时(共线时情况类似),建立出以这两个向量为基底的坐标系,将坐标取反后,每盏灯(x,y)亮了后,能照亮的区域是(<=x,<=y),然后直接暴力弄这个东西就行了 因为不会写树套树qwq,我写了kd-tree,卡了半天卡过去了qwq 为了减小常数写了指针和一些奇奇怪怪的东西,代码可能不会很友好code:#include<set>#include<map原创 2017-11-29 21:35:57 · 354 阅读 · 0 评论 -
BZOJ3832: [Poi2014]Rally
喵喵喵新建点st连向所有点,所有点连向点ed,f[i]表示S到i的最长链,g[i]表示i到T的最长链,那么过一条边< u,v>的最长链就是f[u]+< u,v>+g[v],将这个定义为边权,那么原图任意一个割集中最大的边权就是图中的最长链 按拓扑序枚举删的点,一开始原图分成st和其他点两个集合S,T,每次选出T中一个可拓展的点v,将割集中连向v的边删掉,剩余的最大边权就是删去v的答案,再将v加入S原创 2017-11-29 11:08:38 · 308 阅读 · 0 评论 -
BZOJ3831: [Poi2014]Little Bird
f[i]表示从1走到i的最小劳累值 因为高度的影响至多增加1的花费,可以用单调队列,按f从小到大维护,对于f相同的优先保留大的code:#include<set>#include<map>#include<deque>#include<queue>#include<stack>#include<cmath>#include<ctime>#include<bitset>#includ原创 2017-11-29 11:04:51 · 250 阅读 · 0 评论 -
BZOJ3830: [Poi2014]Freight
可以发现如果B站的列车要选择回来一定是剩余的全部一起回来 用f[i]代表前i个列车全部回来,最后一辆列车最早回来的时刻,Ai表示第i辆列车可以发车的最早时间,有 f[i]=min(max(Ai+S,f[j]+S+i−j−1)+S+i−j−1)f[i]=min(max(Ai+S,f[j]+S+i-j-1)+S+i-j-1) =2S+2i−1+min(max(Ai−i,f[j]−j−1)−j)=2原创 2017-11-28 17:23:51 · 417 阅读 · 0 评论 -
BZOJ4386: [POI2015]Wycieczki
答案可能爆longlong,矩乘的时候<0直接返回边权只有3种,可以考虑拆点,使新图中只有边权为1的边 新建一个源S连向每个点,就可以求出路径长度为x-1的路径数量,连一条S->S的自环就可以求出<=x-1的数量,然后矩乘,a[x][y]表示x到y的长度<2^k的路径数量(注意去掉长度为0的路径 求答案本来要二分,但可以处理出矩阵的2^0,2^1,2^2..2^k次从高位向低位找有没有k种路径,原创 2017-10-02 10:31:01 · 335 阅读 · 0 评论 -
BZOJ4385: [POI2015]Wilcze doły
删的数肯定越多越好,所以可以删的区间有n个,枚举答案的右端点,维护一个单调队列,记录当前左端点到当前右端点里的可删区间的最大值,O(n)扫过去就行了code:#include<set>#include<map>#include<deque>#include<queue>#include<stack>#include<cmath>#include<ctime>#include<bitse原创 2017-10-02 10:24:35 · 260 阅读 · 0 评论 -
BZOJ4384: [POI2015]Trzy wieże
可以先把只有一种字符的情况算出来 然后考虑没有任意两个字符数目相同的情况 考虑三种字母的前缀和x,y,z,然后差分 则当 X-x=Y-y Y-y=Z-z Z-z=X-x 这三个条件有一个满足时i+1~j的串不能贡献 移项得 (x-y,y-z,z-x)三元组 当三元互不相同时可以产生贡献 对第一维排序,树状数组以第二维为下标,维护前缀后缀的最大值,最大值的第三维,和最大值第三维不同原创 2017-10-01 11:57:33 · 339 阅读 · 0 评论 -
BZOJ4383: [POI2015]Pustynia
是个很裸的差分约束? 如果有限制x>y 可以连一条边x->y,-1 代表y<=x-1 即 x>y注意到k个数把区间划分成了k个区间,对于每个限制,新建一个点,k个特殊的数向其连边-1,它向k个区间连边0 线段树优化建图 建好图后如果不是DAG说明有负环,无解 否则是个DAG,令f[x]表示x最大能取到的值,dp f值 如果一个固定了值的位置,他的f值< 它的值,也无解code:#inc原创 2017-10-01 11:51:13 · 477 阅读 · 0 评论 -
BZOJ1139: [POI2009]Wie
分成2^p层跑最短路…code:#include<set>#include<map>#include<deque>#include<queue>#include<stack>#include<cmath>#include<ctime>#include<bitset>#include<string>#include<vector>#include<cstdio>#include<原创 2017-12-11 18:46:07 · 314 阅读 · 0 评论 -
BZOJ3837: [Pa2013]Filary
当m=2时,k至少为n/2 所以序列中的每一个位置都有至少1/2的概率在k个数中 随机一个序列的位置i,计算i在k个数中时,k的最大值 计算其他n-1个数和a[i]的差b[j],另外k-1个数的b[j]的gcd>1,那么将gcd分解质因数后,任意一个分解出来的p[i]都可以代表k个数 于是将b[j]分解质因数,维护每个p[i]在多少个b[j]中出现,最大的p[i]就是k,要计算m的最大值,容原创 2017-12-03 16:33:22 · 767 阅读 · 0 评论 -
BZOJ1130: [POI2008]POD Subdivision of Kingdom
直接搜感觉会T折半搜一下,meet in middle,位运算可以省掉一个ncode:#include<set>#include<map>#include<deque>#include<queue>#include<stack>#include<cmath>#include<ctime>#include<bitset>#include<string>#include<vector>原创 2017-12-08 10:11:47 · 349 阅读 · 0 评论 -
BZOJ1129: [POI2008]Per
模数m不是质数很麻烦qwq 先把他分解成m=∏Mi=1pikim=∏i=1Mpikim=\prod_{i=1}^Mpi^{ki} 用每个pikipikipi^{ki}做模数计算最后EXCRT合并那么现在模数Mod=pikiMod=pikiMod=pi^{ki} 计算s的排名,按位枚举i,计算1~i-1位与s相同,第i位< s的序列数,最后+1 令p[i]表示位置i在序列里排第p[...原创 2017-12-08 10:09:24 · 828 阅读 · 2 评论 -
BZOJ1128: [POI2008]Lam
因为互质有很多美妙方便的性质,所以推一下可以弄出答案的柿子 ansi=1ai∏nj=i+1aj−1ajansi=\frac{1}{ai}\prod_{j=i+1}^n\frac{aj-1}{aj} 于是这个分子分母会非常大…要写高精 因为要最简,需要资瓷一下高精和单精取gcd,因为有(a,b)=(a,bModa)(a,b)=(a,bModa ),写个高精模单精后直接gcd就行了 然后资瓷一下原创 2017-12-08 09:59:40 · 320 阅读 · 0 评论 -
BZOJ1127: [POI2008]KUP
先考虑单个格子 如果有某个格子的值在[k,2k]可以直接输出 如果在[2k+1,+∞),因为所有元素非负,这个格子一定不能选,把这个格子标记出来 于是最终的矩形一定全部由< k的元素组成 若这个矩形的和>2k,我们将他分割成2个矩形,不可能和都< k,所以我们不断分割一定能构造出一个合法答案 于是找出原矩阵中不含标记点的极大子矩阵,若他的和#include<set>#include<ma原创 2017-12-08 09:53:04 · 435 阅读 · 0 评论 -
BZOJ1126: [POI2008]Uci
因为出发点是在左下角,每次只能右转,所以走的一定是个顺时针,不能走已走过的位置限制了剩余能走的区域一定是个矩形 f[l][r][d][u][0 to 3]f[l][r][d][u][0\ to\ 3]表示当前能走的矩形区域的四条边的位置和当前的方向,因为矩形确定了,方向确定了,当前位置其实也就确定了所以不用记录当前位置 数组开不下这么大,但注意到按照dp的顺序,l是递增的,可以滚动掉这一维 转原创 2017-12-08 09:47:55 · 470 阅读 · 0 评论 -
BZOJ1125: [POI2008]Poc
我是真的没有任何码力可言qwq splay维护串的hash值 每次更改hash值,在splay上给所有那个值的点打个答案标记 特殊处理交换同一个串code:#include<set>#include<map>#include<deque>#include<queue>#include<stack>#include<cmath>#include<ctime>#include<bit原创 2017-12-08 09:42:31 · 509 阅读 · 0 评论 -
BZOJ1124: [POI2008]枪战Maf
发现这是若干个基环内向树和若干个环 最坏情况下: 一个单独的环死剩1个 一个基环内向树死剩入度为0的点 最优情况下,显然按照拓扑序开枪死的人最少,模拟一下就行了注意特判一个单独的自环qwqcode:#include<set>#include<map>#include<deque>#include<queue>#include<stack>#include<cmath>#inclu原创 2017-12-08 09:39:51 · 340 阅读 · 0 评论 -
BZOJ1122: [POI2008]账本BBB
每次取反序列的和改变2,旋转和不变 根据原始序列的和,q-p可以算出至少要取反的次数,如果额外的次数记作花费,产生花费只可能是因为某个前缀和<0 预处理1~i,i~n前缀和的最小值,因为至多旋转n-1次,枚举旋转次数,算粗前缀和最小的位置,保证这个位置>=0就可以保证序列合法,算一下花费什么的code:#include<set>#include<map>#include<deque>#in原创 2017-12-08 09:36:14 · 428 阅读 · 0 评论 -
BZOJ2525: [Poi2011]Dynamite
我想O(n)但是好像不太行? 于是二分一下答案 贪心的取标记点,每个标记点让他的层数尽量浅以对其他子树产生贡献 f[i]表示i的子树一定要多少个标记点,g[i]表示i的子树内最浅的标记点的层数,d[i]表示i的子树内未被覆盖的最深的点的层数 贪贪贪,dp一下 有一些细节qwqcode:#include<set>#include<map>#include<deque>#include<原创 2017-12-06 21:22:08 · 267 阅读 · 0 评论 -
BZOJ1140: [POI2009]KOD 编码
ORZ题目要求的是任意一个字符的后缀+若干个字符+这个字符后一定走回根的字符 因为最优编码树深度不超过log层qwq,所以可以打两个标记搜…第一个标记是这个点是不是一个后缀+若干个字符 先搜一遍所有点的后缀,打上这个标记,然后从这些标记点开始走,走任意一个字符,如果走完了这个字符,这个标记点没有走到根,这个字符就是不合法的,同时如果此时走到的位置没有标记,就可以打上第一个标记加入队列 第二个标原创 2017-12-14 08:18:00 · 370 阅读 · 0 评论 -
BZOJ3829: [Poi2014]FarmCraft
贪贪贪的题我都不是很会会啊qwqf[i]代表从i开始走i的子树,最晚装完机的妹子什么时候装完,g[i]代表走完i的子树需要多少时间 对于转移,因为每条边只能走2次,走了一棵子树就一定要走完,对于一棵子树j,f[j]-g[j]是走完这棵子树,装机多出来的空闲时间,肯定要尽量利用这些空闲时间,所以按照f[j]-g[j]从大到小走子树转移code:#include<set>#include<map>原创 2017-11-25 07:47:59 · 349 阅读 · 0 评论 -
BZOJ3828: [Poi2014]Criminals
对于每个位置i,在他左端匹配A序列,使序列的开头lp[i]尽量大,在他右段倒着匹配B序列,使开头rp[i]尽量小,若这个位置的颜色c[i]是2个序列最后一个颜色且1~lp[i]-1,rp[i]+1~N有相同颜色这个位置就可以作为相遇点lp[i]可以正着扫过去,p[j]记录匹配到A序列第j个位置,开头最大到哪里,当前颜色c[i]若在A序列的第id个位置出现,若id=1,直接更新p[1],否则若p[id原创 2017-11-25 07:40:44 · 379 阅读 · 0 评论 -
BZOJ1141: [POI2009]Slw
好神呀…手玩一下发现这个H(s)生成的串有个斐波那契的递推式 emmmmm然后我就啥都不会了….我们定义G(s)为H(s)的逆变换,即H(a)=b,G(b)=a 那么对于s中的每个1,如果后面是0,他会变成1,否则变成0 发现我们要验证s是否是S的子串,这个问题等价于验证G(s)是否是G(S)的子串 我们可以不断对s做逆变换,让他越来越短我们先来证几个结论 1:HnH_n的偶数项最后一位是原创 2017-12-12 20:57:57 · 288 阅读 · 0 评论 -
BZOJ3827: [Poi2014]Around the world
将一段延伸到尽可能接近d,设其长为L,发现n个开头的走法在这一段内都会占据L个位置中的一个,根据这个性质就可以dp了 把环拉成链,倍长,对n+1~2n做dp,st[i]表示走到i,起点是哪个点,f[i]表示st[i]走到i需要的最少步数,f[i]=min f[j]+1 (s[i]-s[j]<=d)code:#include<set>#include<map>#include<deque>#i原创 2017-11-23 18:31:13 · 377 阅读 · 0 评论 -
BZOJ3526: [Poi2014]Card
一开始没读懂题意以为操作之间互不影响….然后写了个长长的st表WA了..用a[i][0/1]代表第i个卡片的正反面,线段树上每个点维护一个v[0/1][0/1]表示这个区间左右卡片的状态,在这个状态下这个区间是否能合法code:#include<set>#include<map>#include<deque>#include<queue>#include<stack>#include<cm原创 2017-11-23 18:28:54 · 250 阅读 · 0 评论 -
BZOJ3521: [Poi2014]Salad Bar
维护p-j的前缀和sum[i],那么一段l~r合法的充要条件是sum[l]<=sum[l~r],sum[r]>=sum[l~r],即中间的所有sum都>=sum[l],<=sum[r] 如果枚举了右端点r,i为r左边第一个i满足sum[i]>sum[r] ,令L=i+1,问题变成找L~r的sum最小值 可以rmq,用并查集离线做rmq可以O(n),具体来说,维护每个位置i~r的rmq,那么1~r原创 2017-11-23 18:25:41 · 352 阅读 · 0 评论 -
BZOJ3872: [Poi2014]Ant colony
因为下取整可以合并,即a/b/c=a/bc,且我们只关心经过某一条边< s,t>的蚂蚁,将树以< s,t>为界砍成两棵树,分别以s,t为根,那么我们只关心这两棵树的叶子到根上方时,有多少个k 对于子树中的叶子i,他走到根上方的分母f[i]已经确定,可以做个简单的dp求,这个叶子的贡献就是g[j]/f[i](下取整)=k的蚂蚁,即g[j]在[ k∗f[i],(k+1)∗f[i] )[\ k*f[i]原创 2017-12-03 16:38:40 · 442 阅读 · 0 评论 -
BZOJ4382: [POI2015]Podział naszyjnika
维护最小差的时候没更新….随便画一个环手玩,发现对于每种颜色,两个分隔点一定是在这种颜色某两个点中间,我们用每种颜色对这些点标号,每个点有k个标号,可以发现如果两个分割点标号相同,他们就能作为一组答案,hash就行了(貌似单hash会被卡code:#include<set>#include<map>#include<deque>#include<queue>#include<stack>#原创 2017-09-30 09:04:18 · 483 阅读 · 0 评论 -
BZOJ4379: [POI2015]Modernizacja autostrady
画个图意会一下,对于每条边,砍掉它后再把这两棵树接起来,新树的最小直径是两棵树最大直径/2(上取整)的和+1,最大值是直径的和 所以对于每条边都求出它分开的两棵树的直径,找到最小最大值后随便搜一下就行了 emmmmmmmmmmmmmmm dp的过程细节挺爆炸的code:#include<set>#include<map>#include<deque>#include<queue>#in原创 2017-09-30 07:30:44 · 425 阅读 · 0 评论 -
BZOJ4380: [POI2015]Myjnie
因为每个人不洗车的条件是最小价格大于c[i],所以易知最后每家店的价格都是c[i]一定有一种方案使得所有人花的钱总和最大 那么就和c[i]的具体数值无关,先把它离散化 然后因为一个人决策的标准和区间的最小值有关,将c[i]引入状态定义, 定义f[i][j][c]代表i∽ji \backsim j的最小值为cc,这个区间包含的人花的钱最多是多少,枚举左端点DP于是枚举i∽ji \backsim原创 2017-04-11 19:50:15 · 1410 阅读 · 0 评论