带修莫队RE不知道哪里越界求助
查看原帖
带修莫队RE不知道哪里越界求助
551088
FincheuwYggdrasil楼主2023/1/17 21:03

RT,CF940F,求帮忙修一下

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e5+10;
int l[MAXN],r[MAXN],cnt[MAXN];
int n,m,num,t,a[MAXN],pos[MAXN]; 
int cnt1 = 0,idx = 0;
int ans[MAXN]; 
struct inputq{
	int le,ri,idx,ans,cht;
}inq[MAXN];
struct inputu{
	int p,col;
}inu[MAXN];
bool Cmp(inputq &a,inputq &b)//
{
	if(pos[a.le] != pos[b.le])
	{
		return pos[a.le] < pos[b.le];
	}
	else//pos[l]->pos[r]->r->cht;
	{
		if(a.ri != b.ri)
		{
			return a.ri < b.ri;
		}
		else
		{
			return a.cht < b.cht;
		}
	}
}
bool AnsCmp(inputq &a,inputq &b)
{
	return a.idx < b.idx;
}
void L2R_R2L(int i,int j)
{
	cnt[a[i]]--;
	if(cnt[a[i]] == 0)
		inq[j].ans--;
}
void R2R_L2L(int i,int j)
{
	cnt[a[i]]++;
	if(cnt[a[i]] == 1)
		inq[j].ans++;
}
void del(int i,int j)
{
	cnt[i]--;
	if(cnt[i] == 0)
		inq[j].ans--;
}
void add(int i,int j)
{
	cnt[i]++;
	if(cnt[i] == 1)
		inq[j].ans++;
}
void upd(int cht,int L,int R,int j)
{	
	if(L <= inu[cht].p && inu[cht].p <= R)
	{
		del(a[inu[cht].p],j);
		add(inu[cht].col,j);
	}
	swap(a[inu[cht].p],inu[cht].col);
}
void Query()
{
	int L = 1,R = 0,cht = 0;
	for(int i = 1;i <= idx;i++)
	{
		while(L < inq[i].le)
		{
			L2R_R2L(L,i);
			L++;
		}
		while(R < inq[i].ri)
		{
			R++;
			R2R_L2L(R,i);
		}
		while(L > inq[i].le)
		{
			L--;
			R2R_L2L(L,i);
		}
		while(R > inq[i].ri)
		{
			L2R_R2L(R,i);
			R--;
		}
		while(cht < inq[i].cht)
		{
			cht++;
			upd(cht,L,R,i);
		}
		while(cht > inq[i].cht)
		{
			upd(cht,L,R,i);
			cht--;
		}
		vector<int> b;
//		cout << "{";
		int i1;
		for(i1 = L;i1 <= R;i1++)
		{
			b.push_back(cnt[a[i1]]);
//			cout << a[i1] << " ";
		}
//		cout << endl;
//		cout << "}";
//		for(i1 = L;i1 <= R;i1++)
//		{
//			cout << cnt[a[i1]] << " ";
//		}
//		cout << endl;
		sort(b.begin(),b.end());
		vector<int>::iterator pos = unique(b.begin(),b.end());
		b.erase(pos,b.end());
//		cout << "{";
//		for(i1 = 0;i1 < b.size();i1++)
//			 cout << b[i1] << " ";
//		cout << endl;
		for(i1 = 1;b[i1-1] == b[i1] - 1;i1++);	
		printf("%d\n",i1+1);
		inq[i + 1].ans = inq[i].ans; 
	}
	sort(inq+1,inq+idx+1,AnsCmp);
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i = 1;i <= n;i++)
	{
		scanf("%d",&a[i]);
	}
	
	t = pow(n,2.0/3);
	num = n / t;
	if(n % t)
		num++;
	
	for(int i = 1;i <= num;i++)
	{
		l[i] = (i - 1) * t + 1;
		r[i] = i * t;
	}
	r[num] = n;
	
	for(int i = 1;i <= num;i++)
	{
		for(int j = l[i];j <= r[i];j++)
		{
			pos[j] = i;
		}
	} 
	
	int x,y;
	for(int i = 1;i <= m;i++)
	{
		int opt;
		cin >> opt;
		scanf("%d%d",&x,&y);
		if(opt == 1)
		{
			idx++;
			inq[idx].le = x;
			inq[idx].ri = y;	
			inq[idx].idx = idx;
			inq[idx].cht = cnt1;
			inq[idx].ans = 0;
		}
		else if(opt == 2)
		{
			cnt1++;
			inu[cnt1].p = x;
			inu[cnt1].col = y;
		}
	}
	sort(inq+1,inq+idx,Cmp);
	Query();
 	return 0;
}

2023/1/17 21:03
加载中...