Codeforces-Educational Codeforces Round 53题解
写之前,先发表下感慨:好久没写题解了,也许是因为自己越来越急利了,也可以说是因为越来越懒了。
A. Diverse Substring
直接找一找有没有相邻的两个不同的字符即可。
B. Vasya and Books
分别记录书本摆放顺序$a[]$,取书顺序$b[]$,每本书的位置$pos[]$,每本书在不在书堆上$in[]$,书堆最顶端的书的位置$top$(因为用的是数组,元素位置是固定的)。
然后,按照题意枚举输入的取书顺序$b[]$,同时记录答案$ans$,更新$top$即可。
C. Vasya and Robot
过滤掉目的地坐标累加和的绝对值和指令长度奇偶性不相同的情况。然后,剩余的所有情况,要么指令步数不够,要么一定有解。此时,答案满足单调性(如果不提前过滤掉奇偶性不同的情况,答案不满足单调性),二分答案即可。具体做法是,预处理出$x$轴方向的前缀和(向右$+1$,向左$-1$)和后缀和,以及$y$轴方向的前缀和(向上$+1$,向下$-1$)和后缀和,二分答案时,直接枚举区间左端点,然后$O(1)$检查枚举区间之外的$x$轴方向和$y$轴方向所需要改变的步数是不是小于二分枚举的区间长度。注意,这个地方只能用$\le$,不能用$==$,否则,会错在这样的样例上:
RRRRRRR
具体代码如下(附个人自用的测试样例):
#include<bits/stdc++.h> using namespace std; int n; ]; int dx,dy; ],postx[]; ],posty[]; bool can(int len){ ;i+len-<=n;++i){ ]+postx[i+len])); ]+posty[i+len])); if(needx+needy==len){ ; } } ; } int main() { ,cnty=; scanf(,&dx,&dy); ;i<=n;++i){ prex[i]=prex[i-],prey[i]=prey[i-]; if(s[i]=='L')prex[i]--,cntx--; else if(s[i]=='R')prex[i]++,cntx++; else if(s[i]=='D')prey[i]--,cnty--; else if(s[i]=='U')prey[i]++,cnty++; } ;--i){ postx[i]=postx[i+],posty[i]=posty[i+]; if(s[i]=='L')postx[i]--; else if(s[i]=='R')postx[i]++; else if(s[i]=='D')posty[i]--; else if(s[i]=='U')posty[i]++; } !=(abs(cntx)+abs(cnty))%); ,high=n+,mid; ){ mid=(low+high)/; if(can(mid))high=mid; else low=mid; } )printf("%d\n",high); else puts("-1"); ; } /* 7 RRRRRRR 3 0 7 LRLRLRR 3 2 3 UUU 0 2 7 RRRUUUU 1 5 6 UUUUUU 0 6 5 DDDDD 0 1 7 RRRUUUL 7 0 4 URDL 0 0 3 DDD 0 0 2 RR 0 0 16 UUUUUUUUUUUUUUUU 0 15 2 LD -1 -1 5 RURUU -2 3 6 RRRUUU 2 -2 **/
D. Berland Fair
①先考虑$T$大于序列和的情况:此时,$ans+=\frac{T}{序列和}*序列长度$,同时$T%=序列和$;
②当$T$小于序列和时,枚举序列的所有元素,如果$a[i]\le T$,那么$T-=a[i],ans+=1$,并且把$a[i]$放到一个临时序列中,同时记录这些$a[i]$的和,枚举原序列结束后,用临时序列替换原序列,回到步骤①。当临时序列为空时,说明没有$a[i]\le T$,那么,退出循环,输出答案。
#include<bits/stdc++.h> using namespace std; typedef long long LL; #define pb(x) push_back(x) LL n,a[]; int main() { LL tot,sum=,ans=; vector<LL> v,tmp; scanf("%lld%lld",&n,&tot); ;i<=n;++i)scanf("%lld",a+i),v.pb(a[i]),sum+=a[i]; ){ if(tot>=sum){ ans+=(tot/sum)*(LL)v.size(); tot%=sum; } tmp.clear(); sum=; ;i<v.size();++i){ if(v[i]<=tot){ tot-=v[i]; sum+=v[i]; ans++; tmp.pb(v[i]); } } )break; v.assign(tmp.begin(),tmp.end()); } printf("%lld\n",ans); ; } /* 3 1000000000000000000 1000000000 1000000000 1000000000 7 1000000000000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 6 1000000000000000000 1 1000000000 1 1000000000 1000000000 1000000000 **/
E. Segment Sum
裸的数位$dp$。$dp[pos][sum][bit]$表示前面的数位累加和为$sum$,前面使用过的数字的二进制表示为$bit$时,从$pos$位开始往下搜索,后面的数位随意组合,可以搜索到的满足条件的数字个数以及他们的和。$dp$数组用$pair<long\ long,long\ long>$表示。注意,$dp[pos][sum][bit].second$是表示从$pos$位开始往下搜索,搜到的满足条件的数字的后$pos$位的和。前面的权值部分不算,否则就乱套了。另外,是和,也就是权值和,相当于取后半截作为一个数字的值,而不是数位和。
#include<bits/stdc++.h> using namespace std; #define pb(x) push_back(x) #define mk(x, y) make_pair(x, y) typedef long long LL; typedef pair<LL,LL> pll; LL x,y,k; ; ],dn; pll dp[][][]; LL pow10[]; pll dfs(int pos,int sum,int bit,bool limit,bool lead){ )return __builtin_popcount(bit)<=k?mk(1LL,0LL):mk(0LL,0LL); )return dp[pos][sum][bit]; pll ans=mk(,); ,top=limit?digit[pos]:;i<=top;++i){ pll pp=dfs(pos-,sum+i,lead&&i==?bit:bit|(<<i),limit&&i==top,lead&&i==); ans.first+=pp.first%mod; ans.second+=(i*pow10[pos-]%mod*pp.first%mod+pp.second)%mod; if(ans.second>=mod)ans.second%=mod; } if(!limit)dp[pos][sum][bit]=ans; return ans; } LL solve(LL v){ ); dn=; ){ digit[++dn]=v%; v/=; } ,,,).second; } int main() { pow10[]=1LL; ;i<=;++i)pow10[i]=pow10[i-]*10LL; memset(dp,-,sizeof(dp)); scanf("%lld%lld%lld",&x,&y,&k); printf())%mod); ; } /* 1 100000000 9 **/
F. Choosing Two Paths
G. Yet Another LCP Problem
Codeforces-Educational Codeforces Round 53题解的更多相关文章
- Codeforces Educational Codeforces Round 44 (Rated for Div. 2) F. Isomorphic Strings
Codeforces Educational Codeforces Round 44 (Rated for Div. 2) F. Isomorphic Strings 题目连接: http://cod ...
- Codeforces Educational Codeforces Round 44 (Rated for Div. 2) E. Pencils and Boxes
Codeforces Educational Codeforces Round 44 (Rated for Div. 2) E. Pencils and Boxes 题目连接: http://code ...
- [codeforces][Educational Codeforces Round 53 (Rated for Div. 2)D. Berland Fair]
http://codeforces.com/problemset/problem/1073/D 题目大意:有n个物品(n<2e5)围成一个圈,你有t(t<1e18)元,每次经过物品i,如果 ...
- Codeforces Educational Codeforces Round 54 题解
题目链接:https://codeforc.es/contest/1076 A. Minimizing the String 题意:给出一个字符串,最多删掉一个字母,输出操作后字典序最小的字符串. 题 ...
- Codeforces Educational Codeforces Round 57 题解
传送门 Div 2的比赛,前四题还有那么多人过,应该是SB题,就不讲了. 这场比赛一堆计数题,很舒服.(虽然我没打) E. The Top Scorer 其实这题也不难,不知道为什么这么少人过. 考虑 ...
- Codeforces Educational Codeforces Round 5 E. Sum of Remainders 数学
E. Sum of Remainders 题目连接: http://www.codeforces.com/contest/616/problem/E Description The only line ...
- Codeforces Educational Codeforces Round 5 D. Longest k-Good Segment 尺取法
D. Longest k-Good Segment 题目连接: http://www.codeforces.com/contest/616/problem/D Description The arra ...
- Codeforces Educational Codeforces Round 5 C. The Labyrinth 带权并查集
C. The Labyrinth 题目连接: http://www.codeforces.com/contest/616/problem/C Description You are given a r ...
- Codeforces Educational Codeforces Round 5 B. Dinner with Emma 暴力
B. Dinner with Emma 题目连接: http://www.codeforces.com/contest/616/problem/A Description Jack decides t ...
随机推荐
- Unity 代码 学习
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z A: B: using System; using System.Runtime.Compile ...
- xml配置*的问题
spring配置种classpath * 和classpath的问题,class path有多个的情况下,会匹配第一个 <context:component-scan/>中两个**表示可以 ...
- 17行代码解决微信小程序图片延迟加载
js 页面 Page({ data: { realScrollTop: 0,//页面滚动距离 driveHeight //屏幕高度可初始化设置 }, scroll(e){ if(e.detail.sc ...
- SVN怎么触发Jenkins自动构建
通常,有几种方式可以在SVN仓库发生改变时触发Jenkins进行构建.第一种是,Jenkins主动轮询SVN仓库:第二种是,在SVN客户端(如TortoiseSVN)创建客户端hooks来触发构建:第 ...
- win7 上运行 php7 +
win7 安装 php7+ 很简单, 这里不赘述 如何在phpstudy 添加 php7 百度也很容易找到. 但是在 php 7 运行的时候总是报0x0000007 或者 缺少 .dll 文 ...
- java网络编程Socket通信详解
Java最初是作为网络编程语言出现的,其对网络提供了高度的支持,使得客户端和服务器的沟通变成了现实,而在网络编程中,使用最多的就是Socket.像大家熟悉的QQ.MSN都使用了Socket相关的技术. ...
- IntelliJ Idea 跳出括号并且光标移到末尾的快捷键
直接跳出的shift enter不管现在光标在哪个位置,直接新开一行 跳出双引号:shift + "跳出单引号:'跳出括号:shift + )跳出中括号:]以此类推.
- 黄聪:is_file和file_exists效率比较
目前在弄文件缓存的时候用到了判定文件存在与否,is_file()还是file_exists()呢?is_file和file_exists两者效率比较起来,谁的运行速度更快呢?还是做个测试吧: 1 2 ...
- windows下怎么生成github的ssh公钥
windows下如何生成github的ssh公钥: 1.首先你要安装Git工具 2.在C:\Documents and Settings\Administrator\目录下,运行Git Bash he ...
- PREV-6_蓝桥杯_翻硬币
问题描述 小明正在玩一个“翻硬币”的游戏. 桌上放着排成一排的若干硬币.我们用 * 表示正面,用 o 表示反面(是小写字母,不是零). 比如,可能情形是:**oo***oooo 如果同时翻转左边的两个 ...