HN集训的时候电脑坏了。。。回来以后拿去修结果去 NOI 都没能带自己的电脑。。也没来得及发这个东西了。。妈耶能拿分的题知识点我没复习到,果然 NOI 全程血妈崩哦。退役选手还是散发一点点的光和热吧 QAQ 。
多骗点访问量。。分两篇放。
2017.6.29:
网络流:
1.BZOJ1391:shabi题,中间连租用费用即可。
2.BZOJ2132:相邻不取不同的获得额外收益,那么将矩阵黑白染色后,黑格/白格st反向,然后正常建图。
3.BZOJ3894:第一遍做感觉很神,后面就觉得是sabi题了,很裸的模型,每个点分别向st连边,一边为选文一边选理,额外收益就建新点加边。
4.BZOJ2127:同上
5.BZOJ1532:二分网络流一眼题。
6.BZOJ2561:最小生成树和最大生成树分开考虑。若要出现在最小生成树上,即在所有边权小于L的边做完Kruskal后,u,v仍然不连通。那就将所有边权小于L的边加入图中,u,v分别为源汇求最小割即可,最大同理,显然两者没有交集。
7.BZOJ1324:显然不会选择不走,那么就是方格取数问题了。
8.BZOJ3158:这种题一定要分成二分图。可以猜按奇偶分。任意两个奇数满足1(2a+1)^2+(2b+1)^2=2(2a^2+2b^2+2a+2b+1),任意两个偶数满足2。
9.BZOJ1565:首先可以发现是最大权闭合子图。然后如果保护关系成环,环上任意一点都不可取。拓扑排序预处理一下就可以了。
10.BZOJ3144:考虑D的限制条件,相邻两层点的高度大小为D的相互连INF的边即可。
11.BZOJ1797:挺厉害的结论。。残量网络中跑Tarjan,对于每条满流边(u,v),如果能出现在最小割集中当且仅当Belong[u]!=Belong[v],如果一定出现在最小割集中当且仅当Belong[u]==Belong[S]&&Belong[v]==Belong[T]。第二个比较显然,S到u有通路,v到T有通路,如果该边流量增加则一定还可以增广,所以一定在最小割集中。至于第一个,将每个SCC缩成一个点,得到的新图就只含有满流边了。那么新图的任一s-t割都对应原图的某个最小割,从中任取一个把Belong[u]和Belong[v]割开的割即可证明。
12.BZOJ3996:式子转化成∑ ∑ Bij×Ai×Aj–∑Ai×Ci。可以看做是n件物品,A(0/1)表示该物品取不取,同取i,j获得Bij收益,取i有Ci代价。最大权闭合子图。
13.BZOJ1834:第一问SB。第二问不要想太多。。直接残量网络中每条边建新边,流量INF,费用w,超级源向源流量K,费用0。然后MCF。
14.BZOJ1877:每个点只经过一次,就拆点,对于图中每条边流量1,费用为路径长度。最大流为天数,最小费用为路径长。
15.BZOJ1221:基本就是餐巾计划。具体见http://blog.csdn.net/ep1c_heret1c/article/details/53810822
16.BZOJ2424:shabi题。
2017.6.30:
网络流:
1.BZOJ3171:使得每个点出入度都为1,向原方向连流量1费用0,向其他方向连流量1费用1。
2.BZOJ2245:很sb的费用流。
3.BZOJ1070:每个人对答案的贡献是修车时间*在他之后在同一个维修人员修车的人数。将维修人员拆点,假设i在j倒数第x个修理,i向jx连流量1费用tij*x的边。
4.BZOJ2879:上题加强版,改为动态加边,每次只加一层的。
5.BZOJ3280:也是餐巾计划了。
6.BZOJ1061:列不等式,通过加变量变成等式组,相邻的相减,构造流量平衡。
7.BZOJ2661:拆点,有关系的互相连边,最后答案/2。
8.BZOJ1930:一个点可能会经过两次,只有一次有贡献,拆点连两条边,然后两个可到达的点之间连边,加剪枝。
9.BZOJ2324:现在看到这个题一脸懵逼,二脸还是懵逼,什么蛇皮有上下界费用流。拆点,floyd预处理建边,每个点必须要流,从S向x’引一条流量1费用0的边,为了流量平衡,再x”向T引一条流量1费用0的边。
10.BZOJ1520:费用流裸题。。
11.BZOJ2893:一条边可能走多次。。tarjan缩点以后就很裸了。
12.BZOJ1449:很nb的方法。。先假设所有人全输,然后一个人多赢一场增加的收益为2w*C-2l*D+C+D。然后wi++,li–。由于Di<=Ci,每只球队连向汇点的边一定从小到大一次增广,所以一定正确。
13.BZOJ1927:可以有一次花费一定代价任意到达的点的最小路径覆盖。
14.POJ2125:一条边不是被出点删掉就是被入点删掉,二分图最小割。。至于方案随便搞一搞。
15.BZOJ3438:同3894文理分科。
16.POJ3155:最大密度子图及方案。二分答案ans,若sumE-ans*sumV>=0表示可取,转化成最大密度子图。
17.BZOJ2521:一次操作相当于对一条边+1,那么如果一条边要出现在最小生成树中,所有<=z[Lab]的边(一定要出现所以要+等号)连完以后,x[Lab]和y[Lab]不连通。割掉每条边的代价为(z[Lab]-z[i]+1),然后最小割。
18.BZOJ4873:考虑区间之间的依赖关系,连了ij,一定连了i+1j和ij-1,那么连边,每个区间都有收益,考虑cx怎么处理,一定是在单点的区间中减去。然后正常最小割。
19.BZOJ4514:就考虑一下怎么构建二分图,发现是按照质因数个数和的奇偶性构建。
20.BZOJ4177:文理分科。。
图的联通:
1.BZOJ2208:(暴力就可以过。。)看这个题就很像DAG,但是如果每个点打标记算就变成了暴力。用bitset优化。注意一下更新答案是谁对谁的贡献。
2.BZOJ1589:缩点记忆化。
3.BZOJ1123:只有割点才会对答案有贡献,割掉一个点后变成上面一棵树下面若干子树,统计一下子树大小,然后算一算。
4.BZOJ1093:看懂题。。就是缩点以后求最长链及其方案数。注意重构图要去重边。
5.BZOJ2730:对于每一个点双连通分量。若其中有两个或两个以上的割点,则不需要建,因为若其中一个割点坍塌,可以通过另外一个割点进入其它连通分量中的救援出口。若只有一个割点,则只要建一个。若无割点,则需要建两个。
6.BZOJ2427:若干环和若干树,缩点以后变成若干点和若干树,然后建立虚点向每个树根连边,树形dp。
最短路:
1.BZOJ1003:暴力枚举任意两天之间不改变航线最短距离,然后DP。这TM的不就是暴力了吗!迷之单调性。。
2.BZOJ1491:Floyd搞来搞去的。
3.BZOJ1295:每个点Spfa算要到达某个点最少需要拿掉多少障碍点。因为是BFS,所以一定不会出现中间某个障碍点没拿掉的情况。
4.BZOJ2763:dis开二维,分层图好像会挂。
5.BZOJ1579:上一题加强版,Spfa会挂,要dij。
6.BZOJ2662:同上
7.BZOJ1922:维护到达时间和控制时间,DIJ。
8.BZOJ1598:K短路。
9.POJ2404:蛇皮东西。。无相带权图上的中国邮路问题,奇数度点两两匹配,状压dp。
点分治:
1.POJ1741:裸题。
2.BZOJ2152:模板题。
3.BZOJ2599:开个100w的数组存长度为i的路径的最小边数。
4.HDU4812:两个乘积改为确定一个数,找另一个数的逆元。
5.BZOJ4598:哈希,然后只存可能出现在模式串中的树链。
生成树:
1.BZOJ1977:严格次小生成树模板题。先最小生成树,然后枚举每条非树边,找树上两点之间的最大值,若长度相同,则找次大值更新。
单调队列:
1.BZOJ1047:四遍单调队列。
2.BZOJ1233:倒过来具有决策单调性。
3.BZOJ2442:很容易发现有决策单调性,但是这个题还要提前将-1,0入队。
平衡树:
1.BZOJ1588:单点插入,查询前驱后继。
2.BZOJ1503:记员工工资变化量Delta。找第k大,区间删除。
3.BZOJ1251:区间+,区间翻,区间最大值。
4.BZOJ3223:区间翻转。
5.BZOJ1861:单点插入删除,指定点排名,第k小。
6.BZOJ1208:单点插入删除,找前驱后继。
7.BZOJ1500:终极模板。。
8.BZOJ4825:平衡树维护值域,线段树维护深度。
主席树:
1.POJ2104:裸题。
2.BZOJ3524:若左右子树大小之差<=(r-l+1)/2,返回0,否则在大的一边继续搜。
3.BZOJ2223:同上。
2017.7.1:
主席树:
1.BZOJ1901:树状数组/线段树套主席树
2.BZOJ2588:树上建主席树,前缀是从根到该点。
3.BZOJ3932:差分+主席树
LCT:
1.HDU4010:link,cut,区间加,区间最大值。
2.BZOJ2049:link,cut,查询两点是否联通。
2017.7.3:
LCT:
1.BZOJ2002:LCT维护子树大小。每个点i跳到的位置为min(x+i,n+1)。改变的时候,先和原先的a[x]断开,将a[x]至为当前更改后可跳到的位置,并和x连接。查询答案就是点x到n+1之间点的个数-1。
2.BZOJ2631:注意一下两个标记的下传就行了。
3.BZOJ3669:边权按a值排序,依次加边,若构成环就删除环上b值最大边,LCT维护最大值位置,当1和n联通时更新答案。
4.BZOJ2594:倒序加边,成环删去环上最大边,LCT维护区间最大值位置。
5.BZOJ3282:裸题。
6.BZOJ1180:裸题。
AC自动机:
1.HDU2222:裸题。
2.BZOJ1030:容斥求一个单词都没出现的方案数,就注意一下要tag[k]|=tag[Next[k]],一个串的后缀如果是令一个串那么也要标记掉,然后就dp解决。
3.BZOJ2938:永远可以不匹配到标记节点,Trie图成环,建完自动机找环。
后缀数组:
1.BZOJ1031:将原串复制一遍,然后后缀数组枚举串长只枚举到原串长度。然后枚举若sa[i]小于n/2,输出s[sa[i]+n/2-1]。
2.BZOJ1717:先离散化,然后后缀数组,变成求连续的k个后缀的LCP。
3.UOJ131:将三元组(height[i],sa[i-1],sa[i])按height[i]降序排序,然后用并查集维护一下每个集合的大小sz和最大值最小值。然后两个集合合并的时候就是当前height的方案数+=sz[fx]?sz[fy]。
4.POJ1743:两个相邻的数减一下,离散化,然后就是求两个后缀的最长不相交前缀,二分。
5.BZOJ4516:倒过来就是每次加入一个后缀,冲突数就是与之前的后缀的LCP的最大值,树状数组维护一下。
莫队:
1.BZOJ2038:维护颜色数量。
2.BZOJ4810:操作三暴力枚举,前两个用bitset。
状压dp:
1.POJ3254:煞笔题。
2.BZOJ1087:dp[i][j][k]表示第i行,一共放了j个,当前行状态为k的方案数。
3.BZOJ1231:dp[i][j]表示末位为i,状态为j的方案数。
4.BZOJ1688:无脑暴力。
5.BZOJ2073:预处理一下每个状态的重量,后面随便过。。。
6.BZOJ4197:小于根号五百的质因数只有8个,大于的每个数最多只有一个。f[i][j]表示第一个人状态为i,第二个人为j的方案数。g[0/1][i][j]表示当前数放到第1/2个人后,第一个人状态为i,第二个人为j的方案数。