03 2020 档案
摘要:有了线段树合并的基础后,很容易想到差分最后线段树合并。 这道题跟hdu上的relief grain是重题,然而我们老师却把那道题当做树剖的练手题给我们。 害得我想了好久…… 代码如下: #include<bits/stdc++.h> using namespace std; const int ma
阅读全文
摘要:线段树合并用于解决一些需要将两颗线段树合并的题目 常见于一些子树处理的题目。 动态开点,记录左右子树。 不得不说,merge的代码像极了FHQtreap inline int merge(int a,int b,int x,int y){ if(!a)return b; if(!b)return a
阅读全文
摘要:依照题目要求,即是不能从2流到1去,那么就是最小割。 从2向0,1连边,从0向0,1连边,然后跑最大流。 代码如下: #include<bits/stdc++.h> using namespace std; #define inf 1e9 const int maxn=105; const int
阅读全文
摘要:首先声明题意: 1~n的两个排列,a,b,在线询问两个区间[ l1,r1 ],[ l2,r2 ],求这两个区间内相同数字的数目。 解法: 我们不妨以a数列为基准,a[i]表示a的第i位对应的b中的位置。 那么就是在区间[ l1,r1 ]中查询有多少个数值在[ l2,r2 ]中。 不难想到权值线段树,
阅读全文
摘要:好像又叫meet in the middle 所谓双向搜索,简而言之,就是先搜一半,再搜另一半,然后试着将两半拼合。 具体看例题,你将会有更深的体会。 例题一:世界冰球锦标赛 网址:https://www.luogu.com.cn/problem/P4799 如果洛谷很卡的话,还有一个网址:http
阅读全文
摘要:思路显然,就是对每一个颜色建一棵LCT(有没有想过颜色多了怎么办) 讲一讲我从这道题里面get到的小技能。 判断连通性: if(findroot(x)==findroot(y))return true; else return false; 还有一个比较坑的地方就是它修改颜色的时候可能跟以前相同,这
阅读全文
摘要:这没什么好讲的,都是套路。 话说我的代码在本地跑得贼慢,我还以为会TLE,然后发现时限有4s 看代码: #include<bits/stdc++.h> using namespace std; const int maxn=5*1e6+10; int f[maxn],a[maxn],n,m; int
阅读全文
摘要:重构树的版子题,当然也可以用倍增或二分答案。 看代码: #include<bits/stdc++.h> using namespace std; const int maxn=1e6+10; struct node{ int x,y,z; }edge[maxn]; int n,m,q,cnt; in
阅读全文
摘要:简单的可持久化。 是刚学主席树的练手好题!! #include<bits/stdc++.h> using namespace std; const int maxn=2*1e6+10; struct node{ int l,r,val; }tr[maxn]; int n,cnt,tot,root[m
阅读全文
摘要:这是树上待修莫队的裸题。 可是我已开始应为吧cmp写错了TLE成30,呜呜…… 看代码: #include<bits/stdc++.h> using namespace std; #define int long long const int maxn=1e5+10; int n,m,q,a[max
阅读全文
摘要:这题在修改的时候略有不同,应当减去之前的贡献再加上此时的贡献。 就像这样: void add(int x){ now=now+2*cnt[a[x]]+1; cnt[a[x]]++; } void del(int x){ cnt[a[x]]--; now=now-2*cnt[a[x]]-1; } 那么
阅读全文
摘要:这几乎就是莫队板子。 是否互不相同等价于判断 now==q[i].r-q[i].l+1 。 看代码: #include<bits/stdc++.h> using namespace std; const int maxn=1e5+10; int n,m,a[maxn],cnt[maxn],ans[m
阅读全文
摘要:如果要学习莫队算法请另寻别处。 但是这里可以为您提供高质量的练习题配代码。 代码如下: #include<bits/stdc++.h> using namespace std; const int maxn=1e6+10; struct node{ int l,r,bl,br,id; }q[maxn
阅读全文
摘要:这题需要把状转方程想清楚,在动手打代码。 可能大多数人像我一样第一反应是这样的: f[x][0]=0,f[x][1]=1; for(int i=beg[x];i;i=nex[i]) if(to[i]!=fa){ dfs(to[i],x); f[x][0]+=f[to[i]][1]; f[x][1]+
阅读全文
摘要:我觉得我好像已经理解树形背包了。 套路化的树形背包。 递推公式长这样:f[i][j]=max(f[i][j],f[i][j-k]+f[t][k]); 注意f[i][0]应该在最后附为0,不然就相当于是取前m大了。 看代码: #include<bits/stdc++.h> using namespac
阅读全文
摘要:这是蒟蒻的第一道树形背包,由于不知道套路,几乎全抄的题解(惭愧)。 有点类似于CDQ分治的思想,先处理下级,然后利用下级的数据推本级。 其实我还没有理解透彻,不过贡献一下代码也是有价值的。 #include<bits/stdc++.h> using namespace std; #define in
阅读全文
摘要:这是一个树形dp入门题。 f[x][i]=max{f[lc[x]][i-1]+lw[x],f[rc[x]][i-1]+rw[x],lw[x]+rw[x]+f[lc[x]][j]+f[rc[x]][i-2-j]} 注意边界情况。 if(i==0)f[x][i]=0; if(!lc[x])f[x][i]
阅读全文
摘要:毒瘤的状压DP题。 思路非常的好想,就是枚举每一种情况,考虑他对这一行和上一行的影响,从而设状态。 我们可以通过一定的数学公式来看看到底有多少种情况。 每个点可以填竖边或者填横边或不填。 f[0]=1,f[1]=2; f[i]=2*f[i-1]+f[i-2] 算出来f[11]有一万多,要超时了,怎么
阅读全文
摘要:跟拍照几乎是重题。 在输出部分,若最后一次bfs还能到这个点,则可以输出。 只要有一个点可以从源点过得去,就可以通过正或反流到达所有经过的点。 但是我不明白若把所有项目都割掉了,那不就嘎嘎了。 这里也求广大读者说出自己的理解。 看代码: #include<bits/stdc++.h> using n
阅读全文
摘要:几乎是个板子,跟游戏几乎是重题。 将每行建点,每列建点,这样可以保证每行每列都只有一个。 格点拆掉,算个费用流就好了。 看代码: #include<bits/stdc++.h> using namespace std; #define inf 1e9 const int maxn=100005; i
阅读全文
摘要:横的联通快为入,竖的为出。 样例的图就像这样: S->a1,a2,a3,a4,a5 a1->2,3,4 a2->5 a3->7,8 a4->9,10 a5->12 5,9->b1 2->b2 10->b3 3,7->b4 4,8,12->b5 代码如下: #include<bits/stdc++.h
阅读全文
摘要:努力刷网络流找感觉ing…… 这其实是一个费用流,拆点,流量为1,费用为val。 求其最大费用流,可以转化为边权相反,求最小费用流的相反数。 看代码: #include<bits/stdc++.h> using namespace std; #define inf 1e9 int val[100][
阅读全文
摘要:个人认为思维难度比较大。 看到这题,我们要想办法将其转化为最小割。 考虑到割x,y,z都能完成任务,我们将其并联,割掉其中任意一边都行。 因为割得是权,于是以权为点,而不是以节点为点。 并且要拆点。 超级源点向x连边,x向y的入口连边,y的入口向出口连边,y的出口向z连边,z向超级汇点连边。 看代码
阅读全文
摘要:发现好像只记一行没什么太大的用了。怎么办…… 一行不行记两行呗!m=10的情况也只有60种可行方案,空间大大的有。 注意不是累加是取max…… 看代码: #include<bits/stdc++.h> using namespace std; int f[105][65][65]; int can[
阅读全文
摘要:传说这种题叫什么旅行商问题? 这题卡记搜和暴搜,注意一下…… #include<bits/stdc++.h> using namespace std; const int maxn=20; int n,vis[maxn]; double x[maxn],y[maxn],ans,dist[maxn][
阅读全文
摘要:几乎是板子。 #include<bits/stdc++.h> using namespace std; #define int long long int f[10][100][1000],ans; int n,k,cnt,iab[20],num[1000]; int can[1000],bai[2
阅读全文
摘要:将已有边权设为零,再跑kruskal…… #include<bits/stdc++.h> using namespace std; #define int long long const int maxn=50000; struct node{ int x,y,z; }a[maxn]; int n,
阅读全文
摘要:网络流搜到的,标答却是dp…… 一道紫dp!!!!!!!!!!! f[i][j]代表在前i个中随意选j段的最大值。 g[i][j]代表在前i个中在选i的前提下选j段的最大值。 h[i][j]代表在前i个中在选1的前提下选j段的最大值。 l[i][j]代表在前i个中在选1和i的前提下选j段的最大值。
阅读全文
摘要:f[i][j]表示第i行状态为j时的方案数。 pd[i]用于判断第i行的一种方法是否合法。 f[i][j]=f[i-1][k],j&k==0,j&pd[i]==0,k&pd[i-1]==0 由于每行两两不相邻,所以可以预处理。 蒟蒻的第一道状压。 看代码: #include<stdio.h> #in
阅读全文
摘要:P1433 吃奶酪 SolutionP4970 全村最好的嘤嘤刀P1879 [USACO06NOV]玉米田Corn Fields SolutionP3475 [POI2008]POD-Subdivision of KingdomP3092 [USACO13NOV]No Change GP3052 [
阅读全文
摘要:超级源点向每个集合连权值为这个集合的值的边,每个集合向每个元素连权值为极大值的边,每个元素向超级汇点连权值为其花费的边。 答案即为集合值的和减去最大流(最小割) 看代码: #include<bits/stdc++.h> using namespace std; #define int long lo
阅读全文
摘要:- [P3410 拍照] Solution- [P4744 [Wind Festival] Solution- [P2765 魔术球问题] Solution- [P2711 小行星] Solution- [P4055 [JSOI2009]游戏](https://www.luogu.com.cn/pr
阅读全文
摘要:求最大连通块…… #include<bits/stdc++.h> using namespace std; const int maxn=1e7+10; const int maxm=2*1e5+10; int vis[maxn]; int beg[maxn],nex[maxn],to[maxn],
阅读全文
摘要:计算每个点的入度。 #include<bits/stdc++.h> using namespace std; const int maxn=1e5+10; int vis[maxn],rd[maxn]; int top; int main(){ int x,y; while(1){ scanf("%
阅读全文
摘要:题意:判断给出的图是否为一棵树。 并查集的简单应用。 注意判断是否是一张空图。 #include<bits/stdc++.h> using namespace std; const int maxn=1e5+10; int vis[maxn],fa[maxn]; int find(int x){ i
阅读全文