11 2019 档案

摘要:询问相当于要求长度为k的公共子串个数,很容易联想到hash,由于询问是对全局的,因此对全局开一个hash的桶对于合并/删除操作,将中间新产生/需要删除的字符串暴力修改即可,单次复杂度最坏为$o(k^{2})$这样看上去复杂度是$o(nk^{2})$的,但考虑最终的字符串总数$o(nk)$,删除操作最 阅读全文
posted @ 2019-11-27 18:01 PYWBKTDA 阅读(140) 评论(0) 推荐(0) 编辑
摘要:暴力枚举$2^{d}$表示这d个点中一定不选A或一定不选B(那么就包含了所有情况),然后就对原图跑2-sat即可注意一个细节,如果某一条限制中初始点不合法,就不用管了;如果最终点不合法,那么相当于初始点不能选,可以用向同类连边的方式来标记一定不能选 1 #include<bits/stdc++.h> 阅读全文
posted @ 2019-11-27 18:00 PYWBKTDA 阅读(98) 评论(0) 推荐(0) 编辑
摘要:考虑暴力,即需要考虑如何实现$\pm 2^{k}$,相当于要找到之后的第一个0或者之前的第一个1(维护区间是否全0/1即可),然后区间重置,可以用线段树维护,复杂度为$o(900n)$(a的划分和线段树),无法通过但由于数据范围很大,这样过不了,可以想到压位,每30位二进制压为一个数,那么复杂度降为 阅读全文
posted @ 2019-11-26 15:21 PYWBKTDA 阅读(114) 评论(0) 推荐(0) 编辑
摘要:暴力dp,用f[i][j]表示前i个数,最后一个区间是(j,i]的最小答案,转移方程用可以用前缀和来优化,复杂度为$o(n^3)$(然后可以各种优化到$o(n^2)$,但这不需要)输出f[i][j],可以发现若f[i][j-1]和f[i][j]合法,那么$f[i][j]\le f[i][j-1]$证 阅读全文
posted @ 2019-11-20 22:03 PYWBKTDA 阅读(146) 评论(0) 推荐(0) 编辑
摘要:考虑枚举一个点k,求其为重心的方案数暴力的做法是,将其作为根搜索,设最大子树大小为s1,次大为s2,对割掉的子树分类讨论:1.在子树中,分两种情况(都可以用线段树合并来做) (1)从s1中切掉一棵大小为s3的子树,应该满足$2max(s2,s1-s3)\le n-s3$,即$2s1-n\le s3\ 阅读全文
posted @ 2019-11-20 14:33 PYWBKTDA 阅读(255) 评论(0) 推荐(0) 编辑
摘要:考虑将武器(a,b)看成一条无向边,那么对于一个连通块1.当没有环,即是一棵树,那么任选一个点作为根,每条边只选儿子节点即可,显然根要选编号最大的2.当有环,任选一个环作为根,其余环上的某一条边拆掉使得变成基环树,树边选择儿子,环边按某种顺序选择即可那么题目相当于要求维护每一个树连通块的最小的最大编 阅读全文
posted @ 2019-11-17 06:54 PYWBKTDA 阅读(85) 评论(0) 推荐(0) 编辑
摘要:容易发现幸运数字只有1024个,暴力标记倍数还是会tle的 容斥,即从中任选i个的lcm,复杂度为$o(2^1024)$ 剪枝一:当答案超过1024就不用算了 剪枝二:当某个数是另一个数的倍数时就删掉 (另外求lcm可能会爆long long,由于爆了long long一定不合法,因此可以用除法来判 阅读全文
posted @ 2019-11-16 21:26 PYWBKTDA 阅读(139) 评论(0) 推荐(0) 编辑
摘要:由于价格是单调递增的,因此可以直接建立Si条边,流量和价格依次为给定的函数即可(如果价格不递增,可以考虑动态加边等操作) 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 1005 4 struct ji{ 5 int nex, 阅读全文
posted @ 2019-11-16 16:47 PYWBKTDA 阅读(106) 评论(0) 推荐(0) 编辑
摘要:先考虑选出k个后答案最小会是多少,容易发现其实就是所有的gcd(就是$ax+by=gcd(a,b)$的推广)然后相当于要最大化gcd,反过来可以将所有数的约数都打上+1标记,+1标记不少于k个且最大的数就是答案,由于值域较大,需要用map来维护 1 #include<bits/stdc++.h> 2 阅读全文
posted @ 2019-11-16 06:34 PYWBKTDA 阅读(112) 评论(0) 推荐(0) 编辑
摘要:第i次购物的花费是i元,那么意味着可以理解为消费要加上次数,因此预处理抽出i张牌后,抽出剩余n-i张牌的期望次数,设g[i]表示这个期望,那么有方程$g[i]=((n-i)*g[i+1]+i*g[i])/n+1$,化简得到$g[i]=g[i+1]+n/(n-i)$然后即可求出f[i]表示抽出i张牌后 阅读全文
posted @ 2019-11-15 21:36 PYWBKTDA 阅读(82) 评论(0) 推荐(0) 编辑
摘要:再随机生成一个n*1的矩阵D,若$A*B=C$,则显然有$A*B*D=C*D$,根据结合律,又有$A*(B*D)=C*D$由于(n*n)*(n*1)的复杂度是$o(n^2)$的,因此暴力乘法即可(程序的做法是判断乘起来的矩阵所有数字之和与C是否相同,即求$a[i][k]*b[k][j]$,对a的每一 阅读全文
posted @ 2019-11-15 20:57 PYWBKTDA 阅读(170) 评论(0) 推荐(0) 编辑
摘要:考虑建立一棵线段树,维护:1.左端点的连续1和;2.右端点的连续1和;3.最长1的连续子序列;4.1的个数;5.将0和1交换后上面的四项;6.懒标记具体实现中,需要注意细节,可以看代码(比较短) 1 #include<bits/stdc++.h> 2 using namespace std; 3 # 阅读全文
posted @ 2019-11-15 20:29 PYWBKTDA 阅读(99) 评论(0) 推荐(0) 编辑
摘要:二分枚举答案,假设是ans,考虑判定答案从前往后计算,算出每一个将军与第一个将军最少和最多有多少个相同的奖牌,贪心转移即可 1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,a[20005]; 4 bool pd(int k){ 5 i 阅读全文
posted @ 2019-11-15 14:17 PYWBKTDA 阅读(132) 评论(0) 推荐(0) 编辑
摘要:对于这n个函数,构成了$n(n-1)/2$个交点,对交点离散后,相邻两个交点间函数的编号构成了一个排列,而每一个排列第i个数所构成的段数就是第i层的段数不妨设初始在-oo处这个排列是1,2,……,n,那么每经过一个交点可以看成是交换两个函数的编号,如果把先小后大看成逆序对,那么相当于是一个不断消除逆 阅读全文
posted @ 2019-11-15 13:53 PYWBKTDA 阅读(98) 评论(0) 推荐(0) 编辑
摘要:很有趣的一道题目,如何让一个程序输出自身如果用字符串s表示程序,那么意味着可以通过s来输出sprintf是一个可以利用的函数,相当于要求printf(s,s)输出的就是s那么只需要在s中加入%c和%d等东西就可以实现这一问题了 1 #include <stdio.h> 2 char s[1005]= 阅读全文
posted @ 2019-11-15 11:11 PYWBKTDA 阅读(175) 评论(0) 推荐(0) 编辑
摘要:用f[i][j][k]表示s1前i个字符、s2前j个字符的LCS且包括s3前k个字符的最长前缀,然后对其某一维滚动,实现时细节比较多 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 505 4 int l1,l2,l3,f[2 阅读全文
posted @ 2019-11-15 07:47 PYWBKTDA 阅读(140) 评论(0) 推荐(0) 编辑
摘要:考虑最小割,即最少要去掉多少收益先S向所有机器连边,流量为购买费用;所有机器向工作连边,流量为租借费用;工作向T连边,流量为收益那么对于每一个工作,要么割掉连向T的边,要么购买/租借所有机器,同时由于购买了就一直可以用,所以购买费用直接连向S 1 #include<bits/stdc++.h> 2 阅读全文
posted @ 2019-11-14 19:45 PYWBKTDA 阅读(102) 评论(0) 推荐(0) 编辑
摘要:这个距离就是切比雪夫距离,有一个神奇的东西是说将(x,y)变成(x+y,x-y),然后就是曼哈顿距离,因此转化后对x坐标和y坐标分别统计排序和求和(求前缀和预处理+二分) 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 100 阅读全文
posted @ 2019-11-14 16:23 PYWBKTDA 阅读(109) 评论(0) 推荐(0) 编辑
摘要:树链剖分,考虑用线段树维护左端点颜色、右端点颜色和段数,合并时判断中间两个点能否重合即可,注意在树剖时合并的顺序 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 100005 4 #define L (k<<1) 5 #def 阅读全文
posted @ 2019-11-14 12:24 PYWBKTDA 阅读(112) 评论(0) 推荐(0) 编辑
摘要:dp,用f[i]表示i划分的方案,直接枚举最后一个数是错误的,因为会导致c重复计数,然后正解十分神奇——当i为奇数,那么分解中一定有1,因此f[i]=f[i-1]当i为偶数若有1,同样转移到f[i-1];没有1,可以将所有因数除以2,即f[i]=f[i-1]+f[i/2],注意对1e9取模 1 #i 阅读全文
posted @ 2019-11-13 17:34 PYWBKTDA 阅读(93) 评论(0) 推荐(0) 编辑
摘要:按照Di排序,从小到大枚举物品,考虑如果直接能选就选上,不能选就考虑替换之前价值最小的来选(显然一定是可行的,只需要在原来选价值最小的时候选这个就行了),这个东西用堆来维护即可 1 #include<bits/stdc++.h> 2 using namespace std; 3 struct ji{ 阅读全文
posted @ 2019-11-13 15:38 PYWBKTDA 阅读(111) 评论(0) 推荐(0) 编辑
摘要:初始如果没有限制,很显然每一头牛高度都是h当只有一个限制,让h[a]到h[b]的高度都减1即可容易发现两个限制不会相交(否则必然矛盾),只会包含或相离,因此没有影响,直接差分/线段树即可(注意:1.不保证a<b;2.可能会有重复) 1 #include<bits/stdc++.h> 2 using 阅读全文
posted @ 2019-11-13 15:12 PYWBKTDA 阅读(135) 评论(0) 推荐(0) 编辑
摘要:很显然是一个最小割的模型,将网格图黑白染色分为两类,黑的向S连工业费用,向T连商业费用,白的反过来即可然后对于相邻的点,连上两个点的C之和(因为会产生两个),当然也可以变成两条边,就不需要存下C矩阵了 1 #include<bits/stdc++.h> 2 using namespace std; 阅读全文
posted @ 2019-11-13 11:55 PYWBKTDA 阅读(150) 评论(0) 推荐(0) 编辑
摘要:构建一棵trie树,然后每一个点的次数*深度取max即可(然而这道题并没有这么简单)首先字符串长度为500000,字符类型52种,需要用邻接表存储(用map就别想了)然后字符串的读入十分麻烦,需要用getchar来读入,还要判掉多余回车最后还有点卡常,要注意常数 1 #include<bits/st 阅读全文
posted @ 2019-11-13 10:23 PYWBKTDA 阅读(122) 评论(0) 推荐(0) 编辑
摘要:根据purfer序列的原理,每一个purfer序列都一一对应了一棵树,每一个点在purfer序列中出现的次数就是它的度数,那么直接用组合数去计算即可,注意要加高精度 1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 str 阅读全文
posted @ 2019-11-13 09:47 PYWBKTDA 阅读(128) 评论(0) 推荐(0) 编辑
摘要:考虑将奶牛和牧草放在一起,根据鲜嫩程度排序,那么显然就可以发现一个贪心策略:每一头奶牛一定选择当前剩余的最便宜且符合条件的牧草,然后用一个set维护价格即可 1 #include<bits/stdc++.h> 2 using namespace std; 3 struct ji{ 4 int id, 阅读全文
posted @ 2019-11-13 09:30 PYWBKTDA 阅读(109) 评论(0) 推荐(0) 编辑
摘要:先考虑边的代价,容易发现每一条边都需要走两次,也就是2*边权再考虑点的代价,由于上面的结论,那么就是度数*点权然后就可以构造新的边权为2*原边权+连接点的点权,然后求最小生成树即可注意根还有一个点权,所以再加上根(也就是最小点)的点权即可 1 #include<bits/stdc++.h> 2 us 阅读全文
posted @ 2019-11-13 07:45 PYWBKTDA 阅读(152) 评论(0) 推荐(0) 编辑
摘要:记每一个数向比他大的数合并时的代价为这个数字的代价,显然除了最大值以外,每一个数都有一个代价,那么这个代价和就是最终答案考虑最小化这个代价和,也就是让每一个数的代价最小,显然这个代价不会小于向左和右第一个比他大的数中较小的数,然后这样的方案也很好构造,这个东西用单调栈来处理即可 1 #include 阅读全文
posted @ 2019-11-13 07:24 PYWBKTDA 阅读(116) 评论(0) 推荐(0) 编辑
摘要:ans肯定不会超过n,因为我们可以每一列都放一个矩阵考虑减小答案,肯定是要放横的,也就是让两个高度一样的矩阵同时被消除掉,那么中间不能存在比他们低的矩阵问题即判断一个点之前第一个小于等于它的点是不是等于他(等于就ans-1),然后用单调栈维护之前的递减即可 1 #include<bits/stdc+ 阅读全文
posted @ 2019-11-12 21:27 PYWBKTDA 阅读(94) 评论(0) 推荐(0) 编辑
摘要:问题相当于要求每一个在学校的人都能睡在某一张认识的在校生的床上,很显然是二分图匹配,将在学校的人(不是在校生或不回家)与床(在校生且认识或本人)连边,判断是否有完美匹配即可(注意连边和清空) 1 #include<bits/stdc++.h> 2 using namespace std; 3 #de 阅读全文
posted @ 2019-11-12 20:29 PYWBKTDA 阅读(129) 评论(0) 推荐(0) 编辑
摘要:用f[i][j]表示完成前i个任务,在A机器上加工j小时时B机器上最少要工作多小时,转移就分为三种,即$f[i][j]=min(f[i-1][j-t1],f[i-1][j]+t2,f[i-t3]+t3)$,然后这个东西可以用类似于背包的方式优化到1维(注意要从大到小枚举) 1 #include<bi 阅读全文
posted @ 2019-11-12 20:05 PYWBKTDA 阅读(148) 评论(0) 推荐(0) 编辑
摘要:先考虑如何判定一个r*c的矩阵是否符合条件,容易发现左上角的点无法被别的矩阵砸到,要求左上角r*c的矩阵中不能超过最左上角的元素,之后同理不断枚举最上&最左的非0点,可以用差分来优化,复杂度为$o(n^{4})$(n和m同阶)(然后加上一些整除、倒序枚举的剪枝就可以过了)正解是这样的,枚举1*c的最 阅读全文
posted @ 2019-11-12 15:58 PYWBKTDA 阅读(119) 评论(0) 推荐(0) 编辑
摘要:先求出任意一棵最小生成树,然后对边分类讨论1.非树边,答案即最小生成树的环上的最长边2.树边,反过来考虑,相当于对于每一个点对那条路经打上标记,取min对于1直接用倍增维护即可,对于2可以用树链剖分/差分+启发式合并但都需要两个log,所以有一种很神奇的做法考虑从小到大枚举非树边,然后暴力修改,容易 阅读全文
posted @ 2019-11-12 15:46 PYWBKTDA 阅读(295) 评论(0) 推荐(0) 编辑
摘要:首先用到bzoj2456的做法,因为要求这个数出现次数超过了一半,如果其与不同的数两两相消的话最终一定会剩下自身(如果不保证存在可能会剩下别的,但保证存在了只会剩下自身),然后再用可持久化线段树维护即可 1 #include<bits/stdc++.h> 2 using namespace std; 阅读全文
posted @ 2019-11-12 07:53 PYWBKTDA 阅读(308) 评论(0) 推荐(0) 编辑
摘要:观察样例,令f(n)表示n拆分的答案,猜想$f(n)=3f(n-3)$,当$n\le 4$时$f(n)=n$取3的原因是因为对于给定的$x+y$,当$4<x+y$,显然有$3^{x+y-3}$最大,否则直接取$x+y$即为最大值,也就是给出的递推式 1 #include<bits/stdc++.h> 阅读全文
posted @ 2019-11-11 17:54 PYWBKTDA 阅读(132) 评论(0) 推荐(0) 编辑
摘要:如果把这个矩阵看成一张图,题目相当于要求每一个点的入度和出度都是1(也就是有很多环),否则指向环的点就无法走回自己了将所有点拆成两个,S向原来的点流(1,0)的边,拆出来的点向T连(1,0)的边,然后每一个点指向初始方向上的点(1,0)的边,指向非初始方向上(1,1)的边,求最小费用最大流即可(也就 阅读全文
posted @ 2019-11-11 16:11 PYWBKTDA 阅读(124) 评论(0) 推荐(0) 编辑
摘要:用一种类似于hash的做法(就是比较假可能会被卡的做法),维护区间最小值、最大值和区间和,根据这些信息来判断是否矛盾即可当然还有比较严谨的方法,维护区间min、区间max、区间相邻两数的gcd和区间pre的max,这样就可以保证答案的正确性 1 #include<bits/stdc++.h> 2 u 阅读全文
posted @ 2019-11-11 15:38 PYWBKTDA 阅读(72) 评论(0) 推荐(0) 编辑
摘要:kruskal重构树,求出最小生成树,然后不断加边并新建节点作为两个联通块原根节点的父亲节点并作为新联通块的根(类似于不路径压缩的并查集),这样一来满足每一个节点所代表的边(除叶子节点外)父亲总时比儿子大,因此询问即在该重构树上的某一段点的第K大,用可持久化线段树维护,同时还要用倍增来确定该段的根节 阅读全文
posted @ 2019-11-11 14:25 PYWBKTDA 阅读(107) 评论(0) 推荐(0) 编辑
摘要:对每一个节点开一颗权值线段树维护打的标记(x+,y+,lca(x,y)-,fa[lca(x,y)]-),然后每一个节点将子树内所有节点(其实就是已经合并过的儿子)合并即可。(毒瘤的是这道题需要将物品离散化一下否则会爆栈,当然也可以写bfs) 1 # pragma comment(linker, /S 阅读全文
posted @ 2019-11-11 14:12 PYWBKTDA 阅读(100) 评论(0) 推荐(0) 编辑
摘要:对棋盘黑白染色后,若n和m都是奇数(即白色和黑色点数不同),可以直接算得答案(根据白-黑不变);若n和m不都是奇数,二分答案(二分的上限要大一点,开$2^50$),最后都要用用网络流来判定。考虑判定,将白色点放在左边,黑色点放在右边,源点流向白点的流量是白点与答案的差,黑点流向汇点的流量是黑点与答案 阅读全文
posted @ 2019-11-11 13:10 PYWBKTDA 阅读(119) 评论(0) 推荐(0) 编辑
摘要:二分图的充要条件是存在奇环,对其线段树分治,用按秩合并并查集维护即可(注意自环) 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 200005 4 #define L (k<<1) 5 #define R (L+1) 6 #d 阅读全文
posted @ 2019-11-11 12:53 PYWBKTDA 阅读(100) 评论(0) 推荐(0) 编辑
摘要:容易发现a2一定是分母,且容易做到其余都是分子,因此相当于判定a2能否整除a1*a3*……*an,不断让a2除以其与其他数的gcd即可(注意特判n=1) 1 #include<bits/stdc++.h> 2 using namespace std; 3 int t,n,s,x; 4 int gcd 阅读全文
posted @ 2019-11-11 12:12 PYWBKTDA 阅读(96) 评论(0) 推荐(0) 编辑
摘要:首先发现当n堆石子可以两两配对时,后手必胜,因为后手可以模仿先手那么当n堆石子不能两两配对时,先手必胜,因为先手可以做到让其两两配对,然后即先手必胜 这个东西用map维护即可 1 #include<bits/stdc++.h> 2 using namespace std; 3 map<int,int 阅读全文
posted @ 2019-11-11 11:30 PYWBKTDA 阅读(164) 评论(0) 推荐(0) 编辑
摘要:考虑最坏的做法,就是将所有集合合并起来再拆开,需要n+m-2次当两个的某一个子集和相同时,这个子集和单独处理,不与整体合并,可以减少2次那么题目转化为询问有最多能选出多少个不相交的子集对,满足子集和相同状压dp,用f[S1][S2]表示从S1和S2中选,那么分为两种情况考虑:1.S1的和等于S2的和 阅读全文
posted @ 2019-11-11 11:00 PYWBKTDA 阅读(96) 评论(0) 推荐(0) 编辑
摘要:考虑如果没有k个人,那么就是裸的二分答案+最大流对于这k个人,再在原来的每一个点裂点,中间的流量为k,然后裂出来的点向所有不能匹配的点连边,再二分答案+最大流即可 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 205 4 s 阅读全文
posted @ 2019-11-11 10:38 PYWBKTDA 阅读(114) 评论(0) 推荐(0) 编辑
摘要:容易发现所有豆子相互独立,只需要考虑每一个豆子的sg函数并异或起来即可,sg函数从后往前暴力即可 1 #include<bits/stdc++.h> 2 using namespace std; 3 int t,n,x,y,z,s,ans,a[105],sg[105],vis[105]; 4 int 阅读全文
posted @ 2019-11-11 09:32 PYWBKTDA 阅读(112) 评论(0) 推荐(0) 编辑
摘要:为了方便考虑,不妨规定只有当当前的巧克力棒都取完了,才能拿新的巧克力棒然后令先手第一个拿的集合为S,根据nim游戏,当S的xor不为0时先手(即原来的后手)必胜,又轮到先手拿集合,那么只要一直不存在xor为0的集合,先手最终就必败然后当存在xor为0的集合,那么先手必然可以做到取一个最大xor子集, 阅读全文
posted @ 2019-11-11 09:03 PYWBKTDA 阅读(111) 评论(0) 推荐(0) 编辑
摘要:将每一个点拆成500个点,表示分别表示以某个速度到这里时的最短路,然后跑最短路即可,注意距离是double类型 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 205 4 struct ji{ 5 int nex,to,len 阅读全文
posted @ 2019-11-11 08:25 PYWBKTDA 阅读(106) 评论(0) 推荐(0) 编辑
摘要:对于所有限制,都可以写成形如$di>=dj+c$的形式(等式看成两个),然后这个东西很显然就是一张图的一条边,然后求最长路即可(当c为负移项即可)由于每一个人都要有糖,所以让di初始为1并入队即可(注意:最好判掉自环,可以快很多,如果不判在spfa时应将标记清空放在前面,否则就找不到自环了) 1 # 阅读全文
posted @ 2019-11-10 17:34 PYWBKTDA 阅读(131) 评论(0) 推荐(0) 编辑
摘要:很显然是网络流,对于点的限制,拆点建流量为1的边,之后跑最小费用最大流即可(由此很显然可以发现原图边的流量也只需要1) 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 405 4 struct ji{ 5 int nex,to 阅读全文
posted @ 2019-11-10 16:22 PYWBKTDA 阅读(87) 评论(0) 推荐(0) 编辑
摘要:第一问直接最大流即可,记这个最大流为ans第二问可以在原图的基础上,初始边费用为0,新增费用为w流量为inf的边,新增0号点向1流一条流量为ans+k,费用为0的边,跑最小费用最大流即可考虑这个过程中,由于费用都为正,所以一定先走费用为0的边,相当于现求最大流,所以可以直接在残余网络上加入费用为w, 阅读全文
posted @ 2019-11-10 16:14 PYWBKTDA 阅读(150) 评论(0) 推荐(0) 编辑
摘要:最小割,考虑最小割就是要将整张图分为两块,本题中就分别表示赞同和不赞同,那么首先一开始赞同的点向S连边,不赞同的点向T连边,如果这些点分到了另一边就要割掉这条边,朋友关系同理,连双向边同样表示分到两边要割掉这条边,跑最小割=最大流即可 1 #include<bits/stdc++.h> 2 usin 阅读全文
posted @ 2019-11-10 14:12 PYWBKTDA 阅读(128) 评论(0) 推荐(0) 编辑
摘要:考虑每一个位置最多开6次左右就会变成1,然后操作就没有意义了,因此对线段树维护区间和和一个标记,表示是否全部都是1,然后对于修改,如果区间标记不是1就暴力下去,是1就不用操作,复杂度为$o(6nlogn)$ 1 #include<bits/stdc++.h> 2 using namespace st 阅读全文
posted @ 2019-11-10 08:28 PYWBKTDA 阅读(124) 评论(0) 推荐(0) 编辑
摘要:记si表示前缀和,由于账本可以为负,所以si本身是没有限制的,然后每一条消息相当于让某两天的差值确定,连一条边,之后在每一次消息中,先判断两点是否连通,连通就直接判断,不连通就加上这条边即可,这个东西可以用带权的并查集来维护 1 #include<bits/stdc++.h> 2 using nam 阅读全文
posted @ 2019-11-09 12:52 PYWBKTDA 阅读(143) 评论(0) 推荐(0) 编辑
摘要:将问题和锦囊二分图匹配即可,注意当某一个不合法就要退出 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 2005 4 struct ji{ 5 int nex,to; 6 }edge[N]; 7 int E,n,m,x,y,a 阅读全文
posted @ 2019-11-09 12:12 PYWBKTDA 阅读(109) 评论(0) 推荐(0) 编辑
摘要:由于是排列,因此b一定只出现了一次,找到出现的位置并向左右扩展考虑如何判定是否满足条件,当且仅当$[左边比b小的数ls]+[右边比b小的数rs]=[左边比b大的数lb]+[右边比b大的数rb]$,暴力枚举+线段树复杂度为$o(n^2logn)$变形上式,得到$ls-lb=rb-rs$,对两边分别处理 阅读全文
posted @ 2019-11-08 16:19 PYWBKTDA 阅读(272) 评论(0) 推荐(0) 编辑
摘要:一道有趣的建图题,新建一个初始存在水的点,那么造井相当于向其连边,费用就是造井的费用,之后求最小生成树即可 1 #include<bits/stdc++.h> 2 using namespace std; 3 struct ji{ 4 int x,y,z; 5 bool operator < (co 阅读全文
posted @ 2019-11-08 16:06 PYWBKTDA 阅读(82) 评论(0) 推荐(0) 编辑
摘要:首先有一个东西叫做括号序列,即每一个点入栈加左括号,出栈加右括号容易证明,括号序列中A到B的距离是A到B中消去所有成对出现后剩余括号的数量用线段树来维护,考虑某个区间中两点的距离最大值,分为两种情况:1.点对在左区间/右区间;2.跨过区间的中点前者很好处理,来分析一下后者:容易发现消去成对的括号后剩 阅读全文
posted @ 2019-11-08 15:57 PYWBKTDA 阅读(135) 评论(0) 推荐(0) 编辑
摘要:移动可以理解为空白格的移动,问题等价于双方在一张无向图(相邻不同色点连边,起点视为黑色)移动,不能经过重复的点,无法移动者为负由于这张图是二分图,因此有结论,先手必胜当且仅当起点一定在任意一组最大匹配中证明:必要性,即先手必胜=>一定在匹配中,其等价于不在匹配中=>后手必胜,考虑一组最大匹配,容易发 阅读全文
posted @ 2019-11-08 09:01 PYWBKTDA 阅读(150) 评论(0) 推荐(0) 编辑
摘要:bzoj1068的简化版本,用f[i][j]表示表示区间i到j的最少字符数量,分为两种情况:1.某个子串重叠,枚举这个子串(注意:二位数长度为2);2.枚举断点 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define mod 998244 阅读全文
posted @ 2019-11-07 13:35 PYWBKTDA 阅读(122) 评论(0) 推荐(0) 编辑
摘要:设f[i]表示深度不超过i的方案数,那么有f[0]=1,$f[i]=f[i-1]^{n}+1$,然后用高精度即可(注意深度恰好为d还要用f[d]-f[d-1]才是答案) 1 #include<bits/stdc++.h> 2 using namespace std; 3 struct ji{ 4 i 阅读全文
posted @ 2019-11-07 13:31 PYWBKTDA 阅读(99) 评论(0) 推荐(0) 编辑
摘要:手动模拟一组样例,可以理解大致应该如何操作具体实现中,记录每一位当前应该+1还是-1,然后操作最低的位并将后面的+1和-1全部取反即可 1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,b,a[105],flag[105]; 4 voi 阅读全文
posted @ 2019-11-07 12:13 PYWBKTDA 阅读(197) 评论(0) 推荐(0) 编辑
摘要:将每一个重置为0的点作为一段,那么它会导致后面为以x x为开头的斐波拿起数列的东西,那么设这一段是以x为开头,要快速转移到下一段,就可以解决这道题目为了转移,我们要处理出下面的东西:1.求出x关于模k的逆元,也就是找到这个0原来的值,那么x*上一个数就是下一段的开头;2.通过这个值反推出这一段的长度 阅读全文
posted @ 2019-11-07 10:22 PYWBKTDA 阅读(155) 评论(0) 推荐(0) 编辑
摘要:对于每一行,用一个2^12个01来表示,其中这一行就是其中所有为1的点所代表的行(i二进制中包含的行)的max的min,然后就可以支持取max和min了,查询只需要枚举答案即可 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 阅读全文
posted @ 2019-11-06 13:09 PYWBKTDA 阅读(272) 评论(0) 推荐(0) 编辑
摘要:记一条链两端的lca为该链的lca,f[i]表示所有lca在i子树内的链的最大价值和(为方便递推,假设存在i-i的链价值为0),有递推式$f[i]=max(\sum_{son}f[son]+val)$(其中son是链上所有点的儿子且不再链上的节点,val表示该链的价值),时间复杂度为$o(n^{2} 阅读全文
posted @ 2019-11-06 09:47 PYWBKTDA 阅读(140) 评论(0) 推荐(0) 编辑
摘要:先考虑如何求出任意两数的最大差值和最小差值,直接差分约束建图跑floyd求最短路和最长路即可然后枚举i和j,考虑dA+dB和di+dj的关系,分两种情况移项,转化成dA-di和dj-dB的关系或dA-dj和di-dB的关系(只要有一个关系确定即确定)即可考虑(由于不等式都是两个变量,因此一定无法形成 阅读全文
posted @ 2019-11-05 12:52 PYWBKTDA 阅读(110) 评论(0) 推荐(0) 编辑
摘要:用f[i][j]表示到第i轮,之前取过的状态为j时之后的期望收益,枚举第i轮出现的物品,并判断能否取来转移,最终再将f[i][j]/=n即可 1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,m,x,a[105],b[105]; 4 d 阅读全文
posted @ 2019-11-05 12:04 PYWBKTDA 阅读(105) 评论(0) 推荐(0) 编辑
摘要:容易发现从当前状态到目标最少要跳不同的位置数-1,然后以此为估价函数IDA*(444ms,即先枚举答案再A*)或A*(664ms)即可 1 #include<bits/stdc++.h> 2 using namespace std; 3 int t,x,y,ans,dx[8]={-2,-2,-1,- 阅读全文
posted @ 2019-11-05 09:27 PYWBKTDA 阅读(126) 评论(0) 推荐(0) 编辑
摘要:先二分答案,然后搜索暴力判断由于数据范围较大,需要剪枝:1.当前所有可能被用到的木板长度和(长度要不小于最小所需长度)>=所要拼成的所有木板的和;2.对于需求从大到小枚举木板(这样一开始枚举次数较少,后来的情况容易被剪枝掉) 1 #include<bits/stdc++.h> 2 using nam 阅读全文
posted @ 2019-11-05 08:10 PYWBKTDA 阅读(180) 评论(0) 推荐(0) 编辑
摘要:用f[i][j][k]表示第一行前i个数,第二行前j个数选k个子矩形的答案,考虑转移:1.在第一行/第二行选择一个矩形2.当i=j时,可以选择一个两行的矩形注意要特判m=1的情况 1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,m,t 阅读全文
posted @ 2019-11-04 16:41 PYWBKTDA 阅读(121) 评论(0) 推荐(0) 编辑
摘要:考虑用状压dp枚举排列,即f[i][j]表示当前状态为i,余数为j的方案数,考虑在末尾新增一个字符来转移即可,注意最后答案要除以排列组合 1 #include<bits/stdc++.h> 2 using namespace std; 3 int t,d,n,tot[15],f[2005][1005 阅读全文
posted @ 2019-11-04 16:16 PYWBKTDA 阅读(97) 评论(0) 推荐(0) 编辑
摘要:题目即要求$Ah+Bv<=C+Aminh+Bminv$,如果同时枚举minh和minv,那么即要求$minh\le h$,$minv\le v$且$s\le C+Aminh+Bminv$从小到大枚举minh,然后答案可以理解为所有s合法-v合法且s合法,对于两个在枚举minv的时候预处理即可 1 # 阅读全文
posted @ 2019-11-04 16:04 PYWBKTDA 阅读(110) 评论(0) 推荐(0) 编辑
摘要:用f[i][j][0/1]表示区间[i,j],i之前有没有M的最少需要多少个字符,然后分两种情况:1.可以分为两个,转移到dp[l][mid][0]+1;2.枚举断点,但当前面有M时,后面的这个不能重复,因此只能写成r-k 1 #include<bits/stdc++.h> 2 using name 阅读全文
posted @ 2019-11-04 09:57 PYWBKTDA 阅读(116) 评论(0) 推荐(0) 编辑
摘要:对于同一行或同一列的点,不论如何交换都在同一行或同一列,而最终这n个点行和列各不相同,因此即要找到n个点,使得行和列不同然后对于每一个1,将所在行和所在列连边,二分图能完全匹配那么就说明存在这种方案 1 #include<bits/stdc++.h> 2 using namespace std; 3 阅读全文
posted @ 2019-11-01 16:41 PYWBKTDA 阅读(128) 评论(0) 推荐(0) 编辑
摘要:先二分答案,容易发现一定有一个正方形覆盖在角上(即有两条边在最X的地方),否则4个最X的点一定无法覆盖,然后暴力确定即可 1 #include<bits/stdc++.h> 2 using namespace std; 3 struct ji{ 4 int x,y; 5 bool operator 阅读全文
posted @ 2019-11-01 10:25 PYWBKTDA 阅读(137) 评论(0) 推荐(0) 编辑
摘要:用线段树维护区间中最大的一段连续的1,以左端点为左端点最大的一段连续的1,以右端点为右端点最大的一段连续的1,然后就可以支持区间修改和查询了 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 50005 4 #define L 阅读全文
posted @ 2019-11-01 10:09 PYWBKTDA 阅读(120) 评论(0) 推荐(0) 编辑