Codeforces AIM Tech Round 5 (rated, Div. 1 + Div. 2) A—C题解

比赛传送门

A. Find Square

我们分别正着、反着搜一遍矩阵,找到只含有"W"的子矩阵的左上角与右下角

那么中心的x坐标就是两点(左上角和右下角)x坐标的和的一半,y坐标也一样。

#include<bits/stdc++.h>
using namespace std;
inline int read(){
	char c=getchar();int num=0;int f=1;
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){num=(num<<3)+(num<<1)+(c^48);c=getchar();}
	return num*f;
}
inline void qwq(int x){
	if(x>9)qwq(x/10);
	putchar(x%10+'0');
}
inline void write(int x){
	if(x<0){x=-x;putchar('-');}
	qwq(x);
}
char maps[120][120];
int co[5];

int main(){
	int n=read();int m=read();
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>maps[i][j];
		} 
	}
	
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(maps[i][j]=='B'){
				co[1]=i;co[2]=j;break;
			}
		}
		if(co[1])break;
	} 
	for(int i=n;i>=1;i--){
		for(int j=m;j>=1;j--){
			if(maps[i][j]=='B'){
				co[3]=i;co[4]=j;break;
			}
		}
		if(co[3])break;
	}
	
	int ansx=(co[1]+co[3])/2;int ansy=(co[2]+co[4])/2;
	write(ansx);putchar(' ');write(ansy);putchar('\n');
	return 0;
}

B. Unnatural Conditions

这道题很奇葩呀。。。我们可以构造出一对(a,b)使得他对于该题的任何一组数据都合法。

首先这对(a,b)的数位和都大于1129即可,至于s(a+b)<=m的构造方法,

我们可以使得(a+b)的数位和为1,即a+b=10^k(k为整数)。

总的方案个数不少,

作者想到的是55.....5和45.......5。

#include<bits/stdc++.h>
#define rep(i,j,k) for(int i=j;i<=k;i++)
using namespace std;
inline int read(){
	char c=getchar();int num=0;int f=1;
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){num=(num<<3)+(num<<1)+(c^48);c=getchar();}
	return num*f;
}
inline void qwq(int x){
	if(x>9)qwq(x/10);
	putchar(x%10+'0');
}
inline void write(int x){
	if(x<0){x=-x;putchar('-');}
	qwq(x);
}

int main(){
	int n=read();int m=read();
	rep(i,1,300){
		write(5);
		if(i==300)putchar('\n');
	}
	rep(i,1,300){
		write(5-(i!=300));
		if(i==300)putchar('\n');
	}
	return 0;
}

C. Rectangles

我们先计算出同时位于n个矩形的点所在的范围,用于题目中一样的表示方式,这个范围就是(lx,ly),(rx,ry)。

若该范围合法,那没我们就直接输出。若不合法,我们枚举删掉哪个矩阵,使得范围合法。最后输出lx,ly即为一个可行答案。

计算同时位于n个矩形的点的范围的方法就是,对所有fx,fy取最大值,对所有sx,sy取最小值。

而删掉一个矩阵后的范围倒推一下即可。(自行配合程序理解一下吧)

#include<bits/stdc++.h>
#define rep(i,j,k) for(int i=j;i<=k;i++)
using namespace std;
inline int read(){
	char c=getchar();int num=0;int f=1;
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){num=(num<<3)+(num<<1)+(c^48);c=getchar();}
	return num*f;
}
struct wzy{
	int fx,fy,sx,sy;
}co[140010];
int temp1[140010];int temp2[140010];
int temp3[140010];int temp4[140010];
inline bool cmp(int a,int b){
	return a>b;
}
int main(){
	int n=read();
	rep(i,1,n){
		co[i].fx=read();co[i].fy=read();temp1[i]=co[i].fx;temp2[i]=co[i].fy;
		co[i].sx=read();co[i].sy=read();temp3[i]=co[i].sx;temp4[i]=co[i].sy;
	} 
	sort(temp1+1,temp1+n+1,cmp);sort(temp2+1,temp2+n+1,cmp);
	sort(temp3+1,temp3+n+1);sort(temp4+1,temp4+n+1);
	
	int lx,ly,rx,ry;
	lx=temp1[1];ly=temp2[1];rx=temp3[1];ry=temp4[1];
	if(lx<=rx&&ly<=ry){
		cout<<lx<<" "<<ly<<endl;
		return 0;
	}
	
	rep(i,1,n){
		if(co[i].fx==lx){lx=temp1[2];}
		if(co[i].fy==ly){ly=temp2[2];}
		if(co[i].sx==rx){rx=temp3[2];}
		if(co[i].sy==ry){ry=temp4[2];}
		
		if(lx<=rx&&ly<=ry){
			cout<<lx<<" "<<ly<<endl;
			return 0;
		}
		lx=temp1[1];ly=temp2[1];rx=temp3[1];ry=temp4[1];
	}
	return 0;
}

有时间还会继续更这场比赛的后续几道题的哟~~~

猜你喜欢

转载自blog.csdn.net/Bill_Benation/article/details/82224405