提出 #38065847
ソースコード 拡げる
#include<bits/stdc++.h>
#define N 100009
using namespace std;
typedef long long ll;
inline ll rd(){
ll x=0;char c=getchar();bool f=0;
while(!isdigit(c)){if(c=='-')f=1;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
return f?-x:x;
}
struct nd{
int l[2],r[2],num,tag;
};
nd tr[N<<2];
char s[N];
int n,q;
int cnt[50];
nd merge(nd x,nd y){
nd z;
z.num=x.num+y.num;
z.tag=x.tag||y.tag;
if(x.r[0]>y.l[0])z.tag=1;
if(x.l[1]==x.num&&y.r[1]==y.num){
if(x.l[0]==y.r[0]){
z.l[0]=z.r[0]=x.l[0];
z.l[1]=z.r[1]=z.num;
}
else{
for(int i=0;i<2;++i){
z.l[i]=x.l[i];
z.r[i]=y.r[i];
}
}
return z;
}
for(int i=0;i<2;++i){
z.l[i]=x.l[i];
z.r[i]=y.r[i];
}
if(x.l[1]==x.num){
if(x.l[0]==y.l[0])z.l[1]+=y.l[1];
}
if(y.r[1]==y.num){
if(y.r[0]==x.r[0])z.r[1]+=x.r[1];
}
return z;
}
void build(int cnt,int l,int r){
if(l==r){
tr[cnt].l[0]=tr[cnt].r[0]=s[l]-'a';
tr[cnt].l[1]=tr[cnt].r[1]=1;
tr[cnt].num=1;
return;
}
int mid=(l+r)>>1;
build(cnt<<1,l,mid);
build(cnt<<1|1,mid+1,r);
tr[cnt]=merge(tr[cnt<<1],tr[cnt<<1|1]);
}
void upd(int cnt,int l,int r,int x,int y){
if(l==r){
tr[cnt].l[0]=tr[cnt].r[0]=y;
return;
}
int mid=(l+r)>>1;
if(mid>=x)upd(cnt<<1,l,mid,x,y);
else upd(cnt<<1|1,mid+1,r,x,y);
tr[cnt]=merge(tr[cnt<<1],tr[cnt<<1|1]);
}
nd query(int cnt,int l,int r,int L,int R){
if(l>=L&&r<=R)return tr[cnt];
int mid=(l+r)>>1;
if(mid>=L&&mid<R)return merge(query(cnt<<1,l,mid,L,R),query(cnt<<1|1,mid+1,r,L,R));
if(mid>=L)return query(cnt<<1,l,mid,L,R);
return query(cnt<<1|1,mid+1,r,L,R);
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin>>n;
cin>>(s+1);
for(int i=1;i<=n;++i){
cnt[s[i]-'a']++;
}
build(1,1,n);
cin>>q;
char c;
int x,l,r,opt;
while(q--){
cin>>opt;
if(opt==1){
cin>>x>>c;
upd(1,1,n,x,c-'a');
cnt[s[x]-'a']--;
cnt[c-'a']++;
s[x]=c;
}
else{
cin>>l>>r;
nd x=query(1,1,n,l,r);
// cout<<x.l[0]<<" ?? "<<x.r[0]<<endl;
// cout<<x.l[1]<<" ?? "<<x.r[1]<<endl;
if(x.tag)cout<<"No\n";
else if(x.l[1]==r-l+1)cout<<"Yes\n";
else{
int num=r-l+1-x.l[1]-x.r[1];
for(int i=x.l[0]+1;i<x.r[0];++i)num-=cnt[i];
if(num!=0)cout<<"No\n";
else cout<<"Yes\n";
}
}
}
return 0;
}
提出情報
ジャッジ結果
| セット名 |
Sample |
All |
| 得点 / 配点 |
0 / 0 |
500 / 500 |
| 結果 |
|
|
| セット名 |
テストケース |
| Sample |
sample_01.txt |
| All |
hand.txt, min.txt, random_01.txt, random_02.txt, random_03.txt, random_04.txt, random_05.txt, random_06.txt, random_07.txt, random_08.txt, random_09.txt, random_10.txt, random_11.txt, random_12.txt, random_13.txt, random_14.txt, random_15.txt, random_16.txt, random_17.txt, random_18.txt, random_19.txt, random_20.txt, random_21.txt, sample_01.txt |
| ケース名 |
結果 |
実行時間 |
メモリ |
| hand.txt |
AC |
7 ms |
3488 KiB |
| min.txt |
AC |
2 ms |
3480 KiB |
| random_01.txt |
AC |
74 ms |
9820 KiB |
| random_02.txt |
AC |
69 ms |
9804 KiB |
| random_03.txt |
AC |
62 ms |
9768 KiB |
| random_04.txt |
AC |
61 ms |
9820 KiB |
| random_05.txt |
AC |
53 ms |
9712 KiB |
| random_06.txt |
AC |
51 ms |
9768 KiB |
| random_07.txt |
AC |
68 ms |
9820 KiB |
| random_08.txt |
AC |
70 ms |
9804 KiB |
| random_09.txt |
AC |
61 ms |
9800 KiB |
| random_10.txt |
AC |
59 ms |
9824 KiB |
| random_11.txt |
AC |
50 ms |
9692 KiB |
| random_12.txt |
AC |
49 ms |
9772 KiB |
| random_13.txt |
AC |
64 ms |
9768 KiB |
| random_14.txt |
AC |
64 ms |
9820 KiB |
| random_15.txt |
AC |
64 ms |
9744 KiB |
| random_16.txt |
AC |
66 ms |
9800 KiB |
| random_17.txt |
AC |
67 ms |
9748 KiB |
| random_18.txt |
AC |
69 ms |
9820 KiB |
| random_19.txt |
AC |
68 ms |
9716 KiB |
| random_20.txt |
AC |
64 ms |
9828 KiB |
| random_21.txt |
AC |
66 ms |
9812 KiB |
| sample_01.txt |
AC |
6 ms |
3560 KiB |