求助,五颜六色,令人自闭
查看原帖
求助,五颜六色,令人自闭
151601
Aphros楼主2020/6/20 13:23

rt

有 WA 的,有 RE 的,有 TLE 的

代码基本没有卡常 TLE 可以理解,但是 WA 就比较诡异。。。查了半天查不出来QAQ

写的是一个很普通的带修莫队,变量名应该不需要解释吧QAQ:

#pragma GCC optimize(3)  
#pragma GCC target("avx")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("-fdelete-null-pointer-checks")
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>

using namespace std;

const int MAXN = 200010;

int n, m, a[MAXN], pos[MAXN];

struct qry{
	int l, r, num, ind;
	bool operator<(const qry &o)const{return pos[l]<pos[o.l]?l<o.l:pos[l]&1?r<o.r:r>o.r;}
}b[MAXN];
struct chg{
	int ind, val;
}c[MAXN];
int cntq = 0, cntc = 0;

int l = 1, r = 0, t = 0, res = 0, ans[MAXN];
int cnt[1000010];
// l 为当前右端点,r 为当前左端点, t 为修改的时间戳

inline void add(int x) // 向当前区间加入一个数
{
	if(!cnt[x]) ++res;
	++cnt[x];
}
inline void del(int x) // 删除一个数
{
	--cnt[x];
	if(!cnt[x]) --res;
}
inline void modify(int i, int x) // 修改操作
{
	if(c[x].ind >= b[i].l && c[x].ind <= b[i].r)
	{
		del(a[c[x].ind]);
		add(c[x].val);
	}
	swap(a[c[x].ind], c[x].val);
}

int main()
{
	cin.tie(0);
	scanf("%d%d",&n,&m);
	int len = pow(n, 0.66666); // 块长
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		pos[i] = (i-1)/len+1;
	}
	for(int i=1;i<=m;i++)
	{
		char opt; int x, y;
		cin>>opt>>x>>y;
		if(opt == 'Q') // 询问
		{
			b[++cntq].l = x;
			b[cntq].r = y;
			b[cntq].ind = cntq;
			b[cntq].num = cntc;
		}
		else // 修改
		{
			c[++cntc].ind = x;
			c[cntc].val = y;
		}
	}
	sort(b+1, b+cntq+1);
	for(int i=1;i<=cntq;i++) // 莫队基操
	{
		while(l > b[i].l) add(a[--l]);
		while(r < b[i].r) add(a[++r]);
		while(l < b[i].l) del(a[l++]);
		while(r > b[i].r) del(a[r--]);
		while(t < b[i].num) modify(i, ++t);
		while(t > b[i].num) modify(i, t--);
		ans[b[i].ind] = res;
	}
	for(int i=1;i<=cntq;i++)
		printf("%d\n",ans[i]);
	return 0;
}
2020/6/20 13:23
加载中...