Codeforces Round #575 (Div. 3)

题解 Codeforces Round #575 (Div. 3)

本来抱着升rating的心情打一场div3,结果div3好像意料之外地难了一点..

A. Three Piles of Candies

热身题。将a,b,c升序排序一下,分类讨论一下即可

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;

int T;
ll a[4];

inline int read();

int main(){
	#ifndef ONLINE_JUDGE
	freopen("test.in","r",stdin);
	#endif

	T=read();
	while(T--){
		for(int i=1;i<=3;++i) scanf("%I64d\n",&a[i]);
		sort(a+1,a+4);
		if(a[3]<=a[2]-a[1]) printf("%I64d\n",a[1]+a[3]);
		else{
			a[3]-=(a[2]-a[1]); a[1]=a[2];
			printf("%I64d\n",a[1]+(a[3]>>1));
		}
	}

	return 0;
}

inline int read(){
	char tmp=getchar(); int sum=0; bool flag=false;
	while(tmp<'0'||tmp>'9'){
		if(tmp=='-') flag=true;
		tmp=getchar();
	}
	while(tmp>='0'&&tmp<='9'){
		sum=(sum<<1)+(sum<<3)+tmp-'0';
		tmp=getchar();
	}
	return flag?-sum:sum;
}

B. Odd Sum Segments

数列中的偶数没有什么太大的贡献。统计一下奇数的个数,比较一下即ok

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;

const int MAX=3e5+5;

int T,n,k,line[MAX],cnt,rec[MAX];

inline int read();

int main(){
	#ifndef ONLINE_JUDGE
	freopen("test.in","r",stdin);
	#endif

	T=read();
	while(T--){
		n=read(); k=read();
		cnt=0;
		for(int i=1;i<=n;++i) line[i]=read();
		for(int i=1;i<=n;++i) if(line[i]%2==1) cnt++;
		if(k>cnt) {printf("NO\n"); continue;}
		if((k%2)!=(cnt%2)) {printf("NO\n"); continue;}
		printf("YES\n");
		rec[0]=0;
		for(int i=1;i<=n;++i) if(line[i]%2==1) rec[++rec[0]]=i;
		for(int i=1;i<k;++i) printf("%d ",rec[i]);
		printf("%d\n",n);
	}

	return 0;
}

inline int read(){
	char tmp=getchar(); int sum=0; bool flag=false;
	while(tmp<'0'||tmp>'9'){
		if(tmp=='-') flag=true;
		tmp=getchar();
	}
	while(tmp>='0'&&tmp<='9'){
		sum=(sum<<1)+(sum<<3)+tmp-'0';
		tmp=getchar();
	}
	return flag?-sum:sum;
}

C. Robot Breakout

起初认为能同时处理横纵坐标,但写了100行+之后还没有丝毫要写完的迹象之后感觉有点不对劲.其实分别处理一下横纵坐标**,最后汇总即可。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;

const int MAX=1e5+5,TOP=1e5;

int T,n;
int pos[MAX][2],mov[MAX][5],bor[5];

inline int read();

int main(){
	#ifndef ONLINE_JUDGE
	freopen("test.in","r",stdin);
	#endif

	T=read();
	while(T--){
		n=read();
		for(int i=1;i<=n;++i){
			pos[i][0]=read(); pos[i][1]=read();
			for(int j=1;j<=4;++j) mov[i][j]=read();
		}
		bor[1]=TOP; bor[2]=-TOP; bor[3]=-TOP; bor[4]=TOP;
		bool flag=false;

		int l,r; r=1; l=3;
		for(int i=1;i<=n;++i){
			if(mov[i][l]&&mov[i][r]) continue;
			if(mov[i][l]){
				if(bor[r]<pos[i][0]) {flag=true; break;}
				bor[l]=max(bor[l],pos[i][0]);
			}
			if(mov[i][r]){
				if(bor[l]>pos[i][0]) {flag=true; break;}
				bor[r]=min(bor[r],pos[i][0]);
			}
			if(!mov[i][l]&&!mov[i][r]){
				if(bor[l]>pos[i][0]||bor[r]<pos[i][0]) {flag=true; break;}
				bor[l]=bor[r]=pos[i][0];
			}
		}
		if(flag) {printf("0\n"); continue;}
		l=2; r=4;
		for(int i=1;i<=n;++i){
			if(mov[i][l]&&mov[i][r]) continue;
			if(mov[i][l]){
				if(bor[r]<pos[i][1]) {flag=true; break;}
				bor[l]=max(bor[l],pos[i][1]);
			}
			if(mov[i][r]){
				if(bor[l]>pos[i][1]) {flag=true; break;}
				bor[r]=min(bor[r],pos[i][1]);
			}
			if(!mov[i][l]&&!mov[i][r]){
				if(bor[l]>pos[i][1]||bor[r]<pos[i][1]) {flag=true; break;}
				bor[l]=bor[r]=pos[i][1];
			}
		}
		if(flag) {printf("0\n"); continue;}
		printf("%d %d %d\n",1,bor[3],bor[2]);
	}

	return 0;
}

