codeforces爬塔
刷题
-ring6
这个作者很懒,什么都没留下…
展开
-
Educational Codeforces Round 129 (Rated for Div. 2) C题nlogn
1原创 2022-07-05 20:37:39 · 82 阅读 · 1 评论 -
Codeforces Round #751 (Div. 1) B. Frog Traveler
B. Frog Traveler 题意:蛤蟆在深为n的井底,ai和bi分别表示在深度i时能往上跳最多ai米,跳完后停在深度i时会下滑bi米,问你要跳到地面(深度为0)最少跳跃步数,并且输出跳跃的方案. 解 有一个观察就是从n开始往上跳到的深度j是最小的步骤,之后几次跳到该点的步骤都大于它 第一次跳跃时,[ n-a[n],n-1 ]这个区间都被跳到,之后跳到的步骤肯定没有第一次跳的优秀,那么就可以把可跳跃的区间减到[ 0,n-a[n]-1 ] 使用bfs去模拟这个跳跃的过程 注意队列存的是跳后的深度,此时还未原创 2021-11-16 20:34:08 · 279 阅读 · 0 评论 -
Educational Codeforces Round 111 (Rated for Div. 2) C
C. Manhattan Subarrays 读好题。。。 题意:找到一个子序列使得其中其中不包含3点组成单调递增或单调递减,那么该子序列对答案贡献为1。求有多少这样的子序列 在这里插入图片描述原创 2021-08-13 11:30:13 · 56 阅读 · 0 评论 -
dp训练asd
C. Ayoub and Lost Array 以为自己用快速幂举出了所有情况 D. Bag of mice 总算有概率dp感觉原创 2021-08-04 10:57:32 · 100 阅读 · 0 评论 -
LIS dp
B. Orac and Models 题意是找最长的序列,序列满足(原序列的下标)ij | ij+1 且aij<aij+1 定义dp[i]为以a[i]为结尾的最长的序列,ans最后O(n)更新,很容易想到对i来说可以用i的所有因子更新dp[i],如果是质因子那么很好处理,处理因子有点麻烦。 对于i来说,它可以更新2*i,那么状态转移方程就出来了 dp[j]=max{dp[i]+1} Greatest Common Increasing Subsequence LICS E - Good Sequenc原创 2021-07-28 19:44:56 · 80 阅读 · 0 评论 -
cf1528A -树形dp
1528A 掌握程度还是太浅了,简单的树形dp居然没看出来,构造半天。 dp[i][0]+=max{dp[j][1]+abs(r[j]-l[i]),dp[j][0]+abs(l[v]-l[i])} dp[i][1]+=max{dp[j][1]+abs(r[j]-r[i]),dp[j][0]+abs(l[v]-r[i])} 答案是max{dp[1][0],dp[1][1]} 所以我1600了? 具体就是每个点我只考虑边界,0表示左边界,1表示右边界,更新父节点时,使用相邻节点的右节点就应该只使用右边界去更新。原创 2021-06-10 21:13:19 · 86 阅读 · 0 评论 -
1513B. AND Sequences解题报告
1513B. AND Sequences 题意是长n的序列,对任意i来说,a1&a2&…&ai==ai+1&…&an 那么这个序列是好序列,找到所有的好序列,不同位置的数的排放视为不同。 找不同位置1的数量,奇偶分情况啊,组合数学做到崩溃,数学基础太薄弱。 看题解后,恍然大悟,只要考虑1和n位置上的数是不是序列中最小的数字即可,然后用全排列乘法。 具体原理对于1个序列pre2≤pre1前缀,suf2≤suf3后缀,pref1是最小和sufn是序列中最小的数后中间无论什原创 2021-06-08 11:00:42 · 199 阅读 · 0 评论 -
1458A解题报告
Codeforces Round #691 (Div. 1)-1458A 又不是不会欧几里得,又不是不会更相减损术 gcd(a,b) → gcd(a,b-a) gcd(a,b,c) → gcd(a,b-a,c-b) gcd(a1+bj,…,an+bj)转化为gcd(a1+bj,a2-a1,…,an-an-1) 求出后面那段的gcd,然后每次用a1+bj求gcd即可,负数细节 ...原创 2021-05-27 22:04:08 · 84 阅读 · 0 评论 -
cf1509C解题报告
cf1509C //不要再差一点了 看了题解才过的,卡test6 一开始思路是把一样的数放一堆,根据堆来做dfs,看题解后发现想太多了,直接对区间进行dfs(区间dp学的太菜,没打出来),记忆化搜索也写丑了。 很简单的一道题 dp while(tt--) { cin>>n; int c=0; rep(i,1,n) cin>>a[i]; sort(a+1,a+1+n); rep(i,1,n) rep(j,1,n) dp[i][j]=1e18; rep(原创 2021-05-25 22:08:53 · 157 阅读 · 0 评论 -
埃氏筛以及其的计数思想
这样一个问题: 给你一个正整数n,求某个数,该数的所有因子和等于n 埃氏筛 int vis[N],prime[N]; void esieve(int n) { int cnt=0; for(int i=2;i*i<=n;i++) { if(!vis[i]) { prime[++cnt]=i; for(int j=i*2;j<=n;j+=i) vis[j]=1; } } } //没深入理解算法的本质,太菜了 利用埃氏筛的思想我们能轻松地计算出数i的所有因子和 在第二层循原创 2021-05-25 20:28:47 · 83 阅读 · 0 评论 -
Gym102942
计数dp? i-----j k=j-i+1 思路:最右边的-可有选择k,根据这个选择的排列靠左边那一个会有k,k-1…1种选择,从这个思路出发,我们把-的个数抽象为进行轮数,我们可以认为当-个数为1时,有一个k,它的贡献就是数量乘k,到第二轮的时候会有1个k(k的数量总是1),1个k-1…1个1,我们用它们的数量乘本身可得到第二轮答案,到这里,答案很明显了,我们只要算出第b轮1到k的数量即可,实际上我们k从什么开始也会影响答案,这里用一个dp[i][n][k]表示从i(最大可选择的数)开始进行到n轮时数k的原创 2021-04-15 21:31:52 · 88 阅读 · 0 评论 -
Codeforces 1405C
1405C 好题啊。 一开始想法是用一个sum[i]数组,遇到1 sum[i]++,遇到0 sum[i]- -,用cnt[i]表示前i位有多少个?,从k开始遍历sum,sum[i]-sum[i-k]表示长度为k的串中多出多少个0或1,用绝对值表示为res。同理cnt[i]-cnt[i-k]表示该串中?数量,如果该值大于等于res,那么该区间可以用?号表示0或1来使得区间的0,1数量相等 贴下WA代码 int main() { int tt;cin>>tt; while(tt--) { i原创 2020-10-16 10:59:10 · 82 阅读 · 0 评论 -
codeforces 1426F dp题
1426F 2k分的dp哦 给一个带?的字符串,?可以为a,b,c。找有多少个abc子序列(不是找最大的那个子序列) dp[i]表示到第i个位置的个数 dp[i]记录什么?a的数量?ab的数量,abc的数量? dp[i][0]到第i位a的数量 dp[i][1]。。。ab的数量 dp[i][2]。。。abc的数量 关键点,dp过程中遇到?字符,原串个数应当乘以3, 比如?a,读到a的时候,该位的个数+3,为什么?a,b,c能取三种值 ac?b?c,读到第一个?时候,a的个数应该乘3,再加上一个k,这个时候a的原创 2020-10-14 22:00:47 · 99 阅读 · 0 评论