牛客小白月赛105 C,D,E题解

题目链接:C题

本来想用搜索,发现不行后还是分类讨论了,我在原来的图形上加了一圈'x'方便判断,里面的搜索可要可不要。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll lo=1e9+7,maxx=0,l,r,t;
char a[4][250500];
ll mod=1e9+7;
ll n,m,k,z,b[500050]={0};
//ll c[500000],d[500050];
ll dx[4]={1,-1,0,0};
ll dy[4]={0,0,1,-1};
ll rx[4]={-1,1,1,-1};
ll ry[4]={1,-1,1,-1};
int inis(int x,int y){
	ll su=0;
	for(int i=0;i<4;i++){
		ll xx=x+dx[i];
		ll yy=y+dy[i];
		if(a[xx][yy]=='.'){
			su++;
		}
	}
	return su;
}
int init(int x,int y){
	ll su=0;
	for(int i=0;i<4;i++){
		ll xx=x+rx[i];
		ll yy=y+ry[i];
		if(a[xx][yy]=='x'){
			su++;
		}
	}
	return su;
}
int main(){
	cin>>n;
	ll sum=0;
	a[1][0]='x';
	a[2][0]='x';
	a[1][n+1]='x';
	a[2][n+1]='x';
	for(int i=1;i<=2;i++){
		for(int j=1;j<=n;j++){
			cin>>a[i][j];
		}
	} 
	for(int i=0;i<=n+1;i++){
		a[0][i]='x';
		a[3][i]='x';
	}
	for(int i=1;i<=2;i++){
		for(int j=1;j<=n;j++){
			if(a[i][j]=='.'){
				ll az=inis(i,j);
				ll ax=init(i,j);
				if(a[i][j-1]=='.'&&a[i-1][j]=='.'&&a[i-1][j-1]=='x'){
					sum++;
				}
				else if(a[i][j+1]=='.'&&a[i-1][j]=='.'&&a[i-1][j+1]=='x'){
					sum++;
				}
				else if(a[i][j+1]=='.'&&a[i+1][j]=='.'&&a[i+1][j+1]=='x'){
					sum++;
				}
				else if(a[i][j-1]=='.'&&a[i+1][j]=='.'&&a[i+1][j-1]=='x'){
					sum++;
				}
				else if(az==0){
					sum++;
				}
				else if(az==2&&a[i-1][j]=='x'&&a[i+1][j]=='x'){
					sum++;
				}
			}
		}
	}
	cout<<sum<<endl;
}

题目链接:D题

就是一个并查集加上二维存储,用动态数组方便存储

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m,t,k;
ll sum[500500]={0};
ll a[500500]={0};
ll b[500500]={0};
vector<ll> f[210050];
void inis(){
	for(int i=1;i<=n;i++){
		a[i]=i;
	}
	return;
}
int cha(int x){
	if(a[x]==x){
		return x;
	}
	else return a[x]=cha(a[x]);
}
void bing(int x,int y){
	int fx,fy;
	fx=cha(x);
	fy=cha(y);
	if(fx==fy){
		return;
	}
	else a[fx]=fy;
	return;
}
int main(){
    cin>>n>>m;
    inis();
    for(int i=1;i<=n;i++){
    	cin>>sum[i];
	}
	for(int i=0;i<m;i++){
		ll xx,yy;
		
		cin>>xx>>yy;
        b[xx]=1;
		b[yy]=1;
		bing(xx,yy);
	}
	ll su=0;
	for(int i=1;i<=n;i++){
		if(b[i]==1){
			su++;
			f[cha(i)].push_back(sum[i]);
		}
	}
	ll ans=0;
	for(int i=1;i<=n;i++){
		if(f[i].size()!=0){
			sort(f[i].begin(),f[i].end());
			ll x=1;
			ll y=1;
			for(int j=0;j<f[i].size()-1;j++){
				if(f[i][j]==f[i][j+1]){
					x++;
				}
				else{
					x=1;
				}
				y=max(x,y);
			}
			ans+=y;
		}
	}
	cout<<su-ans<<endl;
}

题目链接:E题

把括号存储想象成一个栈,读到左括号就是入栈,这时n-栈的长度就是能出几个括号

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m,t,l,r,k;
ll maxx=1e9+7,a[500050],b[500050],c[500050];
ll ac[105][105]={0};
int main(){
	string s;
	cin>>n;
	cin>>s;
	ll ans=0,sum=0,ro=0;
	for(int i=0;i<n*2;i++){
		if(s[i]=='('){
			ans++;
			a[ro++]=n-ans;
			//cout<<n-ans<<' ';
		}
		if(s[i]==')'){
			sum++;
			if(ans>0&&sum>0){
			ans--;
			sum--;
		}
		}
		
	}
	if(sum==0&&ans==0){
		for(int i=0;i<ro;i++){
			cout<<a[i]<<' ';
		}
	}
	else{
		cout<<"-1"<<endl;
	}
	
}

 

posted @ 2024-11-23 15:52  薇尔莉特·伊芙加登  阅读(60)  评论(2)    收藏  举报