inline int read(){
	char tmp=getchar(); int sum=0; bool flag=false;
	while(tmp<'0'||tmp>'9'){
		if(tmp=='-') flag=true;
		tmp=getchar();
	}
	while(tmp>='0'&&tmp<='9'){
		sum=(sum<<1)+(sum<<3)+tmp-'0';
		tmp=getchar();
	}
	return flag?-sum:sum;
}

bool judge(int a,int b,int c,int d,int x,int y){
	if(x>=a&&x<=c&&y<=b&&y>=d) return true;
	return false;
}

D1. RGB Substring (easy version)

简单版,数据范围友善,暴力模拟就好

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;

const int MAX=2e3+5;

int T,n,k,line[MAX];

inline int read();
inline int getc();

int main(){
	#ifndef ONLINE_JUDGE
	freopen("test.in","r",stdin);
	#endif

	T=read();
	while(T--){
		n=read(); k=read(); int ans=k;
		for(int i=1;i<=n;++i) line[i]=getc();
		for(int i=1;i<=n-k+1;++i){
			int cur;
			for(int t=0;t<=2;++t){
				cur=t; int tmp=0;
				for(int j=0;j<=k-1;++j){
					if(line[i+j]!=((cur+j)%3)) tmp++;
				}
				ans=min(ans,tmp);
			}
		}
		printf("%d\n",ans);
	}

	return 0;
}

inline int read(){
	char tmp=getchar(); int sum=0; bool flag=false;
	while(tmp<'0'||tmp>'9'){
		if(tmp=='-') flag=true;
		tmp=getchar();
	}
	while(tmp>='0'&&tmp<='9'){
		sum=(sum<<1)+(sum<<3)+tmp-'0';
		tmp=getchar();
	}
	return flag?-sum:sum;
}

inline int getc(){
	char tmp=getchar();
	while(tmp!='R'&&tmp!='B'&&tmp!='G') tmp=getchar();
	if(tmp=='R') return 1;
	if(tmp=='G') return 2;
	if(tmp=='B') return 0;
}

D2. RGB Substring (hard version)

困难版,其实也没有难到哪里。由于是“RGB”的无限循环序列,答案必将于以不同的字母开头的循环序列重合,枚举一下就好。(再多10分钟,肯定能多做出来这道题(>人<;))

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

const int MAX=2e5+5;

int T,n,k,ans;
int col[MAX],line[MAX];

inline int read();
inline int getc();

int main(){
	#ifndef ONLINE_JUDGE
	freopen("test.in","r",stdin);
	#endif

	T=read();
	while(T--){
		n=read(); k=read();
		ans=k;
		for(int i=1;i<=n;++i) col[i]=getc();

		int cur=0;
		for(int i=1;i<=n;++i) line[i]=((col[i]==((0+i)%3))?1:0);
		for(int i=1;i<k;++i) if(line[i]) cur++;
		for(int i=k;i<=n;++i){
			if(line[i]) cur++;
			if(line[i-k]) cur--;
			ans=min(k-cur,ans);
		}

		cur=0;
		for(int i=1;i<=n;++i) line[i]=((col[i]==((1+i)%3))?1:0);
		for(int i=1;i<k;++i) if(line[i]) cur++;		
		for(int i=k;i<=n;++i){
			if(line[i]) cur++;
			if(line[i-k]) cur--;
			ans=min(k-cur,ans);
		}

		cur=0;
		for(int i=1;i<=n;++i) line[i]=((col[i]==((2+i)%3))?1:0);
		for(int i=1;i<k;++i) if(line[i]) cur++;
		for(int i=k;i<=n;++i){
			if(line[i]) cur++;
			if(line[i-k]) cur--;
			ans=min(k-cur,ans);
		}

		printf("%d\n",ans);
	}

	return 0;
}

inline int read(){
	char tmp=getchar(); int sum=0; bool flag=false;
	while(tmp<'0'||tmp>'9'){
		if(tmp=='-') flag=true;
		tmp=getchar();
	}
	while(tmp>='0'&&tmp<='9'){
		sum=(sum<<1)+(sum<<3)+tmp-'0';
		tmp=getchar();
	}
	return flag?-sum:sum;
}

inline int getc(){
	char tmp=getchar();
	while(tmp!='R'&&tmp!='G'&&tmp!='B') tmp=getchar();
	if(tmp=='R') return 1;
	if(tmp=='G') return 2;
	if(tmp=='B') return 0;
}
posted @ 2020-06-29 22:43  ticmis  阅读(123)  评论(0编辑  收藏  举报