WA 求调
  • 板块CF240F TorCoder
  • 楼主www2003
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/4/21 15:46
  • 上次更新2023/10/28 03:12:11
查看原帖
WA 求调
87651
www2003楼主2022/4/21 15:46
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int tree[30][808080];
int n,m;
string s; 
int tag[30][808080];

void add1(int k,int l,int r,int t)
{
	tree[t][k] = 0;
	tag[t][k] = -1;
}

void add2(int k,int l,int r,int t)
{
	tree[t][k] = r - l + 1;
	tag[t][k] = 1;
}

void pushdown(int k,int l,int r,int t)
{
	if(!tag[t][k])return;
	int mid = l + r >> 1;
	if(tag[t][k] == -1)
	{
		add1(k << 1,l,mid,t);
		add1(k << 1|1,mid + 1,r,t);
	}
	else
	{
		add2(k << 1,l,mid,t);
		add2(k << 1|1,mid + 1,r,t);
	}
	tag[t][k] = 0;
}

void add(int k,int l,int r,int u,int v,int t)
{
	if(u <= l &&  r <= v)
	{
		tree[t][k] = r - l + 1;
		tag[t][k] = 1;
		return; 
	}
	pushdown(k,l,r,t);
	int mid = l + r >> 1;
	if(u <= mid)add(k << 1,l,mid,u,v,t);
	if(v > mid)add(k << 1|1,mid + 1,r,u,v,t);
	tree[t][k] = tree[t][k << 1] + tree[t][k << 1|1];
}

void rem(int k,int l,int r,int u,int v,int t)
{
	if(u <= l && r <= v)
	{
		tree[t][k] = 0;
		tag[t][k] = -1;
		return;
	}
	pushdown(k,l,r,t);
	int mid = l + r >> 1;
	if(u <= mid)rem(k << 1,l,mid,u,v,t);
	if(v > mid)rem(k << 1|1,mid + 1,r,u,v,t);
	tree[t][k] = tree[t][k << 1] + tree[t][k << 1|1];
}


int ans;

void query(int k,int l,int r,int u,int v,int t)
{
	if(u <= l && r <= v)
	{
		ans += tree[t][k];
		return; 
	}
	pushdown(k,l,r,t);
	int mid = l + r >> 1;
	if(u <= mid)query(k << 1,l,mid,u,v,t);
	if(v > mid)query(k << 1|1,mid + 1,r,u,v,t);
}


void pr()
{
	for(int i = 1; i <= n; i++)
	{
		for(int j = 0; j < 26; j++)
		{
			ans = 0;
			query(1,1,n,i,i,j);
			if(ans)
			{
				cout << char(j + 'a');
				break;
			}
		}
	}
	cout << endl;
}
int main()
{
	//freopen("input.txt","r",stdin);
	//freopen("output.txt","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin >> n >> m;
	cin >> s;
	for(int i = 0; i < n; i++)
	{
		add(1,1,n,i + 1,i + 1,s[i] - 'a');	
	} 
	for(int I = 1; I <= m; I++)
	{
		//pr();
		int l,r; cin >> l >> r;
		int od = -1, sum[30], fl = 1;
		memset(sum,0,sizeof(sum));
		for(int i = 0; i < 26; i++)
		{
			ans = 0;
			query(1,1,n,l,r,i);
			sum[i] = ans;
			if(ans && ans % 2 == 1)
			{
				if(od == -1)od = i;
				else 
				{
					fl = 0;
					break;
				}
			}
		}
		if(!fl)continue;
		for(int i = 0; i < 26; i++)
		{
			rem(1,1,n,l,r,i);
		}
		//0pr();
		int beg = l,en = r;
		for(int i = 0; i < 26; i++)
		{
			if(sum[i] && sum[i] % 2 == 0)
			{
				add(1,1,n,beg,beg + sum[i] / 2 - 1,i);
				add(1,1,n,en - sum[i] / 2 + 1,en,i);
				beg = beg + sum[i] / 2;
				en = en - sum[i] / 2;
				//cout << beg << ' ' << en << endl;
			}
		}
		if(od != -1)add(1,1,n,beg,en,od);
	}
	pr();

    return 0;
}

2022/4/21 15:46
加载中...