线段树TLE求助
查看原帖
线段树TLE求助
556362
Unnamed114514楼主2023/6/24 09:44
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
#define ls k<<1
#define rs k<<1|1
using namespace std;
const int maxn=2e5+5;
int T,len,tag[maxn<<2],t[maxn<<2];
string s;
vector<int> v;
inline void down(int k,int l,int r){
	if(tag[k]){
		int mid=l+r>>1;
		tag[ls]=tag[rs]=tag[k];
		t[ls]+=tag[k]*(mid-l+1);
		t[rs]+=tag[k]*(r-mid);
		tag[k]=0;
	}
}
void change(int k,int l,int r,int x,int y,int v){
	if(x<=l&&r<=y){
		t[k]+=v*(r-l+1);
		tag[k]=v;
		return;
	}
	down(k,l,r);
	int mid=l+r>>1;
	if(x<=mid)
		change(ls,l,mid,x,y,v);
	if(mid<y)
		change(rs,mid+1,r,x,y,v);
	t[k]=min(t[ls],t[rs]);
}
int query(int k,int l,int r,int x,int y){
	if(x<=l&&r<=y)
		return t[k]-inf;
	down(k,l,r);
	int mid=l+r>>1,res=inf;
	if(x<=mid)
		res=min(res,query(ls,l,mid,x,y));
	if(mid<y)
		res=min(res,query(rs,mid+1,r,x,y));
	return res;
}
void solve(){
	memset(t,inf,sizeof(t));
	memset(tag,0,sizeof(tag));
	int cnt=0,qwq=0,siz=0;
	v.clear();
	for(int i=0;i<len;++i){
		if(s[i]=='(')
			++cnt;
		else if(s[i]=='?'){
			v.push_back(i);
			++siz;
		} else{
			--cnt;
			if(cnt<0){
				if(qwq==siz){
					puts("NO");
					return;
				}
				if(!query(1,1,len,1,v[qwq]+1)){
					puts("NO");
					return;
				} else{
					change(1,1,len,1,v[qwq]+1,1);
					++qwq;
					++cnt;
				}
			}
		}
		change(1,1,len,i+1,i+1,cnt);
	}
	if((siz-qwq-cnt)&1){
		puts("NO");
		return;
	}
	int a=0,b=0;
	int y=(siz-qwq-cnt)>>1;
	for(int i=0;i<y;++i){
		if(query(1,1,len,1,v[i]+1)){
			puts("NO");
			return;
		}
		change(1,1,len,1,v[i]+1,-1);
	}
	puts("YES");
}
int main(){
	cin>>T;
	while(T--){
		cin>>s;
		len=s.size();
		solve();
	}
	return 0;
}
2023/6/24 09:44
加载中...