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题解

Codeforces Round #744 (Div. 3)ABCDE1E2FG题解

Codeforces Round #436 E. Fire(背包dp+输出路径)