zoukankan      html  css  js  c++  java
  • 省选模拟(1-10)

    省选模拟1#

    A. 天空碎片##

    不会。

    B. 未来拼图##

    题目给的转移显然是卷积形式,所以问题是已知卷积后的系数式,求原系数表达式的方案数以及最小字典序情况下的方案数。
    结论:系数表达式对称,点值表达式也对称。可证在此不表。
    Upd:还是证一证吧。
    考虑点值表达式一对对称的(x=W_n^i,W_n^{n-i}),再考虑点值表达式上一对对称的系数(a_j,a_{n-j})
    如果我们能证明在x对称的情况下这对对称的系数的和相等,就可以证得所有的对称的系数的和相等,即点值式上对称位置的值相等。
    (x=W_n^i->a_jx^j+a_{n-j}x^{n-j}=a_j(W_n^{ij}+W_n^{ni-ij})=a_j(W_n^{ij}+W_n^{-ij}))
    (x=W_n^{n-i}->a_jx^j+a_{n-j}x^{n-j}=a_j(x^j+x^{n-j})=a_j(W_n^{-ij}+W_n^{ij}))
    所以系数对称,点值也对称。
    先把卷积DFT成点值形式,自己跟自己卷就开根,模长开根,幅角/2,用atan2可以得到角度的具体象限,用atan就会负负得正
    因为n不是2的次幂,因此考虑暴力IDFT,DFT得到点值和系数式。
    然后(2^{n/2})枚举一半的符号,根据结论得知对称性。再把这个点值IDFT回去判断是否可行,再用map判重。
    可行条件:非负,对称,卷积回去等于读入(或为整数)
    因为double有些许误差,因此需要把得数+0.5(0.9?),或直接用round。

    C.完美理论##

    选定根,然后跑最大权闭合子图。

    省选模拟2#

    A. 铁轨建设##

    跟无限之环很像,只是我没有做,并且部分分插头dp也不会打。
    将每个点拆成4个点连向四个方向,然后考虑黑白染色,就能够解决循环流的问题
    因为黑点和白点相邻,也就是说只能黑白间互通流量,那么黑白点的总流量一定相等。
    考虑黑点,白点只需把边全部转向。从S连向右,下点;下连左费用为1,连上;右连上费用为1,连左;
    然后再由四个方向向对应的白点的对应方向连边。
    跑最小费用最大流。

    B. 圈地游戏##

    不会。
    UpdT3

    C. 组合数学##

    打了skyh的70分,用map映射vector来dfs,用程序跑出来状态很少,要会跑状态。

    省选模拟3#

    A. 好题##

    考试时90分思路:
    随机化起点,树形DP预处理出该点子树内距离最近的k种颜色及相应的位置,更新时暴力更新一条链上的所有点的最小值。
    不能A的原因是由于某些原因,当出现距离相同的某两种颜色时我总是固定选择其中先出现的一种。
    正解:
    随机把所有颜色映射到k种颜色里,因为k只有5,所以直接树上状压dp就行。
    复杂度不会证。

    B. 坏题##

    这TM我一万年也看不出来是ac自动机啊。
    假如看出来是ac自动机,题目要求的就变成了求起点和终点都是环,中间不能经过串结束节点的方案数了。
    建出ac自动机,建出trie树,tarjan缩环,有危险节点的不要
    接着跑(Topsort) 更新,学到了一点就是tarjan跑出来的点倒序就是Topsort序。
    最后单独环是答案,环+点+环也是答案,如果有环套环就输出-1,环套环的表现是点数<边数。

    C. 不好不坏题##

    没打正解。光打了个60分线筛。
    约数和:(f_{i*p}=f_i*f_p-f_{i/p}*p)

    字符串专题测试1#

    A. 阿尔法##

    新get到一个倍增维护并茶几的做法,已写到了知识点里。
    kx做法:
    出于n个点形成的联通块最多有n条有用边的启发,也就是最多会有n个“代表元素”。
    给的(l_1,l_2,len)就相当于是在找([l_1,l_1+len-1],[l_2,l_2+len-1])两段区间内代表元素不同的位置,再改成一样的。
    于是线段树维护(hash)值,二分找到hash值不同的第一个位置
    然后修改该元素的代表位置,在线段树上修改hash值,然后接着跳。
    其实还是没懂,kx要是看到了这里请务必教我

    B. 狗##

    题目很懵彼。

    C. 集合##

    题意:求n个元素划分为若干的子集的方案数。
    心路:
    先想到的是(Bell)数,但是只在一次A组题里涉及到一点
    并且那道题的题目性质特殊有小%数要求矩阵乘和CHR,所以这道题行不通。
    接着想到了整数划分,但费劲力气想到的也只是(O(n^2))级别的,这题都没给小点分
    可能是水题,暗自想到。
    于是想到了一个DP:(f[i][j])表示考虑前i个数分成了j个子集的方案数
    滚动后空间够时间还是(O(n^2))的,就打了个表也没有发现什么。(话说你对{}一点都不了解吗啊喂
    然后?然后发现(skyh)开局切掉,然后自己离考试还剩1h也发现了这个思博斯特林数,然后就ac了。
    正解:
    考虑斯特林数S(n,m)表示n个不同的球放到了m个相同的盒子里的方案数。
    那么答案显然就是n这一行的斯特林数。
    如何求斯特林数?
    (f[i])表示钦定i个互异盒子为空的方案数
    (g[i])表示恰好i个互异盒子为空的方案数。
    (f_i=C_m^i(m-i)^n)
    (f_i=sumlimits_{j=i}^mC_j^ig_j)

    (g_i=sumlimits_{j=i}^m(-1)^{j-i}C_j^if_j)
    那么(S(n,m)=frac{g_0}{m!}=sumlimits_{j=0}^mfrac{(-1)^j}{j!}frac{(m-j)^n}{(m-j)!})
    发现这个是卷积,于是就可以(O(m))求单点,(O(mlogm))求一行了,这题(n,m)同阶。

    数学专题测试1#

    A. 解方程##

    可以发现>=的限制没有用,那么通过容斥把<=的限制转化为>=,再用exlucas求解。

    B. 宇宙序列##

    可以发现题目给的a的生成方式是FWT中xor形式
    可以感性理解的是把a自卷x次等价于a的点值式自乘x次
    那么就有一个显然的50分暴力是暴力p次FWT
    每次把(2^{i-1})次的a自乘再IDWT回去求出a[j]求和。
    (O(n2^np))
    正解肯定不是这个鸭。
    正解:
    考虑倍增Dp设(f[x][j]=sum limits_{j=0}^{2^i-1} x^{2^j})
    表示(X,X^2,X^4,X^8.....X^{2^{2^i-1}})的和
    转移有(f[x][j]=f[x][j-1]+f[x^{2^{2^{j-1}}}][j-1]),你会发现它是对的。
    可以理解为把底数从x变成(x^{2^{2^{j-1}}})了。
    1<<j-1<=1<<18,可以直接带,然后(2^{2^{j-1}})要对10006取模。
    在统计答案的时候,考虑用一些二进制数拼出p。
    由于我们能直接自乘的只有点值式,所以必须求出所有1<<n位置的自乘出来的值再给它IDWT回去才能得到a[j]。
    设最初的base=a[j]点值,实际要拼接的是p+1次
    因为(X^{2^j})是从X开始的,也就是X,(X^2)(X^4)(X^8)(X^{16})...
    每次拼接的base势必也是不同的,开始是a[j]
    假设第一次拼接长度是j((2^j)),那么ans+=f[base][j],base=(base^{2^{2^j}})原理同上。
    然鹅考试时由于不会FWT就滚粗了

    C. exp##

    挺神的一道题,考场想不到,但题面错了就不调了这可不行啊...
    正解:
    断环成链。
    考虑一段区间[l,r],如果r位置是最后被干掉的,那么这个区间就可以和[r+1,...]分开计算而没有冲突。
    同理,如果[l,r]内存在一个位置k满足k是r前被干掉的最后一个,此时[l,k],[k+1,r]同样可以分开处理。
    设p是概率,f是期望,g[l,r,k]表示[l,r]区间k最后一个被干掉的概率。
    (p[l,r]=sumlimits_{k=l}^{r-1}g[l,r,k])
    这个很显然吧
    (f[l,r]=frac{1}{p[l,r]}sumlimits_{k=l}^{r-1}g[l,r,k]*(f[l,k]+f[k+1,r]+(k-l)/2))
    由于p[l,r]可以看成是g[l,r,k]的加权和,那么就要把这么多种情况的期望搞一个加权平均才叫做期望
    设lc=cnt[k]-cnt[l]-1,rc=cnt[r]-cnt[k]-1
    所以(g[l,r,k]=C_{lc+rc}^{lc}(frac{k-l+1}{r-l+1})^{lc+1}p[l][k](frac{r-k}{r-l+1})^{rc}p[k+1][r])
    考虑特殊情况即k-l+1=r-k
    那么(g[l,r,k]=frac{C_{lc+rc}^{lc}}{2^{lc+rc+1}}p[l][k]p[k+1][r])
    然而并没有要求左右的严格顺序,所以要乘一个组合数。
    至于那个(k-l)/2是最后干掉k时的期望,用等差数列计算贡献总和再除上总方案数的结果
    最后答案统计时枚举最后一个变成X的O,一共有n种方案,用概率p[l,l+n-1]乘上期望f[l,l+n-1]
    最后一次的期望同(k-l)/2,是(n-1+0)*n/2 /n=(n-1)/2
    因为(sumlimits_{i=1}^n p[i][i+n-1]=1),所以最后的(n-1)/2不成概率是正确的。
    初态是当[l,r]内只有r是O时,f[l,r]=0,p[l,r]=1
    当r不是O时,这个状态不合法,是0
    采用记搜会很好

    数学专题测试2#

    A. B##

    理解的难点在于如何解决a[i]<=a[i+1],因为单纯的莫反是不考虑大小关系的。
    开始时我想不考虑大小关系无非是每种答案都出现的若干遍,那么讨论出每种方案的出现次数就好了。
    但后来我发现每种方案的出现次数与方案里不同数的种类有关,就需要枚举gcd,再枚举相同数的个数,复杂度不对,也很难打。
    考试中间也怀疑过是否要把最开始的莫反套路改掉,不过后来还是因为想不到就放弃了。
    最后只得到了杜教筛的斯博分。
    题解:
    考虑在n/d个数中选择k个数并且要求这些数是有序的,那么就相当于给这k个数和n/d一起排队
    每个数前面第一个n/d中的元素就是这个数的值,那么方案数就是(C_{n/d+k-1}^k)
    组合数的角度挺大神的。

    B. B君的回忆##

    痛苦的总结题意:求g(g(g(g(......g(n)))))%p的值。
    g[i]=3g[i-1]-g[i-2]
    只有最外层有%数显然是不能够的,必须保证每次计算都有%数。
    问题在如何求%数。
    题解:
    在每个%数下都有循环节,g(g(n))%p,内层的g(n)就要%模p意义下的循环节
    换言之,外层的%数的循环节就是内层的%数
    就这样得到了一个暴力做法:递归到最里面,把n对找到的%数取%,然后直接回带下标矩阵快速幂
    循环节的处理需要用到bsgs算法
    这样就能得到暴力分了
    正解还不是很会

    C. sanrd##

    痛苦的回忆着两页的式子写题解...所以就不写式子啦
    现在都流行直接舔nc哥的blog
    总结的话,2ab=((a+b)^2-a^2-b^2),这样就可以把指数上的拆不开的玩意拆开了
    还有的话,考场不要怂非常难看的题面,就算再男也要迎男而上
    还有的话,调代码要调良辰吉日,不然会悲恸万年
    还有的话,考试如果能打暴力就别打正解
    在hzoj,暴力碾标算
    再打一次绝对过不了编译
    总结:
    调代码真累
    考试还是要多思考
    为啥比之前考试多了1.5h却越来越颓了

    数学专项测试3#

    A. young##

    考场根本没有任何梦想...
    考后还是没有梦想...
    大致学到了期望就用总答案/总方案吧..
    所以什么都没有学到不是吗..

    B. Simple##

    先%一波考场A的DC...
    考场根本没有任何梦想...
    题解:
    设f表示长度为i的方案
    首先
    对于这个长度为i的数字,若循环节<i就一定不行
    k到了下一个循环节的第一个数就不行了,本来的循环节不比全是0小
    所以一定不能有循环节
    然后
    对于一个没有循环节的数会有循环同构i种情况出现
    那么一定只有最小的那个数在首位时是可以的
    如果有两个最小的数就取后面数小的那一个
    因为在不断补0的过程中,数大的才能合法
    那么
    长度为i时就除掉循环节长度<i的情况,(10^{n/j})会出现循环节小于j的情况
    所以要容斥
    设F为恰好,G为钦定
    G=(sum)F[d|i]
    F就用(mu)容斥
    (F[n]=frac{10^n-{}sum_{d|n}mu(n/d)10^{d}}{n})
    (ans=sum_{i=1}^niF[i])
    拆开然后发现是莫反杜教筛,还要用等差*等比求出系数

    C. 小 H 爱染色##

    暴力都打不出来,题目看错,给的是点值式然而一直没有意识到...
    就一直调也调不出来,坚定的认为是自己的代码错了
    暴力做法可以求点值的话就是拉格朗日插值,又因为这个点值是连续的,所以可以O(n)插值,O(nm)求暴力答案
    题解
    (误
    总结:
    这次考试前期困困,中期不会,后期疯狂打暴力
    没有想正解,或者说想过正解但不深刻
    没有充分利用时间,造成了时间上的浪费,真不如睡觉
    以后要充分思考

    省选模拟4#

    A. 点点的圈圈##

    一开始想了半天半平面交。。。
    题解:由于题目中圆只有相离和包含两种特殊关系,因此可以看作一个树形结构,问题变成了如何找到该圆的父亲节点。
    考虑把每个圆考虑成区间存在,就是在左端点插入,右端点删除,并把每个圆拆成上半圆和下半圆。
    因为知道这个半圆是上半圆还是下半圆并且知道这个圆的编号后可以O(1)求出某个横坐标交这个半圆的位置
    所以把这些半圆插入set,set里第一关键字是y值,第二关键字是上半圆<下半圆
    因为所有圆不相交,所以某时刻圆的上下位置关系就是这些圆存在任意时刻的上下位置关系
    现在考虑对于新插入的一个下半圆如何找到它的父亲节点。设nxt为后继元素。
    有三种情况:
    nxt为上半圆。那么就说明nxt为它的兄弟节点,nxt的父亲就是它的父亲。
    nxt为下半圆。说明nxt是它的父亲。
    没有后继。说明它是森林中某棵树的根。
    讨论完所有情况后建图跑树形dp就行了。
    kd-tree做法:
    容易发现该题是在求某个圆内的所有圆心,所以把圆心建kd-tree,然后把每个圆心插入,询问所有和它距离小于等于半径的点。
    减枝:
    如果该子树与圆心的最大距离都比半径小,直接给这个节点的Vec装上这个圆心。
    如果该子树与圆心的最大距离都比半径大,直接返回。
    并且经过每个点时判断如果这个点的圆被该圆心的圆包含就给这个点的圆心更新父亲,其实此时就取第一个就是对的。
    本来想“给这个节点的Vec装上这个圆心”这里也只取一个半径最小的就好了,以为跟判断每个点时是一样的
    但是因为在减枝时我们只判断了圆心在这个圆内,在不保证半径的大小关系时这个圆不一定包含那个圆心,如同心圆。
    然后再来一个kd-tree上更新答案,从上到下更新每个点的父亲。

    B. 点点的计算##

    题解:通过大神的一番证明可以得知T(n,k)=lcm(n-k+1,....n)
    问题变成了如何求以某个点为结尾长度为k的lcm。
    单独考虑每个质因子,从n-1变成n的考虑时会添进来许多质因子的次幂。
    这样会使得计算时多考虑了一些质因子的贡献。
    考虑构造可持久化线段树,并把答案由n-1转移到n
    分情况讨论:
    n中该质因子次幂最大,就把之前的该质因子都不要了
    n中该质因子次幂不是最大,就一直不要,直到那个比它大的质因子次幂出现
    这样看着不是很直观,换一种讨论方式,讨论每个点的质因子做出的贡献
    n这个点做出的贡献就是它自己n,那么之前的点相应的作出的贡献就要减少,考虑把之前的质因子的贡献删除的思路。
    平白多了个n的质因子就要删掉本来做贡献的一些数的贡献。
    不妨维护质因子的栈,然后每次更新新数时从栈内一直弹贡献。

    C. 点点的最大流##

    题解看不懂,学习了G_Keng的做法,目前还没有暴力分高。
    考虑一个环的最小边,如果这个环对最大流起到限制作用,那么最小边一定是会跑满的。
    所以边双找到每个环后,把最小边的权值赋给这个环上的其它边。
    修改时要求修改树结构,维护链最小值,用LCT维护。
    总结:这次考试不是很理想,T1把圆形当成了长为2r,宽为2r的正方形所以暴力都没打好,T2又审不清题意,问的是若干个数的lcm,此时的lcm不是积/gcd,T3又没有理想的只打暴力。
    考试时间缩短成3.5h,更应该充分思考了,千万不能掉链子啊。

    省选模拟5

    又是一场大神切菜鸡的考试。。

    A. 青蛙##

    题解(我的理解):青蛙按花费升序。
    考虑K个相邻两两的石头,如果在最开始就有任意两块相邻的石头距离大于d,就说明一个青蛙都跳不过去。
    此时就需要一只青蛙牺牲自己完成任务,我们取最小的花费,让它跳完所有距离大于d的青蛙,其它青蛙一次跳过去,这是最优的。
    如果不是的话,就会有x只青蛙能跳过去,考虑现在剩下的石头,一定可以让跳过去的青蛙消灭掉,因为往前跳距离不会增大,该跳到的石头一样能跳到。
    所以此时答案就是x只青蛙无伤+n-x只青蛙的花费

    B. 一起自习的日子##

    三次伯努利数,再来个二项式反演。B有B-和B+,B+比较好用,方法是把B- 的B[1]再最后改成1/2。
    注意B+没有(0^k)那一项,因此如果说k=0就少了(0^0)的1,这些细节要注意。
    另一种做法是第一次插值插出自然数幂和,第二次发现它是一个前缀和的形式,直接把第一次的k+6个“基”(是这么叫吗)取前缀和。
    第三次发现它还是一个跳着的前缀和的形式下标首项是a,公差为d,感性理解它也一定能被一个多项式表示,对它取前缀和次数+1。
    所以自然数幂和次数k+1,前缀和等价于积分次数+1,再次前缀和次数+1,所以开始时需要插出k+3项来,插多无所谓。
    “a+i×d"的时候i×d会暴int。

    C. 字符串##

    这真是LCT好题,突破了我对模板的定义。
    题意:在线,两种操作:串末添加字符,给定l,r求出[l,r]出现次数大于等于两次的字符串的长度的最大值。
    题解:构建SAM,考虑暴力查找的时候如何找到这个长度。
    首先,处理出SAM上每个节点最后一次出现的位置为last[p],那么当节点的last更新时就用last[p]和位置更新答案min(len[p],last[p]-l+1),显然可以用可持久化线段树维护
    对于l(in)[1,last[p]-l],把答案对常数Len[p]取max,对于l(in)[last[p]-l+1,last[p]]答案对等差数列取max,每次修改暴力跳父亲修改,这是暴力。
    考虑优化,发现把链上last修改等价于在access时嗔出一条实链,修改这个实链上的答案。
    发现每次access都把实链上的last置成相同,我们利用这个性质做题。
    二分答案,在线段树上维护每个点为结尾的合法串的长度。
    查询时在R的线段树上查询[l+mid-1,r]的最大值是否大于等于mid就行了。
    利用endpos集合,对于这个点的last位置,在线段树上修改last位置值为len。
    此时维护的是结尾为某个值,与刚开始的开头是谁不一样了。
    在lct上access时就一个实链一个实链的跳就行,每个实链更新一下线段树答案。
    学习下G_Keng做法,线段树限制下节点个数。
    在Splay上找父亲为某个值时一定要判断它不能根还继续判父亲为0时才跳出,因为LCTSplay时某条实链的根会有父亲节点。
    总结:
    考场还是什么都想不到,努力想正解却每次都只能打暴力,一定要多想正解。
    看到自己不会的题根本就没有梦想,思考也仅仅止于皮毛,没有深入进去。
    要努力。

    省选模拟6#

    A. Yist##

    题解:
    题目中告诉你的每次操作是由某个点连边的点作出了贡献,但是考虑每个点作出的贡献的话,发现每一轮只与开始权值p有关
    所以只要处理出每个点的贡献,再用等比数列求和求出答案就行。
    暴力求贡献是O(mk)的,所以用一种特殊的分块思想把点度数大于sqrt的称作大块,小的称作小块。
    对小块操作的话,由于边数不超过sqrt,随便枚举也不会超过O(nsqrt)
    对大块操作的话,首先大块对大块,大块不超过sqrt个,所以随便枚举,大块对小块就有意思了
    对大块维护一个懒标记表示和我相邻的小点要被操作多少次,考虑在操作小块时把这个答案累加给小块。
    最后还要把所有边都扫一遍。
    总复杂度O(nsqrt)。

    B. Ernd##

    在前端插入一个字符:沿parent tree上儿子边走。
    在后端插入:沿sam边走。
    所以维护一个sam边和parent tree边的并集并在上边拓扑转移,转移方程
    (f[to[i]]=max(f[to[i]],f[i]+(len[to[i]]-len[i])*endpos[to[i]]))
    因为考虑实际含义长度小的endpos一定比endpos大的大,所以贪心在这个点走到不能走为止。

    C. Sanrd##

    定理一:LIS与LDS的交集最多只有一个。显然。
    那么引理一:一个LIS不合法条件是(sum_{i=1}^k)f[i]=All。
    i为LIS的每个位置,f[i]为i这个位置经过的LDS的个数。
    那么只需要维护两个F不同的LIS就一定有一个合法。
    BIT维护以点为结尾的LDS f数组,为起点的LDS g数组,那么All=(sum_{iin LDS} LDS_i==LDS f[i])

    省选模拟7

    A. 翻转硬币##

    有道原题叫星空,当时懵着按照题解水过,导致现在没有印象了
    题解:
    维护异或差分得到2k个1的位置,题目目的就是要使得这2k个位置变成0的花费最小。
    预处理两两点消掉的最小花费,状压DP转移就行了。

    B. 回文子串##

    题解:
    分块,块长至少大于k,每块处理出块内合法字符串,处理出相邻块间合法字符串。
    修改时,大块合法字符串就固定,零散暴力修改。
    查询时,大块收集答案,零散暴力跑。
    听上去挺简单,实际操作很吃×,kx都肾虚了
    题解:
    维护线段树,每个节点维护以之为开头的合法字符串个数,字符。
    用manacher跑合法字符串,因为每次manacher字符个数是k级别的,所以可以直接线段树查找。
    修改时,[l,r-k+1]区间修改,[l-k+1],[r-k+2,r]manacher重新算答案,需要用到后面的k个字符,所以长度要到2k。
    查询时,[l,r-k+1]暴力查询,[r-k+2,r]单独跑manacher出答案。
    注意k的奇偶在manacher计算以之为开头的回文串时要分情况。
    View Code

    C. 最大价值##

    10分:瞎打
    60分:考虑到选择物品一定情况下,最优选择方案一定a递增
    按照a升序,定义dp[i][j]=max(dp[i-1][j],dp[i-1][j-1]+(j-1)a[i]+b[i])
    题解:设g为dp数组的差分表,差分表是啥呢,就是个数组。
    那么考虑取max操作决策变化的情况即dp[i-1][j]与dp[i-1][j-1]+(j-1)
    a[i]+b[i]的大小关系。
    f就是dp数组。
    (dp[i-1][j]>dp[i-1][j-1]+(j-1)*a[i]+b[i])
    此时的(g[i][j]=f[i][j]-f[i][j-1]=f[i-1][j]-f[i-1][j-1]=g[i-1][j])
    (dp[i-1][j]=dp[i-1][j-1]+(j-1)*a[i]+b[i])
    (g[i][j]=f[i][j]-f[i][j-1]=f[i-1][j-1]+(j-1)*a[i]+b[i]-f[i-1][j-1]=(i-1)*a[i]+b[i])
    (dp[i-1][j]<dp[i-1][j-1]+(j-1)*a[i]+b[i])
    (g[i][j]=f[i][j]-f[i][j-1]=f[i-1][j-1]+(j-1)*a[i]+b[i]-f[i-1][j-2]-(j-2)*a[i]-b[i]=f[i-1][j-1]-f[i-1][j-2]+a[i]=g[i-1][j-1]+a[i])
    至此我们已经发现了规律,把(j-1)*a[i]+b[i]这个东西和g[i][x]比较然后在平衡树上反复横跳。
    找到位置就把它插入,前面比它大的值不变,后面比它小的值加上a[i]。
    支持动态插入,区间加,平衡树维护。
    View Code

    总结:
    又倒数啦,实力不行就没什么好说滴
    (T1CE是什么鬼啊,end是个关键字啊喂
    考场打瞌睡这可是禁忌啊必须要改正的
    就算考试考原题我依然毫无头绪的弱点瞬间暴露
    今后要记死题别做完就忘啊啊啊
    考场节奏要把控好,开局看题也要有个时间限制
    没有希望也要看题啊啊啊不要总做个没有梦想只会打暴力的咸鱼啊啊啊
    (或许现在连咸鱼都算不上啦
    总之一路向前走吧。

    省选模拟8

    A. 序列##

    题意:给定一个序列,要求支持区间加,区间与一个数取max,查询一个位置的值以及这个位置的数变化次数。n=m=1e5
    80分:装作是小清新线段树。
    题解:对原序列进行分块。
    区间加:打懒标记
    区间取max:每个块维护一个vector记录一个递增的取max的值
    查询:对这个位置的块rebuild
    在区间取max操作时可能此时的操作应该是max(x+b,c),即x加上懒标记的加法对c取max
    那么可以变成max(x,c-b)+b的神奇东西,这样的话就取max操作就只和x有关而与加法标记无关了。

    B. 旅行计划##

    题意:一张无向图,边带权,每次询问形如"u v k"表示询问从u到v的路径中权值和mod K的最小值是多少 n=m=q=1e5
    13分:考虑K为奇数的情况,可以重复走u到v的路径多次,因此一定是0。
    23分:记忆化搜索,dp[i][j]表示从u搜到i长度为j是否可行。
    但考场上打不出来。
    29分:考虑构造奇偶染色,若有奇环则一定可以通过走奇环来改变奇偶性,否则看两点颜色是否相同。
    题解:设d=gcd(K,l1,l2,....le)显然答案一定是d的倍数。
    那么把所有都除以d再乘回去答案也是对的。
    此时gcd(K,l1,l2...le)=1,那么存在aK+bl1+cl2+....+ele=1
    那么就有2aK+2bl1+2cl2+....+2ele=2
    也就是说可以通过每条边回去a,b,c,d....e次使答案加2
    问题转化成了答案的奇偶性关系。
    考虑K为奇数可以反复走u->v->u使答案为0。
    那么只有K为偶数的情况了。
    现在的d和K有关,所以考虑如何去掉K的约束,如果每次询问都要套个d=gcd(,,),就gg了。设D=gcd(l1,l2,....l2)。
    此时分情况讨论:
    如果K中2的个数比gcd中的多,那答案就是0。我忘了为啥了。。
    奇环可以改变路径的奇偶性,有奇环就一定使答案为0。
    路径为偶数(同色)答案显然为0。
    否则答案就是1*gcd(d,K)。

    C. Hack##

    最小割可以割掉所有的路径,但无法解决第二个限制条件。
    发现割不止一次的情况等价于在被割掉的S/T集合,T集合中有流回S的边。
    题解:每条边建边权为inf 的反向边,那么上述情况有增广路不满足情况。
    然后直接跑最大流就可以了。

    省选模拟9#

    A. Surprise me##

    题意:求所有点对的值积欧拉函数与距离的乘积的和。n=2e5。
    首先根据定义有(phi(a,b)=frac{phi(a)phi(b)gcd(a,b)}{phi(gcd(a,b))})
    化简一番可以得到(=sum_{d=1}^nsum_{gcd|d}frac{gcd}{phi(gcd)}sum_{a=1}^{frac{n}{d}}phi(ad)sum_{b=1}^{frac{n}{d}}phi(bd)Dis(ad,bd))
    距离的式子可以拆成深度相关的式子,其中两项是相同的,还有一项是lca的深度,考虑到lca只与关键点个数有关,每次建虚树得到答案。

    B. 过河##

    20分做法:考虑f[state]表示猪的位置状态以及人当前在的河岸状态是否存在过,bfs每种状态在第一次出现时塞进队列。
    题解:最开始人带的那头猪王显然必须包括在所有三元组里,不妨删掉那头猪剩下每个二元组都形成了一条边。
    只有在有猪王的岸才会有打架,要求有猪王的岸没有连边,考虑到人的带猪顺序一定是猪王,很多独立猪,把猪王带回来,再带很多独立猪过去。
    除了带猪王回来前后的两头猪因为跟着人没有限制,其余的一定形成了二分图的结构,那就可以枚举这两头猪,接着奇偶染色就行。
    继续优化,只枚举一头猪,问题变成了是否有一头猪使得删掉它后能把所有奇环消灭。建出dfs树,返祖边和树边构成了环,多个返祖边和树边也构成了环。
    这里因为多个返祖边构成的环一定可以拆成多个有两条返祖边和树边构成的环,所以只要满足消灭所有这样的环就满足消灭所有多个返祖边和树边形成的 环。
    是否存在一个点被所有的奇环上的返祖边包含,并且子树内不存在既被奇环又被偶环包括的点。
    可以通过树型dp求出这个点被包含为奇/偶环的深度最小的返祖边起点。

    C. NPIO 十合一##

    交互题咕咕

    省选模拟10#

    A. 食物链##

    B. 选点游戏##

    C. 随机##

    交互题咕咕

  • 相关阅读:
    森林 BZOJ 3123
    calc BZOJ 2655
    修路 BZOJ 4774
    无聊的计算器【数论多合一】
    矩阵乘法 BZOJ 2738
    K大数查询 BZOJ 3110
    发展城市 BZOJ 3700
    降雨量 BZOJ 1067
    chrome中showModalDialog解决方案
    MFC webbrowser读取文档的meta分析
  • 原文地址:https://www.cnblogs.com/hzoi2018-xuefeng/p/12347680.html
Copyright © 2011-2022 走看看