摘要:1.求<=k点对数,容斥法 /* 求树中距离不超过k的点对数 暴力枚举两点,lca求的复杂度是O(n^2logn),这样很多次询问都是冗余的 那么选择重心作为根,问题分成两部分,求经过重心的距离<=k的点对+不经过重心的距离<=k的点对 先来求第一部分,计算所有点的深度,排序,O(nlogn)可以计
阅读全文
摘要:Hashtable LinkedHashMap Properties
阅读全文
摘要:HashSet LinkedHashSet TreeSet 联系与区别
阅读全文
摘要:ArrayList LinkedList Vector
阅读全文
摘要:其实也不算很难想,每个元素质因子分解后的p^c的p和c用pair的形式存在每个元素vector里 要去前面找一个数使得所有指数相加是k的倍数,那么把vector里的所有c 模 k,然后去找前面互补的数的个数,可以用map存下前面元素模完k之后的vector,然后答案加一加就行 注意:如果a本身就是一
阅读全文
摘要:/* 2-type B|D^k 3-type B|D-1 11-type B|D+1 6-type B质因子分解, 7-type 其他情况 3-type: (a*(D^4-1)+b*(D^3-1)+...+d*(D-1)) % B = 0 B|(D-1) 11-type: (a*(D^4-1)+b*(D^3+1)+c*(D^2-1)+d*(D^1+1)) % B=0 B|(D^k+(-1)^k)
阅读全文
摘要:/*1+3+9+...+3^n<3^(n+1),按这个思路贪心一下就好*/#include<bits/stdc++.h> using namespace std; #define ll long long ll p[100],flag[40],s[100]; int main(){ p[0]=s[0]=1; for(int i=1;i<=39;i++) p[i]=p[i-1]*3,s[i]=s[i
阅读全文
摘要:这个复杂度首先就想到是n3的复杂度,n2枚举换的位置,求值在花费n复杂度 判断一个序列有多少独立的括号子串时用栈处理一下即可
阅读全文
摘要:首先将两个人的所有可能的操作建立成一个模型:m+2行n列的矩阵 序列A对应图上的格子(i,Ai),第0行作为起点,最后一行作为终点,每个点可以向左下,下,右下走,每种可行的情况对应图上的一条路径 推出一个性质:对于第一行每个起点,其能到达的终点范围必定是一个连续的区间 那么我们只要求出每个起点能到达
阅读全文
摘要:/* 首先开三倍消环(两倍是不够的),倒序求值,线段树找一下后继即可 */ #include using namespace std; #define N 300005 int n,a[N],ans[N]; #define lson l,m,rt>1; build(lson);build(rson); Max[rt]=max(Max[rtv)pos1=min(pos1,l)...
阅读全文
摘要:先排序,把所有x坐标相同的放到同一个vector里去,然后对每个vector里的都是二维点,很好求,然后最后再把剩下的对匹配了
阅读全文
摘要:/* 可以发现一个性质:连续两个相同色块永远不会变色 继而可以发现,这个色段每次迭代都向左向右拓展长度1,直到撞上其他扩张的色段 所以预处理出所有连续色段,然后对于所有不在色段里的点,我们可以预测其最终的颜色: 其本身每次迭代改变一次颜色,如果k>= 离其最近的那个色段到其的距离Len,那么其就会被那个色段覆盖 那么就要预处理出这些点两侧最近的色段距离和颜色 由于是...
阅读全文
摘要:排一遍序然后用l,r指针进行移动,每次移动的是靠1,或靠n更近的那个指针 ps:这题自己还开了个桶来做,并且开了桶的做法不知道为什么错在大的数据。。
阅读全文
摘要:特别简单,只有链的形式才符合要求,那么枚举前两个点的颜色搞一下就可以
阅读全文
摘要:可惜cf不能用int128,不然这个题就是个exgcd的板子题 这是exgcd的解法,但是只用ll的话会溢出 #include<bits/stdc++.h> using namespace std; #define ll long long ll x,y,z,a,b,c,d,n; ll exgcd(
阅读全文
摘要:/* 题目给定一些一维线段[li,ri],要求从这些线段里挑出一些线段,每条线段对应一个点,如果两线段相交,那么点连边,这样得到的树是good-tree 现在给定一棵树,要求从该树中选出一棵子树,使这棵子树是good-tree 显然不能有三个线段两两相交,这样就成了环 对应到good-tree的性质上,就是一个根最多连两个size>1的结点,但可以挂多个size=1的结点,非根结点最多挂一个...
阅读全文
摘要:很简单的题,ac自动机里再维护一个len表示每个状态的串长,用s去query时每到一个结点都要暴力跳fail,因为有可能这个结点不是,但是其fail是危险结点,找到一个就直接break 再用个差分数组快速统计覆盖情况即可
阅读全文
摘要:这题的状态设计非常巧妙,因为dp[S]表示的并非当前正确的值,而是维护一个中间量,这个中间量在到达末状态时才正确 当然官方的题解其实更加直观,只不过理解起来其实有点困难
阅读全文
摘要:听思维的一道题,网上大多直接模拟,感觉有点麻烦,其实只要把连续段求出来,然后处理一下统计答案就行 两个注意点:1.除了第一个连续段,其余段长度都要+1 2.因为目的地是0,所以最后一段要特判一下
阅读全文
摘要:解法看着吓人,其实就是为了优化ac自动机上暴力跳fail指针。。 另外这题对于复杂度的分析很有学习价值
阅读全文
摘要:/* 给定一棵树,每个结点最多选和其相连的k条边,问使边权和最大的策略 dp[u][0|1]用来表示u没连父边|连了父边 时u子树下的最优解 如果u不和任意一个儿子连边,那么u下的收益是tot=sum{dp[v][0]} 现在我们在其中选择一个儿子v连到u,那么 tot的增量就是 dv=dp[v][1]-dp[v][0] + w; 求dp[u][0]时,我们最多可以选择k个儿子相连,那么就...
阅读全文
摘要:先预处理一个hash[a][b]:开头字符为a, 结尾字符是b,中间的字符hash值为hs的的hash表,保存的是出现次数 对于一个子串求hash值的策略:设hash值是个26位的数,每新增一个字符,就在对应位上+1
阅读全文
摘要:/* 给定一个序列a,每次可以把值为x的所有元素放到a的首部或尾部,问将a变为lis的最少操作步数 对原序列离散化后重新打标记, 可以反着来考虑这个问题:即固定连续的元素值为[l,r]的点不动,那么剩下的所有元素值至多多进行一次操作,就可以让这个序列变成lis 所以求出这个最长合法的连续元素值段落即可 */ #include<bits/stdc++.h> using namespace std;
阅读全文
摘要:1.对象的赋值方式是引用赋值 2.继承时单根继承,子类的构造函数里,,如果没有super的构造函数,那么第一行就是super(); 3.接口不算类,无构造函数所有方法为空,方法为public,接口可以继承(多个)接口,类也可以继承多个接口,但是只能继承一个抽象类 4.非抽象类必须实现完所有的空方法,
阅读全文
摘要:复杂度是O(N^5),枚举所有小矩形,转移时再按每列,每行进行转移
阅读全文
摘要:直接枚举每条边,如果边加到图中后还是个匹配图,就直接加,反之就不加 这样加完所有边后,剩下的点必定可以组成一个独立集:因为如果剩下的点中还有互相匹配的,那么这对点应该在加边时就被算到匹配图中 所以要么是>=n的匹配图,要么是>=n的独立集,所以必定有解
阅读全文
摘要:线段树优化dp的常见套路题,就是先按某个参数排序,然后按这个下标建立线段树,再去优化dp 本题由于要维护两个数据:最小值和对应的方案数,所以用线段树区间合并
阅读全文
摘要:一开始少看了条件:相邻两个字符不相等,字符集只有abc 那么我们取开头结尾各两个字符,一定有两个是相等的
阅读全文
摘要:/* 构造 n个点的无向图,无重边自环 边数e也是质数 点的度数也是质数 */ #include<bits/stdc++.h> #include<vector> using namespace std; #define N 100005 int prime[N],m; bool vis[N]; void init(){ for(int i=2;i<N;i++){ if(!vis[i])prime[
阅读全文
摘要:/*思路就是枚举矩形下面那条先,把所有和其交叉的竖线更新进线段树,然后扫描先向上更新,遇到竖线上端点就在线段树里删掉,遇到横线就更新答案*/#include using namespace std; #define N 20005 #define ll long long struct SegV{int x,y1,y2;}v[N];//垂直线 struct SegH{int y,x1,x2...
阅读全文
摘要:#include<bits/stdc++.h> using namespace std; #define N 10005 int a[N],n,k,q; struct LB{ int b[35]; LB(){memset(b,0,sizeof b);} int check(int x){ for(int i=29;i>=0;i--)if(x>>i & 1){ if(!b[i])return 0;
阅读全文
摘要:#include using namespace std; #define ll long long #define N 1000005 #define mod 1000000007 #define P 131 char s[N],buf[N]; int n,lens; ll has[N],p[N],has1[N]; int main(){ p[0]=1; for(int ...
阅读全文
摘要:首先考虑初始排列,pi会让周围所有比其大的元素深度+1,所以要求每个点的深度,只要其被覆盖了几次即可 这个覆盖可以通过处理每个元素的左右边界(单调栈O(n))+线段树区间更新(Ologn(n))来做 然后是将排列最左边一个元素移到最右边: 在左边删元素pi,只会让pi右边所有比其大的元素深度-1,
阅读全文
摘要:这个拆边+队列操作实在是太秒了 队列头结点存的是一个存点集的vector,1到这个点集经过的路径权值是一样的,所以向下一层拓展时,先依次走一遍每个点的0边,再走1边。。。以此类推,能保证最后走出来的路径是最优的
阅读全文