提出 #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;
}

提出情報

提出日時
問題 F - Substring of Sorted String
ユーザ comld
言語 C++ (GCC 9.2.1)
得点 500
コード長 2369 Byte
結果 AC
実行時間 74 ms
メモリ 9828 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 500 / 500
結果
AC × 1
AC × 24
セット名 テストケース
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