上一页 1 ··· 26 27 28 29 30 31 32 33 34 ··· 37 下一页
摘要: 先预处理出没有上限的方案数,然后容斥,然后将所有东西的范围都变为[0,+oo),即可用预处理出的dp数组计算 1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,s,a[11],b[11]; 4 long long ans,f[10000 阅读全文
posted @ 2019-10-28 10:56 PYWBKTDA 阅读(124) 评论(0) 推荐(0) 编辑
摘要: 设$x^2+y^2=n^2$,令$d=gcd(x,y)$,那么$n'^2=x'^2+y'^2$,即$y'=\sqrt{n'^2-x'^2}$由于$gcd(n'+x',n'-x')=1$,因此$n'+x'$和$n'-x'$都应该是完全平方数由于d是n的约数,所以枚举d,令$n'-x'=a^2$,暴力枚 阅读全文
posted @ 2019-10-28 10:19 PYWBKTDA 阅读(135) 评论(0) 推荐(0) 编辑
摘要: 容易证明,最终方案一定是某一个排列无限循环,那么就要满足$\sum ai<=max(bi+ai)$,对所有数按照ai+bi排序后,枚举最大值,用权值线段树维护之前的ai最少要选几个 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define 阅读全文
posted @ 2019-10-28 06:47 PYWBKTDA 阅读(143) 评论(0) 推荐(0) 编辑
摘要: 将仇恨关系连边后,这张图实际上就是一张基环树森林,对于一颗树显然可以十分容易的dp,那么先对于基环树上的某一棵生成树dp两次,分别令那条非树边的两端中的某一个点不能选,另一个点随意,两次取max即答案 1 #include<bits/stdc++.h> 2 using namespace std; 阅读全文
posted @ 2019-10-27 14:51 PYWBKTDA 阅读(101) 评论(0) 推荐(0) 编辑
摘要: dp,用f[i][j][x][y]表示i个男孩,j个女孩,以i+j为结尾的子序列男-女最多为x,女-男最多为y的合法方案数,转移到f[i+1][j][x+1][max(y-1,0)]和f[i][j+1][max(x-1,0)][y+1](注意要保证x和y不超过k) 1 #include<bits/s 阅读全文
posted @ 2019-10-27 14:48 PYWBKTDA 阅读(122) 评论(0) 推荐(0) 编辑
摘要: 先将连续的一段相同的点连起来,然后考虑对于一段区间,分两种情况:1.首尾两点再同时消掉,必然要先将去掉首尾的一段消掉后再消2.首尾两点再不同时刻消掉,那么必然存在一个断点k,使得k左右无关(题目中的错误指的是某一段和相同颜色的另一段因消除而合并时暂时不消掉,这在祖玛游戏中是不被允许的,因此并无错误) 阅读全文
posted @ 2019-10-27 14:46 PYWBKTDA 阅读(153) 评论(0) 推荐(0) 编辑
摘要: 将所有字符串建一个ac自动机,用f[i]表示随机字符串匹配到第i个字符的概率,可以转移到某些字符,如果这个点是末尾那么他只能转移到自己且概率为1,高斯消元即可(另外还有一个有趣的做法,因为精度要求不高,可以直接对这个矩阵自乘50次得到的就是结果) 1 #include<bits/stdc++.h> 阅读全文
posted @ 2019-10-26 12:57 PYWBKTDA 阅读(121) 评论(0) 推荐(0) 编辑
摘要: 记f(n)表示n的约数和,先不考虑a的限制,那么即求$\sum_{i=1}^{n}\sum_{j=1}^{m}f(gcd(i,j))$枚举$d=gcd(i,j)$,即$\sum_{d=1}^{n}f(d)\sum_{g|d}(n/gd)(m/gd)\mu(g)$(后面就是指公约数为d的数对个数)令$ 阅读全文
posted @ 2019-10-24 18:06 PYWBKTDA 阅读(112) 评论(0) 推荐(0) 编辑
摘要: 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 10000005 4 int t,n,m,vis[N],p[N],f[N]; 5 long long ans; 6 int main(){ 7 f[1]=0; 8 for(int 阅读全文
posted @ 2019-10-24 18:01 PYWBKTDA 阅读(92) 评论(0) 推荐(0) 编辑
摘要: 建立方程后直接高斯消元,再把0的区间找出来计算,就可以过(因为实际上这样的复杂度是5次的,且常数小)(当然这样的复杂度看上去并不太好,考虑优化)可以发现最后一行的概率都可以用上一行来表示,那么代入上一行的方程后,发现又可以再次代入,最后就求出了第一行 1 #include<bits/stdc++.h 阅读全文
posted @ 2019-10-24 18:00 PYWBKTDA 阅读(195) 评论(0) 推荐(0) 编辑
摘要: 不妨假设ai<bi(不满足交换),线段树维护区间左端点取ai/bi,右端点最小是多少,修改时相当于两次单点修改(注意修改是永久的) 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 200005 4 #define oo 0x3 阅读全文
posted @ 2019-10-24 17:59 PYWBKTDA 阅读(121) 评论(0) 推荐(0) 编辑
摘要: 直接求出任意两点的距离后记忆化搜索,用f[i][j]表示聪聪在i,可可在j的期望步数,由于i和j的最短路单调递减,所以搜不到环 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 1005 4 vector<int>v[N]; 5 阅读全文
posted @ 2019-10-24 06:38 PYWBKTDA 阅读(105) 评论(0) 推荐(0) 编辑
摘要: 可以看成一张二分图,判断左半部分是否存在完美匹配根据hall定理,当且仅当左半部分每一个子集所连向的点数量超过了这个子集的大小都判定复杂度肯定爆炸,可以贪心,一定选择的是一个区间,即对于任意区间[l,r],都要满足$\sum_{i=l}^{r}ai\le (r-l+1+d)k$(ai表示i号鞋子的人 阅读全文
posted @ 2019-10-24 06:36 PYWBKTDA 阅读(155) 评论(0) 推荐(0) 编辑
摘要: 先将所有数加上Ri,即变为区间[0,2Ri],考虑容斥,将区间容斥为[0,+oo)-[2Ri,+oo),然后对[2Ri,+oo)令$bi=ai-2Ri$,相当于范围都是[0,+oo)问题转化为求n个正无穷范围的数和不超过b的方案数,大胆猜测后发现就是$b^{n}/n!$,暴力累计即可 1 #incl 阅读全文
posted @ 2019-10-23 14:01 PYWBKTDA 阅读(224) 评论(0) 推荐(0) 编辑
摘要: 记p(i,j)表示第i次随机时,用多少个数对应到第j个事件,特别的,p(i,0)表示转移到下一次随机数的概率,那么即要求$aj/bj=\sum_{i=1}^{inf}p(i,j)/R^{i}$,容易发现这就是$aj/bj$的R进制表示,可以求出其中的某一组解然后设f(i)表示第i次随机,有多少个数转 阅读全文
posted @ 2019-10-22 16:08 PYWBKTDA 阅读(258) 评论(0) 推荐(0) 编辑
摘要: 考虑分别求出RG和GB的最小生成树,然后剩下的边中肯定选择较小的边加入这两颗生成树 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 105 4 struct ji{ 5 int x,y,z; 6 char s[11]; 7 } 阅读全文
posted @ 2019-10-15 13:08 PYWBKTDA 阅读(197) 评论(0) 推荐(0) 编辑
摘要: 将两棵树分别按照深度分块,即每$\sqrt{n}$深度分为一块对于两棵树任意两个块的根对,统计其中公共的节点并计算出答案(用按秩合并并查集),复杂度为$o(n\sqrt{n}logn)$(其实这玩意是可以被卡掉的,因为这种分块无法保证块的大小和数量) 1 #include<bits/stdc++.h 阅读全文
posted @ 2019-10-15 13:07 PYWBKTDA 阅读(212) 评论(0) 推荐(0) 编辑
摘要: 考虑对一个集合求莫比乌斯反演的过程,最终答案即$\sum\limits_{d|ai}\mu(d)\cdot calc(d)$(calc(d)表示i子树中d倍数的个数)dfs时维护当前遍历到的点中i倍数的个数,对i搜之前和i搜完后差分一下就可以得到i子树的信息,用上述式子计算即可 1 #include 阅读全文
posted @ 2019-10-15 13:06 PYWBKTDA 阅读(156) 评论(0) 推荐(0) 编辑
摘要: 考虑每一条非树边都连接了祖先和儿子,类似于序列上的问题,从底往上算,当发现如果走到某个环的祖先,且这个环中还没有被选到,那么就将最浅的那条边贪心选择即可具体实现可以使用bitset维护当前子树的询问,如果这条边选了,那么bitset清空,否则和父亲合并 1 #include<bits/stdc++. 阅读全文
posted @ 2019-10-15 13:05 PYWBKTDA 阅读(168) 评论(0) 推荐(0) 编辑
摘要: 对于权值最大的点,他一定会在父亲选完后立刻选,所以不断将其与父亲合并,直到只剩一个点就是答案由于n比较少,可以直接暴力,如果n较大取最大值可以用堆,修改父亲可以用并查集 1 #include<cstdio> 2 #define N 1005 3 int n,r,x,y,ans,a[N],f[N],s 阅读全文
posted @ 2019-10-07 06:23 PYWBKTDA 阅读(225) 评论(0) 推荐(0) 编辑
摘要: 有两个贪心:1.自底向上dfs,能删就删,这样显然是正确的,因为它最多只会造成它父亲不能删除;2.对于一个节点,优先删除其代价($c[i]+son[i]$)最大的i删除,一定最优,证明略 1 #include<bits/stdc++.h> 2 using namespace std; 3 #defi 阅读全文
posted @ 2019-10-07 06:22 PYWBKTDA 阅读(166) 评论(0) 推荐(0) 编辑
摘要: 考虑二分枚举答案,变成01的一个序列,用线段树来维护排序即可 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 100005 4 #define L (k<<1) 5 #define R (L+1) 6 #define mid 阅读全文
posted @ 2019-10-07 06:18 PYWBKTDA 阅读(103) 评论(0) 推荐(0) 编辑
摘要: 倍增,对于每一个点计算他走到$2^i$次祖先所需要的攻击力以及最终会变成什么(一个一次函数),简单处理即可(然而这样是错的,因为他只保证了骑士的攻击力可以存,并没有保证这个一次函数的系数可以存)(其实还可以用科学记数法即pair<long double,int>来存即可,只要注意精度&常数)正解是模 阅读全文
posted @ 2019-10-07 06:17 PYWBKTDA 阅读(123) 评论(0) 推荐(0) 编辑
摘要: 建立点分树(以下除距离都指在点分树上的,距离可以每一次倍增计算lca)对于每一个点,维护子树内所有点到这个点的距离的线段树和子树内所有点到这个点父亲的距离的的线段树,然后对于查询和修改暴力修改或询问每一个祖先即可(点分数树高logn) 1 #include<bits/stdc++.h> 2 usin 阅读全文
posted @ 2019-10-07 06:17 PYWBKTDA 阅读(201) 评论(0) 推荐(0) 编辑
摘要: 可以发现分割的顺序并不会影响答案,也就是一个划分的问题dp,用f[i][j]表示前i个数划分为j段的答案,那么方程是$f[i][j]=max(f[k][j-1]+(S[i]-S[k])*(S[n]-S[i])$,滚动+斜率优化即可 1 #include<bits/stdc++.h> 2 using 阅读全文
posted @ 2019-10-07 06:16 PYWBKTDA 阅读(165) 评论(0) 推荐(0) 编辑
上一页 1 ··· 26 27 28 29 30 31 32 33 34 ··· 37 下一页