codeforces
文章平均质量分 63
ObsdianGungnir
非常弱的OIer
展开
-
codeforce 148D 概率DP
题目链接:戳这里D. Bag of micetime limit per test2 secondsmemory limit per test256 megabytesinputstandard inputoutputstandard outputThe dragon and the p原创 2017-12-26 18:03:21 · 216 阅读 · 0 评论 -
codeforces52B Right Triangles 计数问题
题目链接:戳这里题目大意:给出一个n*m的只有‘*’和‘.’的矩阵,求三个顶点都是‘*’且直角边平行于矩阵边的直角三角形个数。题解:显然对于一个直角顶点,它能构成的直角三角形的个数为(左边‘*’的个数+右边‘*’的个数)×(上边‘*’的个数+下边‘*’的个数)。代码:#include#define maxn 1005using namespace std;typedef long原创 2018-02-22 09:36:48 · 461 阅读 · 0 评论 -
codeforces852F Product transformation 排列组合
题目链接:戳这里题目大意:有一个长度为n的数组A,开始时,A内的元素全为a。现在进行m次操作,每次操作将A[i]变为A[i]*A[i+1],最后一个元素不变。现给出n,m,a,Q,输出m次操作后的A数组,每个元素对Q取模。题解:因为每个数刚开始都是一样的,那么我们可以把乘法考虑为指数的相加。用S代表指数,那么Si=Si+S(i+1)。设S[i][j]表示第i个数经过原创 2018-02-27 10:32:34 · 350 阅读 · 0 评论 -
codeforces869C The Intriguing Obsession 动态规划
题目链接:戳这里题目大意:齐心协力,我们可以以超乎想象的速度到达任何地方!现在,火炎姐妹(Fire Sisters)——火怜(Karen)和月火(Tsukihi)正在前往一个她们从未到达的地方——水中的小岛!有三种不同类型的小岛,方便地,各自涂上了红,蓝,紫三色。每种颜色的小岛各自有a,b,c个。这些小岛之间初始时互相分离。可以在小岛之间架桥,两个小岛间最多架一座桥。原创 2018-02-27 10:19:23 · 255 阅读 · 0 评论 -
codeforces859E Desk Disorder 并查集判环+乘法原理
题目链接:戳这里题目大意:有N 个人和2N 个座位。告诉你这N 个人它们现在的座位。以及它们想去的座位。 每个人可以去它们想去的座位或者就坐在原来的座位上。 新的座位安排和旧的座位安排,都不允许一个座位被两个人占据的情况。 问你新的座位安排的方案数。题解:可以发现不同的联通块是互不影响的,那么我们就可以统计出所有联通块分开统计答案在按照乘法原理乘起来。如果一个联通块内存在自环,那么答案原创 2018-02-27 10:07:07 · 253 阅读 · 0 评论 -
codeforces895C Square Subsets 状压dp
题目链接:戳这里题目大意:Petya又迟到了...老师给了他额外的任务。对于一个数组a,Petya需要统计从中间选择非空子集,使它们的乘积等于某个整数的平方的方法的数量。 如果这些方法所选择的元素的索引不同,则认为这两种是不同的方法。 因为结果可能很大,结果需要mod 10^9+7。题解:一个数是完全平方数,说明它的每个质因子都有偶数个,而a数组中的每个元素最大不超过70,那么我们可以原创 2018-02-27 09:51:22 · 298 阅读 · 0 评论 -
codeforces900D Unusual Sequences 容斥原理
题目链接:戳这里题目大意:输入x,y,求有多少个数列满足其gcd为x,和为y。题解:显然我们可以将y/x,这样就变成了求gcd为1,和为y/x的数列个数。如果不考虑重复,那么显然有2^(y-1)种方法,但这种情况里是存在不合法情况的,比如6分成{2,2,2},其gcd为2而不是1。所以我们考虑容斥原理,通过枚举gcd为2*gcd,3*gcd……的方式来去掉不合法情况即可。代码:原创 2018-02-27 09:35:52 · 236 阅读 · 0 评论 -
codeforces888D Almost Identity Permutations 排列组合
题目链接:戳这里题目大意:给出1个数n,求1~n的排列中满足最多有 k 个元素不满足 ai = i 的数列有几个。题解:考虑到k只有4,所以可以直接分类讨论,这个很好手推...代码:#includeusing namespace std;typedef long long LL;LL read(){ char c;LL sum=0,f=1;c=getchar();原创 2018-02-27 09:28:18 · 246 阅读 · 0 评论 -
codeforces938E Max History 组合数学
题目链接:戳这里题目大意:我们定义f(a)为:1、开始时,f(a)=0,M=1。2、对于每个2<=i<=n,如果a[M]<a[i],那么f(a)=f(a)+a[M],M=i。现在对于一个给定的数组a,求其所有排列的f(a)之和,答案对1e9+7取模。题解:一开始以为是把f(a)变成a[M],然后不会做。后来发现是题看错了QAQ。既然是加上,那么我们可以分开统计每个数的贡献。如果一...原创 2018-02-22 11:11:29 · 376 阅读 · 0 评论 -
codeforces401D Roman and Numbers 状压DP
题目链接:戳这里题目大意:输入一个数,将该数的每个数位重新排列后(无前导零),有多少个数%m=0?分析:因为最多有18位数,可以考虑用18位的2进制数表示每一位上的数是否使用,状压dp转移即可。定义dp[state][k]表示当前状态为state时,%m余数为j的方案数。转移方程为dp[state][(k*10+dight[j])%m]=dp[state^(1注意重复问题,如果原创 2018-01-08 07:41:26 · 319 阅读 · 0 评论 -
codeforces163A:Substring and Subsequence DP
题目链接:戳这里题目大意:给你两个字符串s和t,求s的子串等于t的子序列的个数。题解:定义dp[i][j]表示考虑到s的第i个字符,t的第j个字符的情况。显然dp[i][j]=dp[i][j-1],只有当s[i]==t[j]时,dp[i][j]=dp[i][j-1]+dp[i-1][j-1]+1。代码:#include#define mod 1000000007using name原创 2017-12-27 20:43:22 · 223 阅读 · 0 评论 -
codeforces366C Dima and Salad 背包dp
题目链接:戳这里题目大意:n个物品,每个物品有a和b两个属性,现在要选一些物品,使得a属性的和是b属性的和的k倍,求a属性和的最大值。题解:将问题变形:将每个物品的重量看做a[i]-k*b[i],价值看做a[i],分正负做两次背包,最终两个重量相等的背包就是一组可行解。代码:#includeusing namespace std;typedef long long LL;int原创 2017-12-27 15:49:38 · 266 阅读 · 0 评论 -
codeforces351B Jeff and Furik 逆序对+递推
题目链接:戳这里题目大意:有一个1~n的排列,两个人玩游戏,先手的人每次会交换a[i],a[i+1]且a[i]>a[i+1]的两个数,后手每次50%交换a[i],a[i+1]且a[i]>a[i+1]的两个数,50%交换a[i],a[i+1]且a[i]题解:不难发现先手每次会减少一个逆序对,后手每次50%增加一个逆序对,50%减少一个逆序对。也就是说每两次操作有50%的概率不变,50%概率减原创 2017-12-27 11:28:14 · 233 阅读 · 0 评论 -
codeforces429B Working out (DP)
题目链接:戳这里题目大意:有一个n*m的矩形,一个人从(1,1)出发,只能向下或向右走到(n,m),另一人从(n,1)出发,只能向上或向右走到(1,m),两人的路径最多只能有1个交点,且交点的值不计入答案,求两人路径经过的值的最大值。题解:因为n,m所以可以先预处理出(1,1)到(i,j),(i,j)到(n,m),(n,1)到(i,j),(i,j)到(1,m)的最大值,再枚举交点在哪里原创 2017-12-27 09:03:58 · 243 阅读 · 0 评论 -
codeforces180C Letter DP
题目链接:戳这里题意:给定一个字符串,求将其改成前段全是大写字母,后段全是小写字母最少需要改动的字母数量。题解:dp[i][0]表示考虑到第i位,且第i位是大写字母时的最小代价,dp[i][1]表示考虑到第i位,且第i位是小写字母时的最小代价。如果s[i]是大写字母,那么dp[i][0]=dp[i-1][0],dp[i][1]=min(dp[i-1][0],do[i-1][1])+1。原创 2017-12-26 22:34:10 · 301 阅读 · 0 评论 -
codeforces459E DP
题目链接:戳这里题意:给出一幅有向图,求一条边权递增的路径的最长长度。题解:先把所有边排序保边权不递减,设dp[i]表示以i点结尾的最长路径长度,对于相等的边要一起转移。代码:#includeusing namespace std;typedef long long LL;int read(){ char c;int sum=0,f=1;c=getchar(); whi原创 2017-12-26 21:48:51 · 255 阅读 · 0 评论 -
codeforces486D Valid Sets 树上计数
题目链接:戳这里题目大意:给出一棵树,树上有点权,求这棵树的满足最大点权与最小点权之差小于d的连通子图的个数。题解:我们可以枚举一个点作为最大的点权向下扩展。但这样有一个问题:点权相等的点会重复扩展。所以我们规定点权相等的点,只能由编号小的向编号大的点扩展。代码:#include#define maxn 200005#define maxm 400005#define mod 1原创 2018-02-22 09:57:00 · 266 阅读 · 0 评论