线段树球调
查看原帖
线段树球调
264463
添哥楼主2022/2/16 14:34
#include<iostream>
using namespace std;
long long tree[400005][7];
char a[100005];
void push_up(int i)
{
	tree[i][1]=tree[i*2][1]+tree[i*2+1][1];
	tree[i][2]=tree[i*2][2]+tree[i*2+1][2];
	tree[i][3]=tree[i*2][3]+tree[i*2+1][3];
	tree[i][4]=min(tree[i*2][1]+tree[i*2+1][4],tree[i*2][4]+tree[i*2+1][2]);
	tree[i][5]=min(tree[i*2][2]+tree[i*2+1][5],tree[i*2][5]+tree[i*2+1][3]);
	tree[i][6]=min(tree[i*2][6]+tree[i*2+1][3],min(tree[i*2][4]+tree[i*2+1][5],tree[i*2][1]+tree[i*2+1][6]));
}
void build(int l,int r,int i)
{
    if(l==r)
    {
        tree[i][(int)(a[l+1]-'a'+1)]=1;
    }
    else
    {
    	int mid=(l+r)/2;
    	build(l,mid,i*2);
    	build(mid+1,r,i*2+1);
    	push_up(i);
	}
}
void set(int l,int r,int k,int i,char s)
{
    if(k<l||r<k)
    {
        return;
    }
    else if(l!=r)
    {
	    int mid=(l+r)/2;
    	set(l,mid,k,i*2,s);
		set(mid+1,r,k,i*2+1,s);
		push_up(i);
	}
	else
	{
		tree[i][1]=0;
		tree[i][2]=0;
		tree[i][3]=0;
		tree[i][(int)(s-'a'+1)]=1;
	}
}
int main()
{
    int n,m;
    cin>>n>>m;
    cin>>a;
    build(1,n,1);
    while(m--)
	{
		int x;
		char ch;
		cin>>x>>ch;
		set(1,n,x,1,ch);
		cout<<tree[1][6]<<endl;
	} 
    return 0;
}

话说CF评测速度怎么这么慢啊

2022/2/16 14:34
加载中...