2021暑期训练
文章平均质量分 54
Bi08
这个作者很懒,什么都没留下…
展开
-
2018 China Collegiate Programming Contest - Guilin Site ccpc 桂林 L - Two Ants计算几何
题意给你一条黑线和一条白线,问仅能看到白线的区域面积是多少。分析情况大概有以下这么多种:两线段相交:端点处相交,是否共线一条线段端点在另一条线段上两条线段在非端点处相交两线段不相交两线段所在直线相交,相交与黑线/白线对应端点做出如样例3的两条直线,判断交点是否在黑线和白线的同一侧,考虑是否交换某一线段的两端点最后判断交点与黑白线的关系,求出对应面积或inf代码#include <bits/stdc++.h>using namespace std;typedef原创 2021-10-02 16:30:37 · 614 阅读 · 0 评论 -
Codeforces Round #742 (Div. 2) E. Non-Decreasing Dilemma 线段树
题意给你一个长度为nnn的序列www,两种操作:1 x y:将w[x]w[x]w[x]变成yyy2 l r:求l,rl,rl,r区间内上升子串个数分析与线段树维护区间最大子段和类似。使用线段树维护以下几个值:lsumlsumlsum最大上升前缀长度rsumrsumrsum最大上升后缀长度flagflagflag该区间是否是上升区间tottottot该区间满足条件的上升子串个数代码#include <bits/stdc++.h>using namespace std;t原创 2021-09-16 21:22:59 · 110 阅读 · 0 评论 -
Codeforces Round #316 (Div. 2) D. Tree Requests 启发式合并
题意一颗根在1的树,多次询问,每次询问vvv的位于深度hhh的子节点是否能构成回文串。分析最多有一奇数字符才能构成回文串。考虑将询问离线,使用启发式合并求解该问题。维护cnt[h][ch]cnt[h][ch]cnt[h][ch]数组,表示在深度为hhh的位置上字符chchch的字符个数。遍历所有轻儿子,递归结束消除贡献遍历重儿子,保留重儿子贡献计算当前子树中轻子树的贡献更新答案当前点是轻儿子,消除当前子数贡献卡endlendlendl,用\n代码#include <bits/原创 2021-09-14 22:18:18 · 133 阅读 · 0 评论 -
2021牛客暑期多校训练营9 C Cells ntt+行列式+lgv引理
题意n个块在(0,ai)(0,a_i)(0,ai)的位置,问有多少种方案,使得块到达(i,0)(i,0)(i,0)的不同方案数。块只能向右向下移动,两个块的路径不能相交。分析根据LGVLGVLGV引理,得到如下行列式AAA,行列式的值就是不想交路径的个数。∣Ca1+11Ca1+22...Ca1+nnCa2+11Ca2+22...Ca2+nn......Can+11Can+22...Can+nn∣\left|\begin{array}{cccc} C_{a_1+1}^1 &原创 2021-08-14 22:07:57 · 259 阅读 · 0 评论 -
2021牛客暑期多校训练营9 J Jam 网络流+二分图匹配
题意给你一个交叉路口,每一方向均有三个子方向,向左向前向右。每个转向方向上存在不同数量的车,每秒仅能通过一辆。在不相撞的情况下计算这些车通过路口的最小总时间。分析基本常识可以知道右转与其他不产生影响,考虑将右转单独进行计算,最后答案取maxmaxmax。将每个方向的左转和直行共8个方向进行标号,得到如下图和矩阵。(每个方向都优先标左,顺时针方向标号),其中-1表示右转。手推样例可知,共有十二种组合可以同时进行,{{1,2},{1,5},{1,8},{2,3},{2,6},{3,4},{3,7},原创 2021-08-14 19:33:36 · 315 阅读 · 0 评论 -
Codeforces Round #737 (Div. 2) D. Ezzat and Grid 线段树优化动态规划
题意有nnn行全0段,将其中mmm段赋值为1,问满足条件的行数最多是多少。条件为:两行至少有一列全1。分析类似最长上升子序列从前向后转移。每次当前行选出一个满足条件的最大行进行转移,上述找满足条件的值最大行的操作可以使用线段树优化。由于数据范围在1e91e^91e9之内,需要离散化。需要一颗区间赋值,求区间最值的线段树,除值外线段树还需存当前值对应的行数,可以使用pairpairpair进行存储。按照每一行从小到大的顺序进行操作,先更新答案,再对当前区间赋值为当前答案最大值+1。如果对于当前原创 2021-08-10 10:47:16 · 388 阅读 · 2 评论 -
P4145 上帝造题的七分钟 2 / 花神游历各国 线段树,暴力更新,剪枝
题意给你一个长度为nnn的序列,两种操作将一段区间中的数开平方,询问一段区间中数的和。分析a[i]≤1e12a[i]\le1e^{12}a[i]≤1e12,最多六次就可变成1,在区间中使用线段树维护一个最大值,当前区间最大值为1是不在进行更新,其他情况暴力更新到单点。实现与普通线段树类似,暴力更新到单点并剪枝的思想很重要!!代码#include <bits/stdc++.h>using namespace std;typedef long long ll;typedef pai原创 2021-08-06 17:07:22 · 93 阅读 · 0 评论 -
P3338 [ZJOI2014]力 快速傅里叶变换fft,推式子
题意Ej=∑i=1j−1qi(i−j)2−∑i=j+1nqi(i−j)2E_j=\sum_{i=1}^{j-1}\frac{q_i}{(i-j)^2}-\sum_{i=j+1}^{n}\frac{q_i}{(i-j)^2}Ej=∑i=1j−1(i−j)2qi−∑i=j+1n(i−j)2qi给你qiq_iqi,求EiE_iEi。分析Ej=∑i=1j−1qi(i−j)2−∑i=j+1nqi(i−j)2E_j=\sum_{i=1}^{j-1}\frac{q_i}{(i-j)^2}-\su原创 2021-08-06 11:35:04 · 84 阅读 · 0 评论 -
2021杭电多校第三场 1010 Road Discount 选出k个黑边的最小生成树
题意给你一个图,每条道路有原价格和折扣价格,在选kkk条折扣价格的道路时将nnn个点联通的最小花费k∈[0∼n−1]k\in[0\sim n-1]k∈[0∼n−1]。分析将折扣边看作黑边,原边看成白边,问题转换为每次选kkk条黑边的最小生成树的最小值。考虑将黑边的权值+c+c+c,ccc越大,黑边权值越大,选的黑边越少(满足玄学二分性质)。wqs二分总共用到的边数仅需2∗(n−1)2*(n-1)2∗(n−1),即黑边和白边分别跑最小生成树所需的边。对于上述ccc可以预处理,从-1000跑到10原创 2021-08-04 14:46:53 · 130 阅读 · 0 评论 -
P4124 [CQOI2016]手机号码 数位dp,动态规划
题意给你一段区间,让你找出这段区间中满足:至少出现三个相邻的相同数字,且不同时出现8和4的号码有多少。分析数位dp,状态表示:dp[x][last1]last2][f4][f8][flag]dp[x][last1]last2][f_4][f_8][flag]dp[x][last1]last2][f4][f8][flag]x表示当前dp到第几位,last1,last2表示前两位分别是多少,f4f_4f4,f8f_8f8分别表示是否出现过4或8,flag表示是否出现过连续相同的三位。按照记忆化原创 2021-08-04 12:50:53 · 147 阅读 · 0 评论 -
2021牛客暑期多校训练营6 H Hopping Rabbit 线段树,扫描线,矩形取模
代码给你nnn个矩形,小兔子每次可以上下左右四个方向每步跳ddd个单位长度,问你是否能找到一初始点,使得小兔子无论如何跳都无法跳入陷阱。分析将每个矩形进行取模,实现对[0,d−1][0,d-1][0,d−1]的矩形进行覆盖。若在取模后的矩形存在未被覆盖的点则当前点可以作为初始点。取模时注意,拆分后的矩形最多有四个,对x1,x2x1,x2x1,x2的值大小分情况讨论,y1,y2y1,y2y1,y2同理。采用扫描线的方式进行扫描,线段树支持区间加和最小值。如果当前区间存在最小值为0的点,则表示存在解,原创 2021-08-03 22:39:30 · 131 阅读 · 0 评论 -
2021杭电多校第四场 1004 Display Substring 二分+后缀数组
题意给你一个字符串,a∼za\sim za∼z每个字母有一个权值,找出权值第kkk小的子串,若不存在输出-1分析第kkk小,考虑二分,二分答案,checkcheckcheck函数计算有多少个串比当前二分的值小。如何计算比当前midmidmid小的子串数量?可以使用前缀和,对于当前起点lll,二分右端点rrr,使得vall∼rval_{l \sim r}vall∼r值刚好小于等于midmidmid(指l∼rl\sim rl∼r这一段子串权值小于等于midmidmid。但按照上述方法二分会出现重复原创 2021-08-02 20:54:45 · 121 阅读 · 0 评论 -
P4782 【模板】2-SAT 问题
题目nnn个布尔变量xi∼xnx_i\sim x_nxi∼xn,mmm个需要满足条件,每个条件都是xi=true/flase∨xj=true/flasex_i=true/flase \vee x_j=true/flasexi=true/flase∨xj=true/flase,给每个变量赋值,使得上述所有条件均得到满足。分析a∨b=(¬a→b)∧(¬b→a)a\vee b=(\neg a\to b)\wedge(\neg b\to a)a∨b=(¬a→b)∧(¬b→a)2−sat2-sat2−原创 2021-08-01 18:54:53 · 194 阅读 · 1 评论 -
Educational Codeforces Round 112 (Rated for Div. 2) E - Boring Segments 双指针+线段树
题意给你NNN条线段,从中选出若干条,使得[1,m][1,m][1,m]区间被覆盖,每条线段存在权值www,求maxw−minwmax_w-min_wmaxw−minw最小值。分析将线段由权值从小到大排序,使用双指针的方式进行求解。如何维护区间?使用一棵线段树,每次进行区间加1,-1,求最小值操作,当区间中最小数为1时,认为区间已被完全覆盖。注意:建树时右端点应取线段中所有rrr的最大值。代码#include <bits/stdc++.h>using namespace原创 2021-07-31 10:02:59 · 255 阅读 · 0 评论 -
P4735 最大异或和 可持久化字典树 01trie
题意给定一个非负整数序列aaa,初始长度nnn。两种操作,每种多次:A x:在序列末尾+一个数xQ l r x:询问操作,找到一个位置ppp,满足l≤p≤rl\le p\le rl≤p≤r,使得:a[p]⊕a[p+1]⊕...⊕a[N]⊕xa[p]\oplus a[p+1]\oplus...\oplus a[N]\oplus xa[p]⊕a[p+1]⊕...⊕a[N]⊕x最大,输出最大值。分析异或操作满足前缀和的性质,sss为异或前缀和数组,询问操作相当于a[N]⊕x⊕a[p−1]a[N]\opl原创 2021-07-28 19:17:56 · 147 阅读 · 0 评论 -
P3723 [AH2017/HNOI2017]礼物 快速傅里叶变换fft 推公式
题意可以将xix_ixi加上任意数字ccc,并任意旋转一手环,使得∑i=1n(xi−yi)2\sum_{i=1}^n(x_i-y_i)^2∑i=1n(xi−yi)2最小分析先不考虑旋转:∑i=1n(xi−yi)2\sum_{i=1}^{n}(x_i-y_i)^2∑i=1n(xi−yi)2∑i=1n(xi+c−yi)2\sum_{i=1}^{n}(x_i+c-y_i)^2∑i=1n(xi+c−yi)2最小=∑i=1n(xi2+yi2+2c(xi−yi)−2xiyi+c2)=\s原创 2021-07-28 16:30:04 · 121 阅读 · 0 评论 -
P3763 [TJOI2017]DNA 字符串匹配 快速傅里叶变换fft
题意给你模式串和原串,在匹配字符数量<=3时认为匹配,输出原串中有多少子串在上述匹配规则下成功匹配。分析P4173 残缺的字符串 fft匹配字符串采用上题类似的匹配函数,将四个字符分别计算,fftfftfft后计算总的匹配数量+3是否≥m\ge m≥m字符中=A,G,C,T的置1,其他置0#include <iostream>#include <string>#include <cstring>#include <cmath>#inc原创 2021-07-28 14:38:57 · 304 阅读 · 0 评论 -
P4173 残缺的字符串 字符串匹配 快速傅里叶变换fft
题意给你模式串和原串,串中存在通配符*,输出原串中可以和模式串完全匹配的每个开头位置。分析定义匹配函数P(x)=∑i=0m−1[A(i)−B(x−m+i+1)]2A(i)B(x−m+i+1)P(x)=\sum_{i=0}^{m-1}[A(i)-B(x-m+i+1)]^2A(i)B(x-m+i+1)P(x)=∑i=0m−1[A(i)−B(x−m+i+1)]2A(i)B(x−m+i+1)SSS是AAA的翻转:S(i)=A(m−i−1)S(i)=A(m-i-1)S(i)=A(m−i−1)P(x)=∑原创 2021-07-27 21:40:52 · 136 阅读 · 0 评论 -
2021牛客暑期多校训练营4 E Tree Xor 线段树
题意有一棵每个点都具有权值wiw_iwi的树,给你每个点的权值范围[l[i],r[i]][l[i],r[i]][l[i],r[i]],n−1n-1n−1对异或关系,求满足上述条件的权值有多少种。分析通过n−1n-1n−1对异或关系,可以得到任意两点之间的异或值。可以先令w1′=0w'_1=0w1′=0,通过dfsdfsdfs计算出每个点的wi′w'_iwi′,使用每个点的左右区间限制,以及1号点本身的左右区间,来求出满足条件的w1w_1w1的取值。设w1=aw_1=aw1=awi=wi原创 2021-07-27 10:05:30 · 300 阅读 · 0 评论 -
莫比乌斯反演学习笔记
莫比乌斯反演若F(n)=∑d∣nf(d)F(n)=\sum_{d|n}f(d)F(n)=∑d∣nf(d),则f(n)=∑d∣nμ(d)F(nd)f(n)=\sum_{d|n}\mu(d)F(\frac{n}{d})f(n)=∑d∣nμ(d)F(dn) (ddd是nnn的约数)若F(n)=∑n∣df(d)F(n)=\sum_{n|d}f(d)F(n)=∑n∣df(d),则f(n)=∑n∣dμ(dn)F(d)f(n)=\sum_{n|d}\mu(\frac{d}{n})F(d)f(n)=∑n∣dμ原创 2021-07-25 21:38:22 · 74 阅读 · 0 评论 -
P4111 [HEOI2015]小 Z 的房间 图的生成树个数 高斯消元计算行列式
题意求一个图的生成树个数分析拉普拉斯生成树???生成树矩阵=度数矩阵-邻接矩阵生成树的个数等于:生成树矩阵降一维后求行列式的值采用高斯消元的方式计算当前行列式的值注意:本题中每一个矩形都算图中的一个点,计算行列式的矩阵需要开n2n^2n2代码#include <iostream>#include <string>#include <cstring>#include <cmath>#include <algorithm>#原创 2021-07-25 19:35:35 · 81 阅读 · 0 评论 -
P3834 【模板】可持久化线段树 2(主席树)
题意静态查询区间第kkk小,多组询问分析离散化后建立权值线段树,注意空间要开nlognnlog_nnlogn倍。每次计算左区间的数个数,如果cnt≤kcnt\le kcnt≤k,则表示第k个数在左区间,否则在右区间。代码#include <iostream>#include <string>#include <cstring>#include <cmath>#include <algorithm>#include <q原创 2021-07-25 19:28:13 · 138 阅读 · 0 评论 -
2021杭电多校第二场 1004 I love counting 字典树+树状数组
题意给你一个序列ccc,多组询问在[l,r][l,r][l,r]区间内有多少个种类的ccc值,满足c⊕a≤bc\oplus a \le bc⊕a≤b (异或)。分析使用树状数组和字典树维护。使用一个vectorvectorvector存储每一个右端点所对应的当前询问对应的l,a,bl,a,bl,a,b,使用visvisvis数组记录当前值是否出现过,使用树状数组维护前缀,答案就是cal(r)−cal(l−1)cal(r)-cal(l-1)cal(r)−cal(l−1)。在树状数组维护过程中,使用字典原创 2021-07-25 12:49:13 · 373 阅读 · 7 评论 -
2021牛客暑期多校训练营3 C Minimum grid 思维+二分图匹配
题意给你一个n∗nn*nn∗n大小的网格,每一行最大值bib_ibi,每一列最大值cic_ici,你需要对一些点赋值,使得总的赋值和最小。分析将每个数值对应的行,以及每个数值对应的列分别进行存储。枚举每一个数值,范围[1∼k][1\sim k][1∼k]。枚举当前数值所对应的行和列,如果当前行列可以填数,则将行和列建边,求出行和列的最大匹配数。当前数值的贡献为:(当前值对应的行数+当前值对应列数-最大匹配数)*当前值。使用vectorvectorvector进行存储,所对应的值就是[v1[n原创 2021-07-24 21:03:22 · 156 阅读 · 0 评论 -
2021牛客暑期多校训练营3 B Black and white prim 思维+最小生成树
题意给你一个n∗mn*mn∗m的矩阵,每个矩阵有一个权值,当一个正方形中三个点均已涂黑后,第四个点可免费涂黑,问将所有点涂黑所需的最小花费。分析所有点涂黑相当于将每行和每列均相连,c[i][j]=wc[i][j]=wc[i][j]=w相当于从iii行走到jjj列所花费权值为www,建图跑primprimprim最小生成树即可。代码#include <bits/stdc++.h>using namespace std;typedef long long ll;typedef pai原创 2021-07-24 19:45:24 · 252 阅读 · 0 评论 -
P5043 【模板】树同构([BJOI2015]树的同构) 树的hash
题意对于两个树 T1T_1T1 和 T2T_2T2,如果能够把树 T1T_1T1 的所有点重新标号,使得树 T1T_1T1 和树 完 T2T_2T2 全相同,那么这两个树是同构的。给你多棵树,输出与当前树同构的最小下标。分析对树搜重心,使用f[u]=∑v∈son(u)f[v]+p[sz[v]]f[u]=\sum_{v\in son(u)}f[v]+p[sz[v]]f[u]=∑v∈son(u)f[v]+p[sz[v]] 计算当前树的hashhashhash值ppp是质数数组,在最开始r原创 2021-07-24 11:10:43 · 146 阅读 · 0 评论 -
2021牛客暑期多校训练营1 H Hash Function FFT快速傅里叶变换
题意给你nnn个数,让你找出一个最小的数字mmm,使得上述nnn个数%m\%m%m后值各不相同。分析上述问题等价于:对所有的iii和jjj, ∣ai−aj∣%m≠0|a_i-a_j|\%m \neq 0∣ai−aj∣%m=0,即可求出∣ai−aj∣|a_i-a_j|∣ai−aj∣的所有可能取值,再进行检测。A={a1,a2...an},B={b1,b2...bn}A=\{a_1,a_2...a_n\},B=\{b_1,b_2...b_n\}A={a1,a2...an},B={b1原创 2021-07-23 20:50:51 · 107 阅读 · 0 评论 -
2021杭电多校第二场 1008 I love exam 动态规划
题意nnn门课,mmm个课程与成绩与天数的关系,最多复习TTT天,在挂科数量≤P\le P≤P的情况下的最大得分。分析状态表示f[i][j]f[i][j]f[i][j] 表示第iii门课用jjj天复习能得到的最大分数dp[i][j][p]dp[i][j][p]dp[i][j][p] 表示前iii门课花jjj天挂ppp门的最大得分fff数组使用背包维护ggg数组:需要枚举当前第iii门课的学习天数kkk状态转移(f[i][k]<60)(f[i][k]<60)(f[i][k]<原创 2021-07-23 15:31:08 · 252 阅读 · 0 评论 -
P2824 [HEOI2016/TJOI2016]排序 线段树+二分
题意nnn个数的排列,对这个排列进行mmm次局部排序0 l r升序排序,1 l r 降序排序最后询问第pospospos个位置上的数是多少分析将当前序列变成01串,使用线段树维护01串。使用二分答案的方式进行求解。对于每次二分的答案,大于等于midmidmid的元素置为1,小于等于midmidmid的元素置为0。使用线段树维护每次修改的操作,设当前[l,r][l,r][l,r]中1个个数为numnumnum:升序排序:将[r−num+1,r][r-num+1,r][r−num+1,r]置1,原创 2021-07-23 12:42:51 · 203 阅读 · 0 评论 -
Codeforces 1553 E. Permutation Shift
题意原数组通过kkk置换操作后在交换最多mmm个元素得到新数组,给你新数组问kkk的取值可以有哪些。置换操作可简要理解为:将数组的后kkk个元素移到数组前面。分析如何求每次置换操作后的数组?每次置换操作kkk相当于bi=(i−k+n)%nb_i=(i-k+n)\%nbi=(i−k+n)%n,可以快速算出在不同kkk的取值下,置换后的数组。如何求当前两数组在最多mmm次置换操作后可以相同?使用并查集来计算环数,当二者不在同一集合中时,答案++。k取值最多有nnn个?如何简化?交换次数m≤n原创 2021-07-23 10:31:59 · 231 阅读 · 0 评论 -
2021杭电多校第一场 1006 xor sum
题意给你n个数和k,问最短的区间长度,使得区间异或值>=k,输出左端点最小答案。原创 2021-07-22 20:58:26 · 233 阅读 · 0 评论 -
2021牛客暑期多校训练营2 J Product of GCDs
题意给你一个大小为n的集合,询问每个大小为k的子集的gcd乘积是多少思路枚举每一个质因子ppp,计算当前质因子是多少个数的因子,个数记为sum。当前质因子存在的子集个数为CsumkC_{sum}^kCsumk,贡献为pCsumkp^{C_{sum}^k}pCsumk。优化上述式中CsumkC_{sum}^kCsumk为幂数,可以使用欧拉降幂进行优化ab%mod=aϕ(b)%moda^{b}\%mod=a^{\phi(b)}\%modab%mod=aϕ(b)%mod注意会爆ll,采用__i原创 2021-07-22 10:45:41 · 91 阅读 · 0 评论