社区讨论

刚学带修莫队求调

P1903【模板】带修莫队 / [国家集训队] 数颜色 / 维护队列参与者 1已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@mhj0wc7u
此快照首次捕获于
2025/11/03 18:54
4 个月前
此快照最后确认于
2025/11/03 18:54
4 个月前
查看原帖
RT.
CPP
#include <bits/stdc++.h>
using namespace std;
int n,m,B;
int tme,tot;
int a[133340];
int b[133340];
int c[1000005];
struct node
{
	int l,r,id,t,ans;
	bool operator<(const node &a)const
	{
		if((l+B-1)/B != (a.l+B-1)/B)
		{
			return (l+B-1)/B < (a.l+B-1)/B;
		}
		if((r+B-1)/B != (a.r+B-1)/B)
		{
			return (r+B-1)/B < (a.r+B-1)/B;
		}
		return t<a.t;
	}
};
bool cmp(node x,node y)
{
	return x.id < y.id;
}
struct rode
{
	int p,cf,cs;
};
node qr[133340];
rode rp[133340];
int l = 1,r = 0,t = 0,ans;
void addr()
{
	r++;
	c[a[r]]++;
	if(c[a[r]] == 1)ans++;
	return;
}
void delr()
{
	c[a[r]]--;
	if(c[a[r]] == 0)ans--;
	r--;
	return;
}
void addl()
{
	l--;
	c[a[l]]++;
	if(c[a[l]] == 1)ans++;
	return;
}
void dell()
{
	c[a[l]]--;
	if(c[a[l]] == 0)ans--;
	l++;
	return;
}
void addt()
{
	t++;
	int p = rp[t].p;
	int cf = rp[t].cf;
	int cs = rp[t].cs;
	if(l <= p <= r)
	{
		c[cf]--;
		if(c[cf] == 0)ans--;
		c[cs]++;
		if(c[cs] == 1)ans++;
	}
	a[p] = cs;
	return;
}
void delt()
{
	int p = rp[t].p;
	int cf = rp[t].cf;
	int cs = rp[t].cs;
	if(l <= p <= r)
	{
		c[cs]--;
		if(c[cs] == 0)ans--;
		c[cf]++;
		if(c[cf] == 1)ans++;
	}
	a[p] = cf;
	t--;
	return;
}
int main()
{
	cin >> n >> m;
	for(int i = 1;i <= n;i++)
	{
		cin >> a[i];
		b[i] = a[i]; 
	}
	for(int i = 1;i <= m;i++)
	{
		char op;
		cin >> op;
		if(op == 'Q')
		{
			int l,r;
			cin >> l >> r;
			qr[++tot] = {l,r,tot,tme,0};
		}
		else if(op == 'R')
		{
			int p,c;
			cin >> p >> c;
			rp[++tme] = {p,b[p],c};
			b[p] = c;
		}
	}
	B = cbrt(1ll*n*n);
	sort(qr+1,qr+tot+1);
	for(int i = 1;i <= tot;i++)
	{
		while(r < qr[i].r)addr();
		while(r > qr[i].r)delr();
		while(l > qr[i].l)addl();
		while(l < qr[i].l)dell();
		while(t < qr[i].t)addt();
		while(t > qr[i].t)delt();
		qr[i].ans = ans;
	}
	sort(qr+1,qr+tot+1,cmp);
	for(int i = 1;i <= tot;i++)
	{
		cout << qr[i].ans << "\n";
	}
	return 0;
}
求答:为什么 pow(n,0.666) 不会 TLE,但是 pow(n,0.6666) 会 TLE 一个点?

回复

4 条回复,欢迎继续交流。

正在加载回复...