赛时95pts WA#20求助
查看原帖
赛时95pts WA#20求助
574644
lishunji楼主2024/12/11 16:34
#include<bits/stdc++.h>
using namespace std;//dc
long long T,n,a[400000],b[400000],t1[400000],t2[400000],ans,cnt1,tmp1,na,cnt2,tmp2,nb;
char rp;
struct node{
	long long l,r,num,ys;
}g1[400000],g2[400000];
long long findd1(long long pl){
	for(long long i=1;i<=cnt1;i++)
	    if((g1[i].l<=pl)&&(g1[i].r>=pl)) return i;
	return 0;
}
long long findd2(long long pl){
	for(long long i=1;i<=cnt2;i++) 
	    if((g2[i].l<=pl)&&(g2[i].r>=pl)) return i;
	return 0;
}
long long mian(){
	ans=cnt1=tmp1=na=cnt2=tmp2=nb=0;
	for(long long i=0;i<=399999;i++){
		a[i]=b[i]=t1[i]=t2[i]=0;
		g1[i].l=g1[i].r=g1[i].num=g1[i].ys=0;
		g2[i].l=g2[i].r=g2[i].num=g2[i].ys=0;
	}
	cin>>n;
	for(long long i=1;i<=n;i++){
		cin>>rp;
		if(rp=='1') a[i]=1;
		else a[i]=0;
	}
	for(long long i=1;i<=n;i++){
		cin>>rp;
		if(rp=='1') b[i]=1;
		else b[i]=0;
	}
	for(long long i=1;i<=n;i++){
		cin>>rp;
		if(rp=='1') t1[i]=1;
		else t1[i]=0;
	}
	for(long long i=1;i<=n;i++){
		cin>>rp;
		if(rp=='1') t2[i]=1;
		else t2[i]=0;
	}
	for(long long i=1;i<=n;i++){
		if((t1[i-1]==0)&&(t1[i+1]==0)) t1[i]=0;
		if((t2[i-1]==0)&&(t2[i+1]==0)) t2[i]=0;
	}
	for(long long i=1;i<=(n+1);i++){//ji de kai da shu zu
		if(t1[i]==1){
			tmp1++;
			if(a[i]==1) na++;
		}
		else {
			if(tmp1!=0){
				g1[++cnt1].l=(i-tmp1);
				g1[cnt1].r=(i-1);
				g1[cnt1].num=na;
				g1[cnt1].ys=tmp1;
				tmp1=0;na=0;
			}
		}
		//
		if(t2[i]==1){
			tmp2++;
			if(b[i]==1) nb++;
		}
		else {
			if(tmp2!=0){
				g2[++cnt2].l=(i-tmp2);
				g2[cnt2].r=(i-1);
				g2[cnt2].num=nb;
				g2[cnt2].ys=tmp2;
				tmp2=0;nb=0;
			}
		}
	}
	for(long long i=1;i<=n;i++){
		if((t1[i]==0)&&(t2[i]==0)){
			if(a[i]==b[i]) ans++;
			continue;
		}
		if((t1[i]==1)&&(t2[i]==1)) continue;
		if((t1[i]==1)&&(t2[i]==0)){
			long long qp=findd1(i);
			if(b[i]==1){
				if(g1[qp].num>=1) ans++,g1[qp].num--;
				g1[qp].ys--;
				continue;
			}
			else {
				if((g1[qp].ys-g1[qp].num)>=1) ans++;
				else g1[qp].num--;
				g1[qp].ys--;
				continue;
			}
		}
		if((t1[i]==0)&&(t2[i]==1)){
			long long qp=findd2(i);
			if(a[i]==1){
				if(g2[qp].num>=1) ans++,g2[qp].num--;
				g2[qp].ys--;
				continue;
			}
			else {
				if((g2[qp].ys-g2[qp].num)>=1) ans++;
				else g2[qp].num--;
				g2[qp].ys--;
				continue;
			}
		}
	}
	bool endtime=1;
	long long pl1=1,pl2=1;
	while(endtime){
		if((pl1>=cnt1)&&(g1[pl1].ys==0)&&(pl2>=cnt2)&&(g2[pl2].ys==0)){
			endtime=0;
			continue;
		}
		if(g1[pl1].ys>=g2[pl2].ys){
			long long d0=min((g2[pl2].ys-g2[pl2].num),(g1[pl1].ys-g1[pl1].num));
			long long d1=min(g2[pl2].num,g1[pl1].num);
			ans+=d0+d1;
			g1[pl1].ys-=g2[pl2].ys;
			if(d0<(g2[pl2].ys-g2[pl2].num)) g1[pl1].num-=(g2[pl2].ys-d0);
			else g1[pl1].num-=d1;
			g2[pl2].num=0;g2[pl2].ys=0;
			pl2++;
			continue;
		}
		else {
			long long d0=min((g2[pl2].ys-g2[pl2].num),(g1[pl1].ys-g1[pl1].num));
			long long d1=min(g2[pl2].num,g1[pl1].num);
			ans+=d0+d1;
			g2[pl2].ys-=g1[pl1].ys;
			if(d0<(g1[pl1].ys-g1[pl1].num)) g2[pl2].num-=(g1[pl1].ys-d0);
			else g2[pl2].num-=d1;
			g1[pl1].num=0;g1[pl1].ys=0;
			pl1++;
			continue;
		}
	}
	cout<<ans<<endl;
	return 0;
} 
int main(){
	//freopen("edit.in","r",stdin);
	//freopen("edit.out","w",stdout);
	cin>>T;
	for(long long i=1;i<=T;i++) mian();
	return 0;
}

拿到代码后把数组开到2e6还是WA,不会了,

2024/12/11 16:34
加载中...