QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#586086 | #9263. Rebellious Sequences | ucup-team3474 | WA | 2ms | 5820kb | C++20 | 3.8kb | 2024-09-24 01:57:11 | 2024-09-24 01:57:12 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
const int N=1919810;
typedef long long ll;
typedef pair<ll,ll> PII;
ll n,m,k;
ll a[N],b[N];
char s[N];
int val[N];
vector<char> e[N];
int ss[N];
typedef struct{
int l,r;
int cnt0,cnt1;
int mn;
int tag;
}Node;
Node tr[N];
void pushup(int u){
tr[u].cnt0=tr[u<<1].cnt0+tr[u<<1|1].cnt0;
tr[u].cnt1=tr[u<<1].cnt1+tr[u<<1|1].cnt1;
tr[u].mn=min(tr[u<<1].mn,tr[u<<1|1].mn);
}
void pushdown(int u){
if(tr[u].tag){
tr[u<<1].mn+=tr[u].tag,tr[u<<1].tag+=tr[u].tag;
tr[u<<1|1].mn+=tr[u].tag,tr[u<<1|1].tag+=tr[u].tag;
tr[u].tag=0;
}
}
void build(int u,int l,int r){
tr[u].l=l,tr[u].r=r;
if(l==r){
if(s[l]=='(') tr[u].cnt0=1;
else tr[u].cnt1=1;
tr[u].mn=ss[l];
}else{
int mid=l+r>>1;
build(u<<1,l,mid);
build(u<<1|1,mid+1,r);
pushup(u);
}
}
void modify(int u,int l,int r,int type,int c){
// cout<<u<<endl;
if(l>r) return;
if(tr[u].l>=l&&tr[u].r<=r){
if(type==0){
tr[u].cnt0^=1;
tr[u].cnt1^=1;
}else{
tr[u].mn+=c;
tr[u].tag+=c;
}
}else{
int mid=tr[u].l+tr[u].r>>1;
pushdown(u);
if(l<=mid) modify(u<<1,l,r,type,c);
if(r>mid) modify(u<<1|1,l,r,type,c);
pushup(u);
}
}
Node merge(Node a,Node b){
a.cnt0+=b.cnt0;
a.cnt1+=b.cnt1;
a.mn=min(a.mn,b.mn);
// cout<<a.cnt0<<" "<<b.cnt0<<" "<<a.cnt1<<" "<<b.cnt1<<" "<<a.mn<<" "<<b.mn<<endl;
return a;
}
Node query(int u,int l,int r){
// cout<<"-"<<u<<" "<<l<<" "<<r<<endl;
if(tr[u].l>=l&&tr[u].r<=r){
// cout<<tr[u].cnt0<<endl;
return tr[u];
}else{
int mid=tr[u].l+tr[u].r>>1;
pushdown(u);
Node nd={0,0,0,0,1000000000,0};
if(l<=mid) nd=merge(nd,query(u<<1,l,r));
if(r>mid) nd=merge(nd,query(u<<1|1,l,r));
pushup(u);
// cout<<"--"<<nd.cnt0<<" "<<nd.cnt1<<" "<<nd.mn<<endl;
return nd;
}
}
bool check(){
int le,ri;
int l=1,r=n;
while(l<r){
int mid=l+r>>1;
if(query(1,1,mid).cnt1==0) l=mid+1;
else r=mid;
}
le=l+1;
l=le,r=n;
while(l<r){
int mid=l+r>>1;
if(query(1,le,mid).cnt0==0) l=mid+1;
else r=mid;
}
le=l;
l=1,r=n;
while(l<r){
int mid=l+r+1>>1;
if(query(1,mid,n).cnt0==0) r=mid-1;
else l=mid;
}
ri=l-1;
l=1,r=ri;
// cout<<ri<<endl;
while(l<r){
int mid=l+r+1>>1;
if(query(1,mid,ri).cnt1==0) r=mid-1;
else l=mid;
}
ri=l;
// cout<<le<<" "<<ri<<endl;
if(le+1<=ri-1&&query(1,le+1,ri-1).mn==0) return true;
else return false;
}
void __(){
cin>>n>>m;
scanf("%s",s+1);
for(int i=1;i<=n;i++){
if(s[i]=='(') ss[i]=1;
else ss[i]=-1;
ss[i]+=ss[i-1];
}
build(1,1,n);
// for(int i=1;i<=n;i++){
// cout<<query(1,i,i).cnt0<<" "<<query(1,i,i).cnt1<<" "<<query(1,i,i).mn<<endl;
// }
// cout<<114514<<endl;
while(m--){
int l,r;
scanf("%d%d",&l,&r);
if(s[l]!=s[r]){
modify(1,l,l,0,0);
modify(1,r,r,0,0);
if(s[l]=='(') modify(1,l,r-1,1,-2);
else modify(1,l,r-1,1,2);
}
swap(s[l],s[r]);
// for(int i=1;i<=n;i++){
// cout<<query(1,i,i).cnt0<<" "<<query(1,i,i).cnt1<<" "<<query(1,i,i).mn<<endl;
// }
// printf("%s\n",s+1);
if(!check()) puts("No");
else puts("Yes");
}
}
int main(){
int _=1;
// cin>>_;
while(_--){
__();
}
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 2ms
memory: 5820kb
input:
8 4 (()()()) 3 4 5 6 2 7 6 7
output:
No No Yes No
result:
ok 4 token(s): yes count is 1, no count is 3
Test #2:
score: 0
Accepted
time: 2ms
memory: 5656kb
input:
6 6 ((())) 2 4 2 4 2 5 4 5 4 5 2 3
output:
No No No No No No
result:
ok 6 token(s): yes count is 0, no count is 6
Test #3:
score: -100
Wrong Answer
time: 2ms
memory: 5724kb
input:
10 10 ((())(())) 7 9 2 4 5 6 8 9 2 8 5 9 2 5 2 3 3 9 3 8
output:
No No No No No No No No No No
result:
wrong answer expected YES, found NO [2nd token]