Codeforces Round #605 (Div. 3) 比赛总结
比赛情况
2h才刀了A,B,C,D。E题的套路做的少,不过ygt大佬给我讲完思路后赛后2min就AC了这题。
比赛总结
比赛时不用担心“时间短,要做多快”,这样会匆匆忙忙,反而会做得慢。比赛时应该要不紧不慢,理性思考,内心平静,题目反而会迎刃而解。
这次比赛又看错了题(B,D)。
解决办法:这次比赛看错题是因为不够细心,不够细心是因为急躁,怕做不完。所以沉稳冷静的分析,反而能更好地完成比赛。
那么就开始上题解吧!
A
cf常出的分类讨论题(OI好像不考?)。
如果三个人的位置互不相同,我们希望最左和最右的两个人尽量靠近,中间这个人走不走没有影响。
如果有两个人位置相同,问题就转化为两个人的情况,我们希望这“两个人”尽量靠近。
Talk is cheap.Show me the code.
#include<bits/stdc++.h>
using namespace std;
inline int read() {
int x=0,f=1; char ch=getchar();
while(ch<'0' || ch>'9') { if(ch=='-') f=-1; ch=getchar(); }
while(ch>='0'&&ch<='9') { x=(x<<3)+(x<<1)+(ch^48); ch=getchar(); }
return x * f;
}
int a[4];
void work() {
a[1] = read(), a[2] = read(), a[3] = read();
sort(a+1, a+1+3);
if(a[1]==a[2]) {
if(a[1]<a[3]) ++a[1], ++a[2];
if(a[1]<a[3]) --a[3];
} else if(a[2]==a[3]) {
if(a[1]<a[3]) ++a[1];
if(a[1]<a[3]) --a[2], --a[3];
} else {
if(a[1]<a[3]) ++a[1];
if(a[3]>a[1]) --a[3];
}
printf("%d\n",abs(a[1]-a[2])+abs(a[1]-a[3])+abs(a[2]-a[3]));
}
int main()
{
int q = read();
while(q--) work();
return 0;
}
B
cf常出的构造题(OI里面好像不考?)。
构造一个矩形。(‘L’这种指这个字符的数量)min(‘L’,‘R’)决定矩形的长,min(‘U’,‘D’)决定矩形的宽(不是严格的长和宽)。细节部分需要处理一下。
Talk is cheap.Show me the code.
#include<bits/stdc++.h>
using namespace std;
inline int read() {
int x=0,f=1; char ch=getchar();
while(ch<'0' || ch>'9') { if(ch=='-') f=-1; ch=getchar(); }
while(ch>='0'&&ch<='9') { x=(x<<3)+(x<<1)+(ch^48); ch=getchar(); }
return x * f;
}
int a[5];
void work() {
memset(a, 0, sizeof(a));
string s; cin>>s;
int len = s.length()-1;
for(int i=0;i<=len;++i) {
if(s[i] == 'L') a[1]++;
if(s[i] == 'R') a[2]++;
if(s[i] == 'U') a[3]++;
if(s[i] == 'D') a[4]++;
}
int A = min(a[1],a[2]), B = min(a[3],a[4]);
if(A==0 && B==0) puts("0");
else {
if(A==0) B = 1; if(B==0) A = 1;
printf("%d\n",(A+B)*2);
for(int i=1;i<=A;++i) cout<<"L";
for(int i=1;i<=B;++i) cout<<"U";
for(int i=1;i<=A;++i) cout<<"R";
for(int i=1;i<=B;++i) cout<<"D";
}
cout<<endl;
}
int main()
{
//freopen("test.out","w",stdout);
int q = read();
while(q--) work();
return 0;
}
C
双指针计数题,OI里面考吧?
(不要问我为什么考场上5min就切了这题,因为CometOJ的模拟赛里出了类似的题目我写了个dp错了,惨痛的教训)
双指针如果找到一个合法区间 \((l,r)\) 就用等差数列求和计算这个区间的贡献 \(\frac{(len+1)*len}{2} (len=r-l+1)\)
Talk is cheap.Show me the code.
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read() {
int x=0,f=1; char ch=getchar();
while(ch<'0' || ch>'9') { if(ch=='-') f=-1; ch=getchar(); }
while(ch>='0'&&ch<='9') { x=(x<<3)+(x<<1)+(ch^48); ch=getchar(); }
return x * f;
}
const int MAXN = 2e5+7;
int n,K,ans;
bool ok[MAXN];
char s[MAXN];
int calc(int x) {
return (x+1)*x/2;
}
signed main()
{
n = read(), K = read();
scanf("%s",s+1);
for(int i=1;i<=K;++i) {
char c; cin>>c;
ok[c] = 1;
}
int l = 1, r = 1;
while(r <= n) {
while(ok[s[r]] && r<=n) ++r;
ans += calc(r-l);
l = r + 1, r = l;
}
printf("%lld\n",ans);
return 0;
}
D
简单dp (怕CSP是不会考)。
设 \(f[i,0/1]\) 表示 \(0=> [1-i]\) 且以 i 结尾的最长上升子串, \(1=> [i-n]\) 且以 i 开头的最长上升子串。
枚举断点 \(Ans = max(Ans,f[i-1,0] + f[i+1,1])\)
当然也可以不断点,\(Ans\) 就是不断点里面最大的这个。看一下哪个 \(Ans\) 最大。
Talk is cheap.Show me the code.
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
inline int read() {
int x=0,f=1; char ch=getchar();
while(ch<'0' || ch>'9') { if(ch=='-') f=-1; ch=getchar(); }
while(ch>='0'&&ch<='9') { x=(x<<3)+(x<<1)+(ch^48); ch=getchar(); }
return x * f;
}
const int N = 2e5+7;
int n,ans;
int a[N];
int f[N][2];
int main()
{
n = read();
for(int i=1;i<=n;++i)
a[i] = read();
for(int i=1;i<=n;++i) {
if(a[i-1]<a[i]) f[i][0] = f[i-1][0] + 1;
else f[i][0] = 1;
ans = max(ans,f[i][0]);
}
a[n+1] = INF;
for(int i=n;i>=1;--i) {
if(a[i+1]>a[i]) f[i][1] = f[i+1][1] + 1;
else f[i][1] = 1;
ans = max(ans,f[i][1]);
}
//printf("%d\n",f[6][0]);
for(int i=2;i<=n-1;++i) {
if(a[i-1] < a[i+1]) ans = max(ans,f[i-1][0]+f[i+1][1]);
}
printf("%d\n",ans);
return 0;
}
E
题目大意
给你一个长度为 \(n\) 的序列 \(a[i]\),\(a[i]\) 表示可以从 \(i\) 点跳到 \(i+a[i]\) 或 \(i-a[i]\) (当然要满足 \(i+a[i]<=n\) , \(i-a[i]>=1\)),如果当前的 \(a[i]\) 是奇数,问按照这样跳,跳到一个 \(a[i]\) 是偶数的格子最少步数是多少,反之亦然。输出一个数组 \(g[i]\) 表示最小步数,如果 \(i\) 号格子跳不到符号条件的格子,输出-1。
(这鬼畜的题意)
01最短路,(CSP-J2019 T4刚刚考完)
一开始想用记忆化搜索,但是如果反向思考一下,从最后的格子跳到给定格子,就会想到我们的好朋友 Bfs,因为 Bfs 有首次到达就是最短路径的性质。具体思路如下:
dist[i,0/1] 从其他点表示到达 \(i\) 点且是 0/1(奇/偶) 的最短路长度
如果 i 点可达 \(i-a[i]\) 或 \(i+a[i]\),那么就反向建边,建一条 \((i-a[i]) => i\) 的边和一条 \((i+a[i]) => i\) 的边
把每个点的 \([i,a[i]\&1]\) 这个状态塞进队列,跑 Bfs
记得 dist[][] 数组初始值设为 \(-1\)。
Talk is cheap.Show me the code.
#include<bits/stdc++.h>
using namespace std;
inline int read() {
int x=0,f=1; char ch=getchar();
while(ch<'0' || ch>'9') { if(ch=='-') f=-1; ch=getchar(); }
while(ch>='0'&&ch<='9') { x=(x<<3)+(x<<1)+(ch^48); ch=getchar(); }
return x * f;
}
const int N = 2e5+7;
int n,cnt;
int head[N],a[N],dist[N][2];
struct Edge {
int next,to;
}edge[N<<1];
inline void add(int u,int v) {
edge[++cnt] = (Edge)<%head[u],v%>;
head[u] = cnt;
}
void Bfs() {
memset(dist, -1, sizeof(dist));
queue<pair<int,bool> > q;
for(int i=1;i<=n;++i) q.push(make_pair(i,a[i]&1)), dist[i][a[i]&1] = 0;
while(!q.empty()) {
pair<int,bool> u = q.front(); q.pop();
for(int i=head[u.first];i;i=edge[i].next) {
int v = edge[i].to;
if(dist[v][u.second]==-1) {
dist[v][u.second] = dist[u.first][u.second] + 1;
q.push(make_pair(v,u.second));
}
}
}
}
int main()
{
n = read();
for(int i=1;i<=n;++i) {
a[i] = read();
if(i+a[i] <= n) add(i+a[i],i);
if(i-a[i] >= 1) add(i-a[i],i);
}
Bfs();
for(int i=1;i<=n;++i)
printf("%d ",dist[i][(a[i]&1)^1]);
return 0;
}
F
补题成功!
Codeforces Round #605 (Div. 3) 比赛总结的更多相关文章
- 【cf比赛记录】Codeforces Round #605 (Div. 3)
比赛传送门 Div3真的是暴力杯,比div2还暴力吧(这不是明摆的嘛),所以对我这种一根筋的挺麻烦的,比如A题就自己没转过头来浪费了很久,后来才醒悟过来了.然后这次竟然还上分了...... A题:爆搜 ...
- Codeforces Round #605 (Div. 3)
地址:http://codeforces.com/contest/1272 A. Three Friends 仔细读题能够发现|a-b| + |a-c| + |b-c| = |R-L|*2 (其中L ...
- Codeforces Round #605 (Div. 3) E - Nearest Opposite Parity
题目链接:http://codeforces.com/contest/1272/problem/E 题意:给定n,给定n个数a[i],对每个数输出d[i]. 对于每个i,可以移动到i+a[i]和i-a ...
- Codeforces Round #605 (Div. 3) E. Nearest Opposite Parity(最短路)
链接: https://codeforces.com/contest/1272/problem/E 题意: You are given an array a consisting of n integ ...
- Codeforces Round #605 (Div. 3) D. Remove One Element(DP)
链接: https://codeforces.com/contest/1272/problem/D 题意: You are given an array a consisting of n integ ...
- Codeforces Round #605 (Div. 3) C. Yet Another Broken Keyboard
链接: https://codeforces.com/contest/1272/problem/C 题意: Recently, Norge found a string s=s1s2-sn consi ...
- Codeforces Round #605 (Div. 3) B. Snow Walking Robot(构造)
链接: https://codeforces.com/contest/1272/problem/B 题意: Recently you have bought a snow walking robot ...
- Codeforces Round #605 (Div. 3) A. Three Friends(贪心)
链接: https://codeforces.com/contest/1272/problem/A 题意: outputstandard output Three friends are going ...
- Codeforces Round #606 Div. 2 比赛总结
比赛情况 bq. A题 Wrong Answer on test 2 , E题sb题没切.bqbqbq. 比赛总结 bq. 那就直接上题解吧!^-^ A 数位dp,分类讨论,注意细节. Talk is ...
随机推荐
- React之父子组件之间传值
1.新增知识点 /** React中的组件: 解决html 标签构建应用的不足. 使用组件的好处:把公共的功能单独抽离成一个文件作为一个组件,哪里里使用哪里引入. 父子组件:组件的相互调用中,我们把调 ...
- Selenium 2自动化测试实战18(上传文件)
一.上传文件 上传文件是比较常见的web功能之一,但WebDriver没有提供专门用于上传的方法. 一般web页面的上传功能的操作需要单击“上传”按钮后打开本地的Window窗口,从窗口选择本地文件进 ...
- enumerable 可枚举 属性
一个对象的可枚举属性会在for...in中被访问到 (或是类似的迭代方法, Object.keys() 如果一个属性不是可枚举的,循环会忽略这个属性 var obj = { key: 'val' }; ...
- Python学习笔记:(十三)错误和异常
一.语法错误 在Python中语法错误称之为解析错误. 在语法分析器指出了出错的哪一行,并且在最先找到错误的位置标记了一个小小的箭头. 二.异常 1.异常处理 try except else fina ...
- IDEA/Git 提交/commit 忽略 文件夹
commit的时候.idea文件夹被默认选中了,如果忘记点掉就会被提交上去,想要默认忽略其实很简单. 找到项目根目录处的.gitignore文件(如果是用git版本控制的话) 双击打开之后 我们在最 ...
- java:多线程(代理模式,Thread中的方法,Timer,生产者和消费者)
*进程:一个正在运行的程序,进程是操作系统分配资源的基本单位,每个进行有独立的内存空间,进程之间切换开销较大. *线程:一个轻量级的进程,线程是任务调度的基本单位,一个进程可以有多个线程, * 系统没 ...
- 如何利用Prometheus监控你的应用
Prometheus作为一套完整的开源监控接近方案,因为其诸多强大的特性以及生态的开放性,俨然已经成为了监控领域的事实标准并在全球范围内得到了广泛的部署应用.那么应该如何利用Prometheus对我们 ...
- plsql连接本地oracle数据库,而远程主机却无法连接,出现无监听程序的解决方法(转)
原文转自:plsql连接本地oracle数据库,而远程主机却无法连接,出现无监听程序的解决方法 最近在使用plsql连接本地oracle数据库的时候,在同一网络环境中,出现了可以连接本地oracle, ...
- cocos2dx基础篇(24) 场景切换效果CCTransitionScene
[3.x] (1)去掉 "CC" (2)卡牌翻转 TransitionFlip 中的样式 tOrientation // //1: kCCTransitionOri ...
- python学习之迭代器
4.5 迭代器 4.5.1 可迭代对象 **字面意思分析**:可以重复的迭代的实实在在的东西. list,dict(keys(),values(),items()),tuple,str,set,ran ...