09 2018 档案
摘要:見えない僕を信じてくれ
阅读全文
摘要:And then we start to dance, and now I'm singing like
阅读全文
摘要:遠くからあなたに出会うため
生まれてきたんだぜ
阅读全文
摘要:悲しくて飲みこんだ言葉
ずっと後についてきた
苛立って投げ出した言葉
きっともう帰ることはない
阅读全文
摘要:不確かな言葉を携えて 呼吸を揃えて初めまして
そんで愛されたのなら大歓迎 繰り返し向かえ遠く向こうへ
阅读全文
摘要:怜贫济困是人道
哪有个袖手旁观在壁上瞧?
阅读全文
摘要:満身創痍 ゲームオーバー
阅读全文
摘要:何万と積もった 懸念を
線状に 切り裂いていく
阅读全文
摘要:爷的千里战马扣连环 爷好过关
阅读全文
摘要:宋营离此路途远 快马加鞭一夜还
阅读全文
摘要:誰も教えてくれないで
世界は逆さに回り出す
阅读全文
摘要:やっとのこと手に入れたアンタ 手離す訳にいかないでしょ
阅读全文
摘要:精一杯勇気を振り絞って
彼女は空を飛んだ
鳥になって雲をつかんで
風になって遥遠くへ
阅读全文
摘要:頓珍漢なことばかり まだ信じている
阅读全文
摘要:この世界を動かす糸の先には気取った顔した君がいるのか
阅读全文
摘要:かみのますとりいにいれば このみよりひつきのみやとやすらげくす
阅读全文
摘要:真っ白に透けた 羽根を閉じたまま masshiro ni su ke ta bane wo to ji ta ma ma
阅读全文
摘要:たかが色の违いで何を马鹿な
阅读全文
摘要:到底什么才是真正的是非 到底哪一方才能 绝对肯定错与对
阅读全文
摘要:僕は幽霊だ 本当さ
君の目には見えないだろうけど
阅读全文
摘要:誰か名前を呼んで 僕の 突然悲しくなるのは何故
阅读全文
摘要:You come over and start up a conversation with just me
And trust me I'll give it a chance now
阅读全文
摘要:海岛冰轮初转腾 见玉兔 玉兔又早东升
阅读全文
摘要:守られていたはずの檻が
閉じ込められていたと気付いた
阅读全文
摘要:我也曾赴过琼林宴 我也曾打马御街前
阅读全文
摘要:Generals order their soldiers to kill
And to fight for a cause they've long ago forgotten
阅读全文
摘要:声が潰れるまで歌って 何度の時間を棒に振った
阅读全文
摘要:分情况讨论,m=1的时候比较简单,设f[i][j]为到i选了j个矩形,前缀和转移一下就行了 m=2,设f[i][j][k]为1行前i个,2行前j个,一共选了k个,i!=j的时候各自转移同m=1,否则转移一下两行矩阵的情况 cpp include include using namespace std
阅读全文
摘要:设f[i][j][k][0/1]表示选到i时,i 1选j张,i选k张,之前选的所有牌是否选择了对子 然后分情况讨论转移即可
阅读全文
摘要:设f[i]为深度为i的n元树数目,s为f的前缀和 s[i]=s[i 1]^n+1,就是增加一个根,然后在下面挂n个子树,每个子树都有s[i 1]种 写个高精就行了,好久没写WA了好几次……
阅读全文
摘要:有点神奇的dp 首先注意到任意一个数都能被表示成若干个斐波那契数的和的形式 先求出n可以字典序最大的表示 设f[i][0/1]表示第i个斐波那契数选或者不选 如果当前数不选,那就选比他小的两个数,否则,需要不选比他小的两个数(连续的影响)
阅读全文
摘要:注意是等于s不是大于s dfs,用set或者map存这条链到root的点权和sum[u],更新答案的时候查一下有没有s sum[u]即可 cpp include include include using namespace std; const int N=500005; int n,m,a[N]
阅读全文
摘要:首先注意 先hash一下,双hash,然后枚举删去位置,把hash值排个序,把些相等的加起来统计一下对数即可 cpp include include include using namespace std; const int N=30005; int ans,n,m,k; long long h1
阅读全文
摘要:设f[i][j]为a序列前i个字符和b序列前j个字符的最长公共子序列,转移很好说就是f[i][j]=max(f[i 1][j],f[i][j 1],f[i 1][j 1]+(a[i]==b[j])) 设g[i][j]为a序列前i个字符和b序列前j个字符的最长公共子序列个数,这个转移是转移f的时候从前
阅读全文
摘要:没看太懂题意orz 最优的是tarjan缩点之后问入度为0的点,因为问这个点可以知道整个块的情况 答案是这ans个入度为0的点都不是杀手的概率\\( \frac{n ans}{n} \\) 但是有特殊情况就是size为1的单独scc,这是ans ,因为其他点确定之后这个点就确定了 cpp inclu
阅读全文
摘要:费用流里spfa最后的判断要写成dis[t] =0而不是dis[t]!= inf否则会WAWAWA……
阅读全文
摘要:因为边权为1所以a直接bfs瞎搞就行……我一开始竟然写了个spfa cpp include include include include using namespace std; const int N=1005,inf=1e9; int n,m,st,ed,h[N],cnt,a[N][N],b[
阅读全文
摘要:dfs会T,只好正反两遍拓扑了…… cpp include include include include using namespace std; const int N=100005; int n,m,h[N],cnt,d1[N],d2[N]; double f[N],p[N],s[N],ans
阅读全文
摘要: ```cpp #include #include #include using namespace std; const int N=1000005; int n,a[N],b[N]; long long m,...
阅读全文
摘要:注意到目录是一颗树结构,然后就简单了,预以1为根的处理出dis[u]为以这个点为根,到子树内的目录总长,si为子树内叶子数 第二遍dfs换根即可 cpp include include include using namespace std; const int N=100005; int n,h[
阅读全文
摘要:一看区间操作,很容易想到差分 所以就是先差分,然后为了保证最小步数,把政府差分抵消,也就相当于原数组区间加减 第二问,因为差分数组抵消之后不为0就需要使用n+1的虚拟位置,而这个的值其实没有,所以我们可以在这个抵消后的数的范围内随意操作,也就是任意取值
阅读全文
摘要:注意到k=gcd(x,y) 1,所以答案是 $$ 2 (\sum_{i=1}^{n}\sum_{i=1}^{m}gcd(i,j)) n m $$ 去掉前面的乘和后面的减,用莫比乌斯反演来推,设n include using namespace std; const int N=100005; lon
阅读全文
摘要:这居然是我第一次写线段树合并……所以我居然在合并的时候加点结果WAWAWAMLEMLEMLE……!ro的时候居然直接指到la就行…… 树上差分,每个点建一棵动态开点线段树,然后统计答案的时候合并即可 cpp include include include using namespace std; c
阅读全文
摘要:Wall是个好东西,要不然我至死都看不出来我把(b[i]+b[j])写成了(b[i],b[j])…… 还是来自lyd的题解: (其实原来课件第一行式子写错了没有 1,然而我用sai手画了一个上去hhhh,板绘选手表示鼠绘真难) cpp include include include using na
阅读全文
摘要:二分答案,注意l是max(a[i]+a[i+1]),r是sum_a 判断的时候用dp,设f[i]为i与1最少的相同颜色数,g[i]为i与1最多的相同颜色数,转移是f[i]=max(a[i] (w a[i 1] (a[1] g[i 1])),0),g[i]=min(a[1] f[i 1],a[i]);
阅读全文
摘要:priority_queue实现的对顶堆,细节超级多WA了十几次……但是理论上是最简便的orz~~其实是我已经不会写平衡树了~~ 枚举左端点,显然要把这一段的高度搞成(l,l+k 1)的高度中位数,所以需要一个支持插入删除查询中位数的东西,我们使用对顶堆 然后关于删除,我们手动维护size和sum,
阅读全文
摘要:来自lyd课件 发现s和last(s),next(s)成树结构,然后把式子化简成kx+b的形式,做树形dp即可 cpp include include include using namespace std; int n,t,a[105]; double p,q; struct qwe { doub
阅读全文
摘要:设g[u]为这个点被儿子和自己充上电的概率,f[u]为被儿子、父亲和自己充上电的概率 然后根据贝叶斯公式(好像是叫这个),1.P(A+B)=P(A)+P(B) P(A)\ P(B),2.P(A)=(P(A+B) P(B))/(1 P(B)) g的转移很好想,根据上面的1公式,g[u]=g[u]+g[
阅读全文
摘要:首先考虑快排的递归什么时候停下,显然是当前段只剩下一个数了,也就是一个数两边出现分隔符 然后再考虑计算冒泡长度这个操作,因为有分割,所以我们可以把这些放到一起冒泡,这和递归每个区间冒泡是等价的 所以答案就是一个数被动了几次,也就是他两边的分隔符出现的最晚时间 在冒泡排序中,每次冒泡,一个数如果前面有
阅读全文
摘要:注意到sum_t比较小,所以设f[i][j]为选前i头牛,当前sum_t为j的最小sum_w值,转移是f[i][j]=min(f[i 1][j],f[i 1][j t[i]]+w[i]),然后i维用滚动数组优化即可 注意j include include using namespace std; c
阅读全文
摘要:一眼二分。然后重点是树上贪心部分 长得像dp一样,设mn为子树内已炸点的最浅点,mx为子树内没有炸并且需要炸的最深点,然后转移直接从子树继承即可 然后是判断当前u点是否需要炸,当mx[u]+mn[u] include using namespace std; const int N=300005;
阅读全文
摘要:按根号300000=m分情况讨论 查询是,当x小于等于m,那么可以暴力记录直接出解;否则,用分块维护区间值,查询的时候以x为步长跳根号m次取最小值即可 还有一种并查集方法,来自https://www.cnblogs.com/CQzhangyu/p/7088337.html cpp include i
阅读全文
摘要:这题加个 include都会MLE…… 神思路,每个数抵消宇哥和它不同的数,最后剩下的就是众数 cpp include int n,la,x,tot; int main() { scanf("%d",&n); for(int i=1;i
阅读全文
摘要:神区间dp 设f[l][r][0]为在l到r中压缩的第一个字符为M,并且区间内只有这一个M,f[l][r][0]为在l到r中压缩的第一个字符为M,并且区间内有两个及以上的M 然后显然的转移是f[i][j][1]=min(f[i][k][0],f[i][k][1])+min(f[k+1][j][0],
阅读全文
摘要:注意到周期234的lcm只有12,也就是以12为周期,可以走的状态是一样的 所以先预处理出这12个状态的转移矩阵,乘起来,然后矩阵快速幂优化转移k/12次,然后剩下的次数暴力转移即可 cpp include include include using namespace std; const int
阅读全文
摘要:好眼熟啊 直接dp显然很难算,所以设val为只在n点建一个仓库的费用,然后设f[i]为在i~n点建若干仓库并且i点一定建一个仓库的最大省钱数 转移很显然,设s为p的前缀和,f[i]=max{f[j]+s[i]\ (x[j] x[i])} a[i] 然后推转移 $$ f[i]=f[j]+s[i] x[
阅读全文
摘要:脑补一下给出的图:一个环,然后有若干连接环点的边,我们就是要求这些边不重叠 考虑一下不重叠的情况,两个有交边一定要一个在环内一个在环外,所以把相交的边连边,然后跑黑白染色看是否能不矛盾即可(可能算个2 SAT?) cpp include include include using namespace
阅读全文
摘要:等于有传递性,所以hash一下把等于用并查集连起来,然后再判断不等于是否合法即可 cpp include include include include using namespace std; const int N=200005; int T,n,x,y,v,f[N],g[N],tot,has;
阅读全文
摘要:spfa预处理出最短路数组dis,然后反向建边bfs出ok[u]表示u能到n点 然后发现有0环的话时候有inf解的,先dfs找0环判断即可 然后dfs,设状态f[u][v]为到u点,还可以跑最短路+v的长度,记忆化,然后直接搜即可 cpp include include include includ
阅读全文
摘要:设f[i]为凑i元的方案数,这个随便dp一下就行了 然后处理限制,我们考虑用容斥,也就是4个超限 3个超限+2个超限 1个超限,这里用状压枚举一下,然后i硬币超限就当做选了d[i]+1个,在s里减去,最后用来容斥的就是f[s']
阅读全文
摘要:思路有点眼熟啊,就是设l1记录长为x的极长全1串贡献x的答案,l2记录长为x的极长全1串贡献x^2的答案,f记录真正的答案 转移的话根据n (n 1)=1,n^2 (n 1)^2=2n 1,n^3 (n 1)^3=3n^2 3n+1直接转移即可 cpp include include using n
阅读全文
摘要:今天脑子不太清醒,把数据范围看小了一直TTTTLE…… 最大费用最大流,每个格子拆成两个(x,y),(x,y)',(x,y)向(x,y)'连一条费用a[x][y]流量1的边表示选的一次,再连一条费用0流量inf的表示取走之后再从这里走,然后每个(x,y)'向(x,y+1),(x+1,y)连一条费用0
阅读全文
摘要:对于三个点求最小路径长度和,答案肯定在某两个点的lca上,因为如果把集合点定在公共lca上,一定有两个点汇合后再一起上到lca,这样显然不如让剩下的那个点下来 这个lca可能是深度最深的……但是我懒得证了,反正只有三个lca,每个都求一遍然后取个max就好啦 cpp include include
阅读全文
摘要:设sj,so,si分别是J O I的个数前缀和,然后要求求最长(l,r)满足sj[r] sj[l 1]==so[r] so[l 1]==si[r] si[l 1],化简一下就是满足so[r] so[l 1] (sj[r] sj[l 1) (si[r] si[l 1] (so[r] so[l 1))=
阅读全文
摘要:很容易发现行数就是lcm环长,也就是要求和为n的若干数lcm的个数 有结论若p1^a1+p2^a2+...+pm^am include using namespace std; const int N=1005; int n,p[N],tot; long long f[N][N]; bool v[N
阅读全文
摘要:我有病吧……明明直接枚举是否匹配就可以非要写hash,然后果然冲突了(……我个非酋居然还敢用hash 设f[s][i]为已选串状态为s并且最后一个串是i,还有预处理出g[i][j]表示最长有长为g[i][j]的i串后缀等于j串前缀这里,直接暴力匹配即可…… 然后注意到比较麻烦的事要求字典序最小,但是
阅读全文
摘要:二分mid,然后用1~mid的操作在差分序列上加减,最后把差分序列前缀和起来,看是否有有超过初始r值的 线段树,模拟即可,洛谷上会T一个点(开O2能过)
阅读全文
摘要:和数据备份差不多 设二元组(i,a[i]),开一个大根堆把二元组塞进去,以len排序,每次取出一个二元组 因为单纯的贪心是不行的,所以设计一个“反悔”操作。 记录二元组的前驱pr后继ne,把拿出来的二元组的len加进答案,然后把当前二元组和它的前驱后继当成一个,也就是len[x]=a[pr[x]]+
阅读全文
摘要:不难想,就是处理起来比较麻烦 设f[i][j][k]为是否可以把区间(i,j)合并为k,初始状态是f[i][j][s[i]]=1,转移的话另一段枚举长度x,向(i x,j),(i,j+x)转移 把四个字符hash成1234比较好写(大概 cpp include include include usi
阅读全文
摘要:裸的点分治,运算在模3下进行然后统计答案的时候统计余1的\ 余2的\ 2+余0的^2 cpp include include using namespace std; const int N=20005; int n,h[N],cnt,ans,rt,sum,si[N],hs[N],de[N],t[5
阅读全文
摘要:二分值mid,然后把 =mid的赋值为1,其他赋值为0,每次排序就是算出区间内01的个数,然后分别把0和1放到连续的一段内,这些都可以用线段树来维护 二分的判断条件是操作完之后q位置上是否为1 cpp include include using namespace std; const int N=
阅读全文
摘要:很明显的暗示,就是在树的dfs序上维护树状数组,加减的时候差分即可 cpp include include include include using namespace std; const int N=500005; int n,m,h[N],cnt,s[N],top,tot,t[N],fa[N
阅读全文
摘要:……我真是太非了,自己搞了7个质数都WA,从别人那粘5个质数就A了…… 就是直接枚举解,用裴蜀定理计算是否符合要求,因为这里显然结果很大,所以我们对多个质数取模看最后是不是都为0 cpp include include include include using namespace std; con
阅读全文
摘要:其实就是 n~n中求选k个不同的数,和为0的方案数 学到了新姿势叫整数划分,具体实现是dp 详见:https://blog.csdn.net/Vmurder/article/details/42551603 设f[i][j]为j个数和为i的方案数,然后因为互不相同,所以转移的话有两种,就是当前j个数
阅读全文
摘要:处理出一个序列c,a[i] b,c[i]=1;a[i]==b,c[i]=0;a[i] include using namespace std; const int N=200005; int n,a[N],b,w,s[N],mp[N],ans; int read() { int r=0,f=1; c
阅读全文
摘要:首先很容易计算对于一个如意郎君列表里有x个男性的女性,编号排第i位的男性被选的概率是 $$ p (1 p)^{i 1}+p (1 p)^{i 1+n}+p (1 p)^{i 1+n}+… $$ $$ =p ((1 p)^{i 1}+(1 p)^{i 1+n}+(1 p)^{i 1+n}+…) $$
阅读全文
摘要:有趣啊 先spfa分别求出以s1,t1,s2,t2为起点的最短路,然后把在s1 t1或者s2 t2最短路上的边重新建有向图,跑拓扑最长路即可 cpp include include include include include using namespace std; const int N=15
阅读全文
摘要:合并中间那块的时候没取max……WAWAWA 在线段树上维护一堆东西,分别是len区间长度,sm区间内1的个数,ll0区间从左开始最长连续0,ml0区间中间最长连续0,rl0区间从右开始最长连续0,ll1区间从左开始最长连续1,ml1区间中间最长连续1,rl1区间从右开始最长连续1(起始这六个东西可
阅读全文
摘要:调死我了…… 首先观察移动方式,需要移动的格子每次移动到相邻格子,一定是先把空白格子挪过去,所以我们得到一种做法,就是bfs预处理出每一个格子的四联通格子之间的空白格子移动距离建边,注意这个移动是不能经过当前枚举的中心格子的,然后把中心格子和它的四联通格子建边权为1的边 注意这里用来建边的点,是(x
阅读全文
摘要:知道按位贪心但是不知道怎么贪…… 求一个a的异或前缀和s,然后按位从大到小贪心,ans的当前位能为0的条件是s中有 =m个位置这一位为0且没有flag,并且s[n]的这一位为0 如果符合要求,那么把s中这一位不为0的位置都打上flag,表示这些点不能作为区间断点了(如果作为断点的话这一位就要为1了,
阅读全文
摘要:bzoj上访问负下标会跑到奇怪的地方…… 其实可以滚动数组优化,但是我看能过就懒得改了 设f[i][j]为已经算了前i个挂饰,当前有j个空的钩子,转移就是f[i][j]=max(f[i 1][j],f[i 1][max(min(j a[i]+1,n), n)]+b[i]) 注意到只有 n inclu
阅读全文
摘要:如果确定了第一行,那么可以推出来整个矩阵,矩阵合法的条件是n+1行全是0 所以推出来n+1行和1行的关系,然后用异或高斯消元来解即可 cpp include include using namespace std; const int N=45; int n,m,f[N][N][N],a[N][N]
阅读全文
摘要:以后写dp还是向后转移吧……写的把前面加起来的版本怎么也调不过去 首先注意,因为地图碎片只占1体积,所以 n, include using namespace std; const int N=405; int n,l,m,a[N]; double p[N],f[2][N][N],ans; int
阅读全文
摘要:先做最小生成树,这样就保证了最大值最小 然后随便用个什么东西维护一下最大值,我用的树剖log^2,倍增会更快 cpp include include include using namespace std; const int N=100005; int n,m,k,f[N],h[N],cnt,va
阅读全文
摘要:没考虑可以连着两个不选……直接染色了 实际上是基环森林,对于每棵基环树,dfs找出一个环边,然后断掉这条边,分别对这条边的两端点做一边treedp,取max加进答案里 treedp是设f[u]为选u点,g[u]为不选u点,然后随便转移一下就行了 cpp include include using n
阅读全文
摘要:原来cerr在bzoj上回RE?! 从高位到低位贪心,注意取01结果相同时取0,这样就可以去掉limit了 cpp include include using namespace std; const int N=100005; int n,m,b[N][35],a[N],tot,ans,mx; c
阅读全文
摘要:裸的树链剖分+线段树 但是要注意一个地方……我WA了好几次才发现取完相反数之后max值和min值是要交换的…… cpp include include using namespace std; const int N=200005; int n,m,h[N],cnt,de[N],va[N],fa[N
阅读全文
摘要:比较基础的数位dp,dfs的时候带上上一位,上上位,是否已经有连续3个相同位,是否有4,是否有8即可 但是要注意两点(在洛谷上一直70) 当l=1e10的时候,直接输出clc(r)即可,因为如果再减去clc(l 1)的话,是会多减掉1的 还有判断前导0 cpp include include usi
阅读全文
摘要:emmm妹想到要倒着推 先假设只在n建一个控制站,这样的费用是\\( \sum_{i=1}^{n} b[i]\ (n i) \\)的 然后设f[i]为在i到n键控制站,并且i一定建一个,能最多节省下的费用,那么显然转移是\\( f[i]=max(f[j]+s[i]\ (j i) a[i]) \\),
阅读全文
摘要:设f[i]为杀死i的最小代价,显然\\( f[i]=min(k[i],s[i]+\sum f[to]) \\) 但是这个东西有后效性,所以我们使用spfa来做,具体就是每更新一个f[i],就把能被它更新的点重新入队 cpp include include include include using
阅读全文
摘要:参考了这个http://www.cnblogs.com/Artanis/p/3751644.html,好像比一般方法好写 大概思想就是先计算出把所有石子都合并到1位置的代价,这样显然有一些是不优的,然后再分别计算把合并到1的石子合并到p,能优化多少 这个计算就是枚举2到tot位,对于每一位计算挪到这
阅读全文
摘要:设f[a][i][j]为第a段时间结束时在(i,j)位置的最长滑行距离,转移很好想,就是分四个方向讨论,然后枚举这段时间的滑行长度取个max即可 但是这样是O(n^4)的,考虑优化 发现同一行或列,取max对应a 1中的是单调挪动的一个区间,所以用单调栈维护当前区间,每次移动的时候要把左端点已经大于
阅读全文
摘要:设f[i][j]为在坐标(i,j)时的最小点击次数,转移的话从i 1向上飞或者向下掉转移,注意转移完了之后要把管子部分赋值为inf cpp include include using namespace std; const int N=10005,inf=1e9; int n,m,k,p,ans,
阅读全文
摘要:容斥是ans= 至少k位置相等对数 C(k,k) 至少k+1位置相等对数 C(k+1,k)+至少k+2位置相等对数 C(k+2,k) …… 然后对数的话2^6枚举状态然后用hash表统计即可 至于为什么要乘上一个组合数,详见 https://www.cnblogs.com/candy99/p/661
阅读全文
摘要:n ne[n]是n的最长循环节长度,其实就是n 最短前缀=后缀长度 然后我们要求最短循环节,其实就是ne一直往前跳,跳到不能跳为止,这时的n ne[n]就是n的最短循环节长度 cpp include include using namespace std; const int N=1000005;
阅读全文
摘要:设f[s]为已经 从上到下 叠了状态为s的牛的最大稳定度,转移的话枚举没有在集合里并且强壮度 =当前集合牛重量和的用min(f[s],当前放进去的牛还能承受多种)来更新,高度的话直接看是否有合法集合的高度达到要求即可 cpp include include using namespace std;
阅读全文
摘要:显然是状压,显然不可能把所有格子压起来 仔细观察发现只有机关周围的四个格子有用以及起点,所以我们用spfa处理出这些格子两两之间的距离(注意细节……这里写挂了好几次),然后设f[s][i]为碰完的机关石状态为s,现在在有用格子的第i个的最小停下次数,转移按照套路即可 cpp include incl
阅读全文
摘要:枚举起点做spfa,然后一条边在最短路上的条件是dis[e[i].to]==dis[u]+e[i].va,所以每次spfa完之后,dfs出a[i]表示经过i点的最短路的起点数,b[i]表示经过i点的最短路的终点数,一条边(u,v)在当前起点下的答案就是a[u] b[v],最终答案是总和 因为最短路构
阅读全文
摘要:对于每个i,以它为左端点的最优右端点一定是单增的,所以用单调栈维护 具体的,单调栈里放的是和单调的长为d的子段,然后枚举右端点,如果这段的和 当前长为d子段最大的和大于p的话,左端点右移同时注意单调栈里的子段的左端点不能小于当前左端点,需要一起右移 cpp include include using
阅读全文
摘要:倍增数组的20和N写反了反复WAWAWA…… 注意到a和b在每个点上出发都会到一个指定的点,所以这样构成了两棵以n点为根的树 假设我们建出了这两棵树,对于第一问就可以枚举起点然后倍增的找出ab路径长度的比值,第二问同理,这里倍增的时候注意是先跳a再跳b,所以同一个点b的倍增数组要从a在这个点的的父亲
阅读全文
摘要:kmp复健,答案是n next[n] cpp include include using namespace std; const int N=1000005; int n,ne[N]; char s[N]; int main() { scanf("%d%s",&n,s+1); int j=0; f
阅读全文
摘要:有点神,按照1444的做法肯定会挂 注意到它的概率是相同的,所以可以简化状态 详见http://www.cnblogs.com/candy99/p/6701221.html https://www.cnblogs.com/liu runda/p/6919077.html 总之就是靠在kmp中的ne数
阅读全文
摘要:本来打算把每个颜色剩下的压起来存map来记忆化,写一半发现自己zz了 考虑当前都能涂x次的油漆本质是一样的。 直接存五个变量分别是剩下12345个格子的油漆数,然后直接开数组把这个和步数存起来,记忆化dfs即可 cpp include include using namespace std; con
阅读全文
摘要:二维哈希+二分 说是二维,其实就是先把列hash了,然后再用列的hash值hash行,这样可以O(n)的计算一个正方形的hash值,然后二分边长,枚举左上角点的坐标然后hash判断即可 只要base选的妙(闭眼随便敲一个数),单模数unsigned long long自然溢出也能过
阅读全文
摘要:矩阵乘法一般不满足交换律!!所以快速幂里需要注意乘的顺序!! 其实不难,设f[i]为i的答案,那么f[i]=(f[i 1] w[i]+i)%mod,w[i]是1e(i的位数),这个很容易写成矩阵的形式,然后按每一位分别矩阵快速幂即可 矩阵: f[i 1] w[i] 1 1 f[i] i 1 0 1
阅读全文
摘要:bzoj上是一个森林啊……? dp还是太弱了 设f[i][j][k]为到点i,合成j个i并且花费k金币能获得的最大力量值,a[i]为数量上限,b[i]为价格,p[i]为装备力量值 其实这个状态设计出来就好做了,树上背包随便转移一下就行了 因为是森林,所以最后统计答案的时候也要再做一遍背包 cpp i
阅读全文
摘要:离线,按照l排序 注意到在区间里出现两次的颜色才有贡献,所以记录一个ne[i]表示i后第一个和i同色的花,维护一个l,每次处理询问的时候l单调右移,树状数组维护,在ne[ne[i]]位置++,在ne[i]位置 (因为这里已经++过了),这样区间查询的时候如果右端点超过ne[ne[i]]就能对答案有贡
阅读全文
摘要:https://blog.sengxian.com/solutions/bzoj 1444 orz 一直是我想错了,建出AC自动机之后,实际上这个定义是设f[i]为经过i节点的 期望次数 ,因为单词末尾节点走到意味着游戏结束,所以经过单词末尾节点的概率就是经过单词末尾节点的期望次数。为什么是期望呢,
阅读全文
摘要:好像是高斯消元解互相推(?)的dp的例子 首先考虑dp,设f[i][j]为一人在i一人在j的概率,点i答案显然就是f[i][i]; 然后根据题意,得到转移是 $$ f[i][j]=f[i][j] p_i p_j+\sum_{edge(x,i)\in E}f[x][j] p_j \frac{1 p[x
阅读全文
摘要:nim游戏的先手必胜条件是所有堆的火柴个数异或和为0,也就是找一个剩下火柴堆数没有异或和为0的子集的方案,且这个方案保证剩下的火柴个数总和最大 然后我就不会了,其实我到现在也不知道拟阵是个什么玩意…… 详见:https://blog.csdn.net/wyfcyx_forever/article/d
阅读全文
摘要:裸的异或高斯消元 cpp include include using namespace std; const int N=2005; int n,m,a[N][N],ans; char s[N]; void gaosi() { for(int i=1;i
阅读全文
摘要:数论+爆搜 详见这位大佬https://blog.csdn.net/eolv99/article/details/39644419 cpp include include include using namespace std; const int N=100000; int s,p[N+5],to
阅读全文
摘要:参考:http://hzwer.com/3099.html 神题神题 其实只要知道思路就有点都不难…… 先对每一行dp,设g[i][j]为这行前i个格子粉刷了k次最大粉刷正确数,随便n^3一下就行 设f[i][j]为前i行刷了k次的最大正确数,这个用g更新即可,像背包一样 cpp include i
阅读全文
摘要:注意第一问不取模!!! 因为a+b=a|b+a&b,a^b=a|b a&b,所以a+b=a^b+2 (a&b) x^3x==2x可根据异或的性质以转成x^2x==3x,根据上面的推导,得到 x^2x=x+2x 2 (x&2x)==3x; 3x 2 (x&2x)==3x; x&2x==0; x&(x
阅读全文
摘要:大力剪枝,最后洛谷上还开了o2才过…… 大概这样剪枝: 1.搜索中,一个队当前得分超过要求或者一个队剩下的比赛场数全赢也达不到要求则return; 2.注意到如果平局,最总分的贡献是2,否则是3,所以可以计算出非平局的常数,dfs中记录一下当前非平局有几场,如果超出要求或者剩下的场次全都非平局也达不
阅读全文
摘要:状压dp,设f[i][j][0/1]为前i个时间段换了j间教室的期望体力消耗,转移很好想(但是写起来好长= =) cpp include include using namespace std; const int N=2005; int n,m,v,e,c[N],d[N]; double k[N]
阅读全文
摘要:裴蜀定理:若a,b是整数,且gcd(a,b)=d,那么对于任意的整数x,y,ax+by都一定是d的倍数,特别地,一定存在整数x,y,使ax+by=d成立。 所以最后能得到的最小燃料书就是gcd,所以直接对因数计数然后找最小的个数大于k的因数就是答案
阅读全文
摘要:先写了个next_permutation结果T了,于是开始写状压 设f[s][i]为选取状态为s,选的数模d为i的方案数,去重的话直接除以每个数字的出现次数的阶乘即可 cpp include include include using namespace std; const int N=20; i
阅读全文
摘要:d[u]为u被几个节点保护,d1[u]为最早到u的时间,d2[u]为u的最早可进入时间(保护点都被打下来了的时候),然后最终最早进入时间就是max(d1[u],d2[u]),把这个作为权值放进小根堆,每次用这个max+e[i].va和d1取min更新d1,然后用max和当前d==0的点取max更新这
阅读全文
摘要:贪心,一边读入一边更新mn,用mn更新答案,mn每次加s cpp include include using namespace std; int n,s,mn=1e9; long long ans; int main() { scanf("%d%d",&n,&s); for(int i=1,w,c
阅读全文
摘要:每句两个顶点确定正方形,取max即可
阅读全文
摘要:C: 枚举中间点,计算两边点差值,把个数乘起来即可 cpp include include include using namespace std; const int N=200005; long long n,k,ans; int main() { scanf("%lld%lld",&n,&k)
阅读全文
摘要:二分答案,贪心判断,洛谷上要开long long cpp include include using namespace std; const int N=50005; int n,m,a[N],b[N]; int read() { int r=0,f=1; char p=getchar(); wh
阅读全文
摘要:挺好的区间dp,状态设计很好玩 一开始按套路设f[i][j],g[i][j]为吃完(i,j)区间站在i/j的最小腐败值,后来发现这样并不能保证最优 实际上是设f[i][j],g[i][j]为从i开始吃j个,站在这段区间的左/右端点的 最小所有草增加的腐败值 ,因为这些腐败之最后也是要算进去的,所以直
阅读全文
摘要:和bzoj同名题不一样! 起点和水点向花费一个荷花能到的第一个点连一条边权为1的有向边,然后跑计数spfa即可
阅读全文
摘要:直接bfs,在过程中更新方案数即可 cpp include include include using namespace std; const int N=55,inf=1e9,dx[]={1,1, 1, 1,2,2, 2, 2},dy[]={2, 2,2, 2,1, 1,1, 1}; int n
阅读全文
摘要:设f[i]为i为牡牛的方案数,f[0]=1,s为f的前缀和,f[i]=s[max(i k 1,0)] cpp include include using namespace std; const int N=100005,mod=5000011; int n,m,f[N],s[N]; int mai
阅读全文