牛客练习
文章平均质量分 55
issue是fw
19 years old, struggling in life, chasing daydreams.
展开
-
牛客挑战赛53 C.奇奇怪怪的魔法阵(状压)
Link我们要求fT=∑S∈T[S为独立集]f_T=\sum\limits_{S\in T}[S为独立集]fT=S∈T∑[S为独立集]考虑集合TTT的最低位二进制位代表的集合是yyy(这个点设为uuu),其他二进制位代表的是xxx那么T=x+yT=x+yT=x+y显然,若SSS集合中不包含集合yyy(点uuu),方案数为fxf_xfxSSS集合中不包含集合xxx,方案数为fy=1f_y=1fy=1若SSS中包含集合yyy且包含集合xxx中的部分点需要满足包含的集合xxx中那些点不与点u原创 2021-10-18 10:08:30 · 177 阅读 · 0 评论 -
牛客练习赛87 D.小G的排列-加强版(思维,组合数学)
LINK考虑用n!n!n!减去大于等于m+1m+1m+1连续段的排列数记sol(n,m)sol(n,m)sol(n,m)表示长度为nnn的所有排列中,长度为mmm的连续段出现过多少次由于长度为mmm的连续段有n−m+1n-m+1n−m+1种,把这个看成一个元素和其他n−mn-mn−m个元素排列得到sol(n,m)=(n−m+1)∗(n−m+1)!∗(1+[m>1])sol(n,m)=(n-m+1)*(n-m+1)!*(1+[m>1])sol(n,m)=(n−m+1)∗(n−m+1)!∗(原创 2021-08-29 19:34:20 · 256 阅读 · 0 评论 -
牛客练习赛87 E.贪吃蛇(构造矩阵快速幂)
LINK考虑刚开局,我们让次大的蛇吃掉最大的蛇,次次大的蛇再吃掉原来次大的蛇…这样最大蛇长累加到了n-1条蛇上,次大累加到n-2条蛇上…显然这样是最优的操作一轮过后,原来最小的蛇变成最大的蛇所以奇数轮我们倒序模拟(因为数组升序),偶数轮我们正序模拟(因为数组降序)那么由于mmm的时间可以吃⌊mx⌋+1\lfloor \frac{m}{x} \rfloor+1⌊xm⌋+1次,最后剩下的那条蛇就是答案(因为主角可以开局可以选择任意的蛇)看起来好像模拟⌊mx⌋+1\lfloor \frac{m}{x原创 2021-08-29 16:57:06 · 326 阅读 · 0 评论 -
牛客小白月赛37 E.紫妹永不服输(构造)
LINK若存在xxx个RRR和yyy个PPP那么形成的RPRPRP和PRPRPR总数为x∗y=n+mx*y=n+mx∗y=n+m所以直接枚举n+mn+mn+m的因子找到合法的xxx和yyy,用合法的x,yx,yx,y构造出恰有nnn个RPRPRP的即可假如把xxx个RRR放在前面把yyy个PPP放在后面形成RPRPRP共x∗yx*yx∗y个,PRPRPR共000个我们把最后一个RRR往右挪到第kkk个PPP后面,就把kkk个RPRPRP转化成了kkk个PRPRPR于是我们把⌊my⌋\lfloo原创 2021-08-29 14:40:43 · 512 阅读 · 0 评论 -
牛客IOI周赛21-普及组 D.瞎位移群岛(bfs)
LINK由于每一秒牛牛都必定在岛屿上,所以只需要考虑当前这一秒能在哪些岛屿上即可但是每一秒都去bfsbfsbfs时间开销太大,考虑优化对于每一秒,设xxx岛屿发生了移动我们发现整个图的变化是非常小的,只有xxx相邻的岛屿会收到影响设yyy和xxx号岛屿相邻若yyy可达而xxx不可达,我们从xxx开始bfsbfsbfs若yyy不可达而xxx可达,我们从yyy开始bfsbfsbfs若两者都可达,无需bfsbfsbfs若两者都不可达,无需bfsbfsbfs这样就在O(T+k)O(T+k)O(原创 2021-07-02 21:42:36 · 251 阅读 · 0 评论 -
牛客IOI周赛26-提高组 A.逆序对(逆序对思维)
LINK考虑一次操作对逆序数的影响对于操作一交换ala_lal和ara_rar设len=r−l−1len=r-l-1len=r−l−1先考虑ala_lal和ara_rar形成的逆序对数为kkk,那么交换后数量为1−k1-k1−k考虑ala_lal和a[l+1...r−1]a[l+1...r-1]a[l+1...r−1]形成zzz个逆序对,那么交换之后就形成len−zlen-zlen−z个逆序对考虑ara_rar和a[l+1...r−1]a[l+1...r-1]a[l+1...r−1原创 2021-07-02 21:30:38 · 348 阅读 · 0 评论 -
牛客练习赛70 F.曲调(离线,思维,权值线段树)
LINK不看题解完全想不到,写下思路缕一缕 (顺便福利以下大众)对数组aaa做前缀和,那么每次只需要找到[l,r][l,r][l,r]内差值最小的两个数即可但是这个也显然做不了,考虑对询问区间排序后按照rrr端点离线顺序扫描每个iii考虑和前面每个aqa_qaq的差值为abs(ai−aq)abs(a_i-a_q)abs(ai−aq),那么我可以更新所有左端点小于等于qqq的答案这个只需要以左端点对区间排序,插入到线段树上即可区间取minminmin每次取出右端点为iii的区间的答案原创 2021-06-30 16:27:16 · 237 阅读 · 0 评论 -
2020CSP-J普及组复赛 D.方格取数(number)(简单dp)
LINK容易想到定义f[i][j]f[i][j]f[i][j]表示前iii列处于位置jjj的花费定义W(i,j,q)W(i,j,q)W(i,j,q)表示第iii列第min(j,q)min(j,q)min(j,q)行到第max(j,q)max(j,q)max(j,q)行的权值那么枚举状态O(nm)O(nm)O(nm),转移枚举一个qqq得到f[i][j]=max{f[i−1][q]+W(i,j,q)}\rm f[i][j]=max\{f[i-1][q]+W(i,j,q)\}f[i][j]=max{f原创 2021-06-30 12:06:46 · 641 阅读 · 0 评论 -
牛客练习赛85 F.音游家的谱面(Hard version)(dp的多种优化)
LINK文章目录T1T1T1T2T2T2T3T3T3T1T1T1综合性很强的一题首先可以定义f[i][j][q]f[i][j][q]f[i][j][q]表示当前接到了[1,i][1,i][1,i]的音符,左手在jjj右手在qqq的最小时间但是发现想接到第iii个音符,必然有一只手在aia_iai位置所以重新定义f[i][j]f[i][j]f[i][j]表示当前接到了[1,i][1,i][1,i]的音符,一只手在aia_iai处,一只手在jjj处然后O(nm)O(nm)O(nm)枚举状态,原创 2021-06-28 00:00:55 · 340 阅读 · 1 评论 -
牛客挑战赛51 C.NIT的数(数位dp)
LINK题意给你一个正整数xxx,求第kkk 小的正整数 yyy 满足 x≤yx \leq yx≤y 且 yyy 是一个回文数。写出一个能求出[0,x][0,x][0,x]有多少回文数的函数就可以使用二分查找来解决问题那么对于确定的xxx,设有rrr位数字那么[1,r−1][1,r-1][1,r−1]位的数字一定都小于xxx,于是可以直接组合数算出方案至于那些位数是rrr的数字,可以用数位dpdpdp因为算的是回文数,于是只需要从高位往低位枚举一半就可以直到是否满足条件如果在[r/2+1,原创 2021-06-20 14:07:26 · 328 阅读 · 0 评论 -
牛客挑战赛51 B.NIT的图(二分查找)
LINK先dfsdfsdfs求出所有连通块设这个连通块点数为pip_ipi,边数为edgeiedge_iedgei,那么这个连通块离完全图还剩pi∗(pi−1)/2p_i*(p_i-1)/2pi∗(pi−1)/2条边可以加sum=∑pi∗(pi−1)/2−edgeisum=\sum p_i*(p_i-1)/2-edge_isum=∑pi∗(pi−1)/2−edgei添加这sumsumsum条边,连通块数量不变否则,就需要在两个连通块之间连边了,先对连通块以pip_ipi为关键字排个原创 2021-06-20 13:43:56 · 244 阅读 · 0 评论 -
牛客挑战赛51 A.NIT的签到题(暴力gcd)
LINK题意输入四个数 a,b,c,da,b,c,da,b,c,d,请你输出一个正整数xxx满足xxx是aaa的倍数且xxx是ccc的倍数,另外满足bbb是xxx的倍数且ddd是xxx的倍数。(a<x<b,c<x<d)(a<x<b,c<x<d)(a<x<b,c<x<d)xxx是a,ca,ca,c的倍数,由于lcm(a,c)lcm(a,c)lcm(a,c)是最小满足条件的数,所以xxx是lcm(a,c)lcm(a,c)lcm(原创 2021-06-20 09:55:04 · 1607 阅读 · 0 评论 -
牛客小白月赛35 J.溪染的优惠券(贪心01背包)
LINK有点像010101背包,但是又不完全是原因在于使用的物品有限制,使得物品的使用次序是未知的这样显然无法扫一遍做010101背包如果按照aia_iai排序也是不对的,限制大的不一定先使用若使用变为k−bik-b_ik−bi,这样中间错过了许多小型优惠劵,可能先使用中间的才更优于是想到按照ai−bia_i-b_iai−bi排序,直接做010101背包即可.这样选择物品的顺序满足ai−bi>aj−bja_i-b_i>a_j-b_jai−bi>aj−bj如果原创 2021-06-19 15:11:42 · 322 阅读 · 0 评论 -
牛客小白月赛35 G.反·反爬虫函数(随机....)
LINK随机一下发现这个函数生成的是非常随机的于是只需要暴力预处理即可#include <bits/stdc++.h>using namespace std;const int mod = 1e9+7;const int maxn = 3e5+10;int n,vis[maxn];mt19937 rnd(time(0));char a[maxn],ans[maxn][10];int calculatetta(char* a) { int b = 0; for (i原创 2021-06-19 14:57:43 · 250 阅读 · 0 评论 -
牛客练习赛84 D.牛客推荐系统开发之动态特征获取(set应用)
LINK作为DDD题的受害者忍不住来写一发题解…其实就是个简单的STLSTLSTL模拟,但是数组用混了就非常脑瘫对n个询问按时间戳排序,并设置一个set<work>s\rm set<work>sset<work>s存机器缓存的特征workworkwork是结构体,包含这个缓存的特征类型和优先级,重载<为优先级更小的优先级使用变量jibie\rm jibiejibie维护,每次加入新的特征类型把jibie++jibie++jibie++即可(后来的优先级原创 2021-06-13 12:38:12 · 243 阅读 · 0 评论 -
牛客练习赛83 E.牛客推荐系统开发之标签重复度
LINK比较明显的点分治问题,考虑如何计算通过点uuu的路径贡献dfsdfsdfs获得从uuu出发的所有路径,显然经过uuu的所有路径都是由uuu出发的两条路径拼接而来每条路径存成一个pairpairpair,第一关键字为最大值,第二关键词为最小值现在就是一个简单的二维偏序问题sortsortsort一下那么每个位置的最大值一定比前面大然后使用动态开点权值线段树,最小值为下标,维护每个位置的数量和权值和即可比如对于第iii条路径,最大权值为xxx,最小权值为yyy,考虑和前i−1i-1i−1条原创 2021-06-13 11:20:20 · 241 阅读 · 0 评论 -
牛客练习赛84 C.牛客推荐系统开发之选飞行棋子(状态dp)
LINK顺序考虑1...n1...n1...n每个物品的选择情况由于只有444个人,每个人只有选和没选两种状态,考虑状压定义f[i][j]f[i][j]f[i][j]表示前iii个物品,这444个人的选择状态为jjj的方案数(二进制为111表示选了)枚举物品iii,枚举状态jjj对于第iii个物品,枚举是第1,2,3,41,2,3,41,2,3,4个人取类似的转移就好了#include <bits/stdc++.h>using namespace std;const int m原创 2021-06-12 12:23:44 · 259 阅读 · 0 评论 -
牛客练习赛83 C.集合操作(二分,单调性)
LINK每次把最大的数字减去ppp,显然随着kkk的增大,集合的最大值是单调不增的所以我们可以二分最大值midmidmid计算把所有数操作到小于等于midmidmid需要的操作次数fff不过这样可能无法精确的计算到f=kf=kf=k的时候因为可能存在多个数值相等,导致随着最大值变化操作次数突变那么就二分到fff小于等于kkk但最接近kkk的时候可以证明fff和kkk的差值不会多于n−1n-1n−1因为如果差值为nnn,那么所有数可以整体减去ppp,显然这不是最优的fff之后暴力操作即可#原创 2021-06-03 17:02:54 · 205 阅读 · 0 评论 -
牛客练习赛81 B.小 Q 与彼岸花(Tire树上贪心或区间DP)
LINK考虑对每个[1,i][1,i][1,i]建立一颗01Tire\rm 01Tire01Tire树那么我们就可以利用前缀和O(1)O(1)O(1)得到区间[l,r][l,r][l,r]的Tire\rm TireTire树在树上从高位往低位dfsdfsdfs设两个数分别走到树上的节点le\rm lele和re\rm rere若lelele或rerere的任意一个往下只能走000或111,那么留给另一个点的走法最多是222当lelele和rerere往下都能走000或111,乍一看好像有2∗22原创 2021-06-03 16:21:55 · 248 阅读 · 0 评论 -
牛客练习赛82 B.Mocha 的序列(小思维,同余)
LINK题意对于每次询问333,需要回答∏i=lrai%(r−l+1)!\prod\limits_{i=l}^ra_i\%(r-l+1)!i=l∏rai%(r−l+1)!因为初始ai=ia_i=iai=i其中∏i=lrai\prod\limits_{i=l}^ra_ii=l∏rai是连续的一段aia_iai,区间长度为r−l+1r-l+1r−l+1而注意到(r−l+1)!=1∗2∗3...∗(r−l+1)(r-l+1)!=1*2*3...*(r-l+1)(r−l+1)!=1∗2∗3.原创 2021-05-18 10:04:50 · 269 阅读 · 0 评论 -
K.破忒头的匿名信(ac自动机的match指针)
LINK把所有模式串放一起建立acacac自动机定义f[i]f[i]f[i]为匹配[1,i][1,i][1,i]结尾的最小花费每次在failfailfail树上跳着转移就好了但是我们可以加速一下,因为failfailfail树上只有有单词的节点才是有用的所以我们定义一个matchmatchmatch数组,当我们要把zi[u][i]zi[u][i]zi[u][i]压入队列时处理一下它的matchmatchmatch数组如果fail[zi[u][i]]fail[zi[u][i]]fail[zi[u]原创 2021-03-05 20:28:30 · 357 阅读 · 0 评论 -
A.托米的字符串(期望,前缀和)
LINK任取一个子串,元音的期望占比是元音个数除以长度我们可以求f[i]f[i]f[i]表示长度为iii的子串中元音的期望占比但是有点难顶,不太好求的样子考虑递推,我们定义sum[i]sum[i]sum[i]为元音的前缀数量f[1]=sum[n]f[1]=sum[n]f[1]=sum[n]f[2]f[2]f[2]呢?长度为222的串比长度为111的串多覆盖了[2,n−1][2,n-1][2,n−1]一次长度为333的串又比长度为222的串多覆盖[3,n−2][3,n-2][3,n−2]一次所原创 2021-03-05 20:06:42 · 283 阅读 · 0 评论 -
2020 CCPC Wannafly 纳新一百的石子游戏(NIM博弈原理)
LINK做出这题需要对nimnimnim博弈的原理比较了解,关于nimnimnim博弈我写过一篇证明nim博弈的一点证明如果先手能赢,当前状态必定是奇状态,设二进制是奇的最高位是xxx我们需要变到偶数状态,就必然要把xxx这一位取反,所以方案数是所有第xxx位二进制是111的个数#include <bits/stdc++.h>using namespace std;#define int long longconst int maxn = 2e5+10;int n,a[maxn原创 2021-03-05 18:38:28 · 183 阅读 · 0 评论 -
CF803F Coprime Subsequences(容斥)
LINK考虑先求出最大公约数大于111的子序列个数显然,我们可以枚举这个最大公约数我们预处理一个ok[i]ok[i]ok[i]表示有ok[i]ok[i]ok[i]个数字含有约数iii然后我们去枚举子序列的最大公约数xxx来计算答案我们定义f[i]f[i]f[i]表示最大公约数是iii倍数的方案数f[i]=2ok[i]−1f[i]=2^{ok[i]}-1f[i]=2ok[i]−1怎么求最大公约数是iii的方案数呢??我们定义g[i]g[i]g[i]表示最大公约数是iii的方案数那么g[i]=原创 2021-02-25 17:26:35 · 357 阅读 · 0 评论 -
2021牛客寒假训练营 系数(二项式定理凑系数)
LINK题意求f(x)=(x2+x−1)nf(x)=(x^2+x-1)^nf(x)=(x2+x−1)n的第kkk项系数答案对333取余观察数据范围,可以想到应该是O(log)O(log)O(log)一次的询问应该不是什么多项式(可能)假如能用二项式定理,第kkk项系数可以用组合数表示出来但是这里不能用二项式定理,因为里面有三项但是我们可以变形一下!!(x2−2x+1)n(x^2-2x+1)^n(x2−2x+1)n的系数和f(x)f(x)f(x)完全相同因为我们只是加上了3x3x3x的原创 2021-02-25 15:32:49 · 264 阅读 · 0 评论 -
2021牛客寒假训练营 F.组合数问题(复数二项式展开)
LINK二项式定理,得到(1+1)n=Cn0+Cn1+Cn2....(1+1)^n=C_n^0+C_n^1+C_n^2....(1+1)n=Cn0+Cn1+Cn2....(1−1)n=Cn0−Cn1+Cn2.....(1-1)^n=C_n^0-C_n^1+C_n^2.....(1−1)n=Cn0−Cn1+Cn2.....两式相加得到2n=2(Cn0+Cn2+Cn4......)2^{n}=2(C_n^0+C_n^2+C_n^4......)2n=2(Cn0+Cn2+Cn4.....原创 2021-02-25 15:10:53 · 430 阅读 · 0 评论 -
2021牛客训练营5 B 比武招亲(上)(组合数学)
LINK直接考虑数字iii作为最大值多少次,作为最小值多少次最大值加,最小值减,即可得解。首先mmm个数字先选出一个xxx作为最大值,相当于求[1,x−1][1,x-1][1,x−1]选出m−1m-1m−1个数求有多少种本质不同的方案然后mmm个数字先选出一个xxx作为最小值,相当于求[x,n][x,n][x,n]选出m−1m-1m−1个数求有多少种本质不同的方案我们发现本质都是相同的,稍微把模型转化以下,我们需要解决这样一个问题mmm个小球分成nnn组,求本质不同的分法mmm个小球形成m原创 2021-02-23 14:08:37 · 359 阅读 · 0 评论 -
2021牛客寒假训练营5 A.美丽的路径(二分+思维bfs)
LINK二分美丽值xxx(hh没想到吧)大于等于xxx的点标注为111,否则标注为000Ⅰ.若存在一条路径有连续的两个点为111,那么我们可以无限走这条点,一定满足条件因为最后中位数一定是这两个之一Ⅱ.否则,走过一个111点就必须至少走过一个000点,所以重复走动一定不划算那么我们就要找到一条路径满足111的个数大于等于000的个数,而且是010101或101010交替,不然不合法至于判断就比较简单了判断Ⅰ的话,从起点和终点分别开始bfsbfsbfs那么遍历所有连接两个111点的边,若原创 2021-02-23 13:58:40 · 231 阅读 · 0 评论 -
2021牛客训练营E.树上博弈(简单dfs)
LINK笑死,比赛的时候TLETLETLE到死…一个比较显然的做法,定义f[i]f[i]f[i]为在状态为iii时,先手最后造成的分差那么先把所有状态的叶子节点预处理到vecvecvec数组里去然后因为只能删点,所以是一张DAGDAGDAG图,想用拓扑还是记搜都没问题先手的时候取maxmaxmax,后手的时候取minminmin做完了。!!!但是不能存vector!!!vector!!!vector!!!vectorvectorvector太慢了!!dfsdfsdfs的时候,需要用到哪个状态原创 2021-02-23 13:11:48 · 282 阅读 · 0 评论 -
2021牛客训练营D.石子游戏(思维)
LINKSTD我们按照i%ki\%ki%k把所有石子分成kkk类那么不管怎么操作,每次都让不同类的kkk种都加一设第iii类有numinum_inumi堆,总和是sumisum_isumi,最后变成了xxx设最后都变成了xxx,一定满足等式x∗numi−sumi=x∗numj−sumjx*num_i-sum_i=x*num_j-sum_jx∗numi−sumi=x∗numj−sumj当n%k!=0n\%k!=0n%k!=0时拿两堆numnumnum不一样的可以解得xxx但是当n%原创 2021-02-23 10:36:25 · 268 阅读 · 0 评论 -
牛客练习赛75 E.炒鸡矿工(dp的优化)
传送门T1T1T1定义f[i][j][q]f[i][j][q]f[i][j][q]表示第iii分钟等级为jjj,距离下次收矿还剩qqq分钟的最大收益枚举iii,枚举jjj,枚举qqq,复杂度达到O(tnsi)O(tns_i)O(tnsi)T2T2T2发现可以优化掉第三维我们定义f[i][j]f[i][j]f[i][j]为第iii分钟等级为jjj,刚收完矿的最大收益有转移方程收矿:f[i+si][j]=max(f[i+si][j],f[i][j]+v[i])f[i+s_i][j]=max(原创 2021-02-10 09:48:52 · 260 阅读 · 0 评论 -
牛客练习赛75 C.宝石街(思维,尺取)
传送门数据范围说明正解是O(n)O(n)O(n)的自己考虑应该会发现,玩家拿走的石子是连续的一段假设不连续,比如取了区间[l1,r1][l_1,r_1][l1,r1]和区间[l2,r2][l_2,r_2][l2,r2]显然我可以取[l3,r2][l_3,r_2][l3,r2]的糖果,有l3<=l1l_3<=l_1l3<=l1且[l3,l2−1][l_3,l_2-1][l3,l2−1]的糖果大于等于[l1,r1][l_1,r_1][l1,r1]感性考虑,就是原创 2021-02-09 21:33:43 · 262 阅读 · 0 评论 -
牛客练习赛73 D.离别(尺取+离线线段树)
传送门考虑以每个iii为左端点,预处理右端点的合法区间为[li,ri][l_i,r_i][li,ri]预处理的话只需要尺取就好了,因为处理lil_ili只需要处理到刚好有数等于kkk次处理rir_iri就是刚好有数等于k+1k+1k+1次,此时下标减去一即可那么现在离线询问,按照左端点大到小排序一开始pos=npos=npos=n然后每次让pospospos左移动到当前询问左端点的位置每移动到一个位置,就把那个点的合法右端点[li,ri][l_i,r_i][li,ri]加入线段树原创 2021-02-09 12:57:48 · 209 阅读 · 0 评论 -
牛客练习赛73 C.生涯回忆录(组合数学)
传送门考虑枚举贡献为iii的方案数有多少种贡献为iii,那么[1,i−1][1,i-1][1,i−1]每种数字至少都选了一个至少选一个只需要所有可能减111就好了这部分方案数是∏j=1i−1(2vis[j]−1)\prod\limits_{j=1}^{i-1}(2^{vis[j]}-1)j=1∏i−1(2vis[j]−1)然后大于等于i+1i+1i+1的数字任选,算一个快速幂即可#include <bits/stdc++.h>using namespace std;#defin原创 2021-02-09 10:45:54 · 274 阅读 · 0 评论 -
牛客练习赛72 A.brz的杯子(图思维)
传送门考虑建立一张有向图当i∣ji|ji∣j时,由iii向jjj连一条边那么这显然是一个DAGDAGDAG图,于是我们可以用拓扑排序的方式输出不难发现从根节点111出发的最长链,数字一定是递增的最长链是1 2 4 8 16…的形式那么只需要最长链上的数字递增就好了其他分治可以直接用这条链的数字(因为这条链增长的最慢)#include <bits/stdc++.h>using namespace std;const int maxn = 3e5+10;int t,n,m,an原创 2021-02-09 10:05:16 · 244 阅读 · 0 评论 -
牛客练习赛70 D.数树(思维,map的使用)
传送门乍一看还以为是可撤销并查集,不过题目有一句重要的话保证不被忽略的操作1不构成环说明所有连通块都是一颗树我们直到树有一个性质,nnn个点,n−1n-1n−1条边那么我们只需要维护当前有几条边,几个点在树种就好了怎么维护…emm学到了,这么维护map<int,set<int> >mp;直接把mapmapmap当vectorvectorvector用。#include <bits/stdc++.h>using namespace std;map&l原创 2021-02-08 23:45:59 · 257 阅读 · 0 评论 -
牛客练习赛70 A.重新排列(尺取)
传送门最近学到的尺取模板emm不错,这么些不容易错,以前的写法容易错,贴贴#include <bits/stdc++.h>using namespace std;const int maxn = 1e5+10;string s = "puleyaknoi";char a[maxn];int vis[maxn],sum,ans = 1e9,n;void add(char w){ int i; for(i=0;i<=9;i++) if( w==s[i] ) break;原创 2021-02-08 18:54:14 · 293 阅读 · 0 评论 -
牛客练习赛9 E.子串(转移+扫描线+树状数组)
传送门感觉非常不好写,我果然讨厌数据结构预处理l[i]l[i]l[i]表示左边第一个大于iii的下标加一预处理r[i]r[i]r[i]表示右边第一个小于iii的下标减一转移方程是for(int i=1;i<=n;i++)//作为右端点时,找左边第一个比i大的数字 { l[i] = i; if( p[i]>i ) continue; while( l[i]>1&&p[l[i]-1]<=i ) l[i] = l[l[i]-1];//我比左边的数字大,那么原创 2021-02-08 18:39:49 · 245 阅读 · 0 评论 -
牛客练习赛69 E.子串(哈希思维)
[l,r][l,r][l,r]的的最小值是lll最大值是rrr说明[l,r][l,r][l,r]所有数恰在区间[l,r][l,r][l,r]出现一次我们哈希一下,把数字iii哈希成k[i]k[i]k[i]那么[l,r][l,r][l,r]满足条件当且仅当k[l]⊕k[l+1]⊕k[l+2]...=k[pl]⊕k[pl+1]⊕k[pl+2]...k[l]\oplus k[l+1]\oplus k[l+2]...=k[p_l]\oplus k[p_{l+1}]\oplus k[p_{l+2}]...k[l]原创 2021-02-08 11:34:49 · 407 阅读 · 4 评论 -
牛客练习赛68 D.牛牛的粉丝(循环矩阵优化乘法)
传送门有nnn个点形成的环,初始每个点有一些人,在每一轮比赛中每个人p1p_1p1的概率顺时针走一步,p2p_2p2的概率逆时针走一步,p3p_3p3概率不动问kkk轮后,每个点的期望人数。由于每个人都是等价的,我们只考虑起点为000的人走到哪里定义f[i][j]f[i][j]f[i][j]为第iii轮走到jjj的概率f[i][j]=f[i−1][j−1]∗p1+f[i−1][j]∗p2+f[i−1][j+1]∗p3f[i][j]=f[i-1][j-1]*p_1+f[i-1][j]*p_原创 2021-02-07 17:02:28 · 282 阅读 · 0 评论