Codeforces Round #744 (Div. 3)ABCDE1E2FG题解
Posted quinn18
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #744 (Div. 3)ABCDE1E2FG题解相关的知识,希望对你有一定的参考价值。
文章目录
A - Casimir’s String Solitaire
题目链接
题意:给你一个串,每次可以删一个
A
A
A 和一个
B
B
B 或者删一个
B
B
B 和
C
C
C 问你最后能不能删光所有的字符
所以一个 A A A对应一个 B B B,一个 C C C对应一个 B B B,所以 a + c = = b a+c==b a+c==b
#include <iostream>
#include<string>
using namespace std;
signed main()
int t;
cin>>t;
while(t--)
string s;
cin>>s;
int a=0, b=0,c=0;
for(int i=0; i<s.size(); i++)
if(s[i]=='A') a++;
if(s[i]=='B') b++;
if(s[i]=='C') c++;
if(b==a+c) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
return 0;
B - Shifting Sort
题目链接
题意:你每次能选择一个区间把里边的数字整体向左边转
k
k
k 个,最终要使数列有序。操作次数不能超过
n
n
n 次
这个不能超过
n
n
n 次
就能想到每次把这个位置应该在的数字给转到这一位
摸你一下就好了
#include<bits/stdc++.h>
using namespace std;
int a[1005];
int b[1005];
int c[1005];
struct node
int l, r;
int d;
ans[55];
signed main()
int t; cin>>t;
while(t--)
int n;cin>>n;
for(int i=1; i<=n; i++)
cin>>a[i];
b[i]=a[i];
sort(b+1, b+1+n);
int cnt=1; int q=0; int ks=1;
while(1)
for(int i=ks; i<=n; i++)
if(a[i]==b[cnt])
if(i==ks) //假如本来就在这位就直接找下一个位置了因为不能l!=r
cnt++;
ks++;
break;
cnt++;
ans[++q].l=ks;//存答案
ans[q].r=i;
ans[q].d=i-ks;
int w=a[i];
for(int k=i; k>=ks+1; k--) a[k]=a[k-1];//把区间转过来
a[ks]=w;
ks++;
bool f=1;
for(int j=2; j<=n; j++) if(a[j]<a[j-1]) f=0;break;
if(f||ks==n) break;
cout<<q<<endl;
for(int i=1; i<=q; i++)
cout<<ans[i].l<<" "<<ans[i].r<<" "<<ans[i].d<<endl;
return 0;
C - Ticks
题意:给你一张画好的长方形纸,有长成 V V V 的样子的虫子在上面,可以重叠,问你是不是所有的虫子长度都大于等于 k k k
那我们就去找 V V V 最下面的那个点,然后把合法的虫子位置标记一下,最后看看有没有多的虫子
#include<bits/stdc++.h>
#define pii pair<int, int>
#define int long long
using namespace std;
char a[20][20];
bool vis[25][25];
int n, m, k;
bool in (int x, int y) //判断在不在图内
return x>=1&&x<=n&&y<=m&&y>=1;
signed main()
ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int t; cin>>t;
while(t--)
memset(vis, 0, sizeof vis);//清空
cin>>n>>m>>k;
for(int i=1; i<=n; i++)
cin>>a[i]+1;
for(int i=n; i>=1; i--)
for(int j=m; j>=1; j--)
if(a[i][j]=='*')
int o=0;
int x=i;
int y=j;
int xx=i;
int yy=j;
//cout<<endl;
while(in(x, y)&&in(xx, yy)&&a[x][y]=='*'&&a[xx][yy]=='*')
x--;xx--;
y--;
yy++;
o++;
o--;
if(o>=k)
x=i, y=j, xx=i, yy=j;
// cout<<i<<" "<<j<<endl;
while(in(x, y)&&in(xx, yy)&&a[x][y]=='*'&&a[xx][yy]=='*')
vis[x][y]=vis[xx][yy]=1;
x--;xx--;
y--;
yy++;
bool q=1;
for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) if(!vis[i][j]&&a[i][j]=='*') q=0;
if(q) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
return 0;
D - Productive Meeting
题目链接
题意:一堆人交流,两个人每交流一次他们交流的次数就会少一次(狗头,问最多的交流次数
贪心
因为我们不希望有人退出会议(退出会议代表选择变少了,更容易出现剩一个人权值很大的情况),因此每次都取拥有最大a[i]的和次大a[i]的两个人开展对话,这样一定是最优的。或者可以每次取最大和最小的。
让交流次数多的人先交流,直到只剩一个人或者都不能交流了
优先队列里直接排序了
#include<bits/stdc++.h>
#define pii pair<int, int>
#define int long long
using namespace std;
struct node
int a, b;
b[200005];
signed main()
int t;
cin>>t;
while (t--)
int n;
cin >> n;
priority_queue<pii> q;
for(int i=1; i<=n; i++)
int x;
cin>>x;
if(x) q.push(x, i);
int cnt=0;
while (!q.empty())
if (q.size() == 1) break;
pii x=q.top();
q.pop();
pii y=q.top();
q.pop();
++cnt;
b[cnt].a=x.second;
b[cnt].b = y.second;
x.first--;
y.first--;
if (x.first!=0) q.push(x);
if (y.first!=0) q.push(y);
cout<<cnt<<endl;
for(int i=1; i<=cnt; i++) cout<<b[i].a<<" "<<b[i].b<<endl;
return 0;
E1 - Permutation Minimization by Deque
题目链接
题意:你有一个双端队列,你可以把当前的数字放在队首也可以放在队尾,最后使队列里的序列字典序最小
所以遇到比头小的就放在头,不然就放在尾
用数组摸你队列
#include<bits/stdc++.h>
using namespace std;
int a[200005];
int b[1000005];
signed main()
int t; cin>>t;
while(t--)
int n;
cin>>n;
for(int i=1; i<=n; i++)
cin>>a[i];
int ks=200005;
int js=200005;
b[ks]=a[1];
for(int i=2; i<=n; i++)
if(a[i]<b[ks]) b[--ks]=a[i];
else b[++js]=a[i];
for(int i=ks; i<=js; i++)
cout<<b[i]<<" ";
cout<<endl;
return 0;
E2. Array Optimization by Deque
题目链接
题意: 有个双端队列,你要通过翻转相邻的数字使放入以后的序列变得有序,问最小翻转次数的序列
贪心+离散化+树状数组
每次判断插到头增加的翻转次数和插到尾增加的翻转次数,每次选择小的拿那个, 插到头的增加的翻转次数等于当前数列比他小的数的个数,插到尾的翻转次数等于当前数列比他大的数的个数
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e5 + 5;
struct node
int w;
int id;
a[N];
int c[N];
int b[N];
int n;
int lowbit(int x)
return x&(-x);
void add(int i, int k)
while(i<=n)
c[i]+=k;
i+=lowbit(i);
int get(int i)
int res=0;
while(i>0)
res+=c[i];
i-=lowbit(i);
return res;
signed main()
int t; cin>>t;
while(t--)
cin>>n;
for(int i=1; i<=n; i++)
int w;
cin>>w;
a[i].w=w;
a[i].id=i;
b[i]=w;
sort(b+1, b+1+n);
for(int i=1; i<=n; i++) a[i].w=lower_bound(b+1, b+1+n, a[i].w)-b;
int ans=0;
for(int i=1; i<=n; i++)
add(a[i].w, 1);
int x=get(a[i].w-1);
int y=get以上是关于Codeforces Round #744 (Div. 3)ABCDE1E2FG题解的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #744 (Div. 3) A-F 题解
Codeforces Round #744 (Div. 3) A-F 题解
Codeforces Round #744 (Div. 3)ABCDE1E2FG题解
Codeforces Round #744 (Div. 3)ABCDE1E2FG题解