社区讨论

样例过但TLE0pts求调

P5268[SNOI2017] 一个简单的询问参与者 3已保存回复 2

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@mknqhmdc
此快照首次捕获于
2026/01/21 16:01
4 周前
此快照最后确认于
2026/01/21 16:21
4 周前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int QWQ = 5e4 + 5;
int n, Q, a[QWQ], now, ans[QWQ], b[QWQ], block;
int cntl[QWQ], cntr[QWQ], sum, l, r;
struct query
{
	int l, r, flag, id;
}q[QWQ * 12];
bool cmp(query x, query y)
{
	if(b[x.l] == b[y.l])
	{
		return x.r < y.r;
	}
	return x.l < y.l;
}
void addQuery(int l, int r, int id, int flag)
{
	if(l > r) swap(l, r);
	now ++;
	q[now].l = l;
	q[now].r = r;
	q[now].id = id;
	q[now].flag = flag;
}
int addl(int l)
{
	cntl[a[l]] ++;
	sum += cntr[a[l]];
}
int addr(int r)
{
	cntr[a[r]] ++;
	sum += cntl[a[r]];
}
int dell(int l)
{
	cntl[a[l]] --;
	sum -= cntr[a[l]];
}
int delr(int r)
{
	cntr[a[r]] --;
	sum -= cntl[a[r]];
}
signed main()
{
	cin >> n;
	block = sqrt(n);
	for(int i = 1; i <= n; i ++)
	{
		cin >> a[i];
		b[i] = i / block + 1;
	}
	cin >> Q;
	for(int i = 1; i <= Q; i ++)
	{
		int l1, r1, l2, r2;
		cin >> l1 >> r1 >> l2 >> r2;
		addQuery(r1, r2, i, 1);
		addQuery(r1, l2 - 1, i, -1);
		addQuery(l1 - 1, r2, i, -1);
		addQuery(l1 - 1, l2 - 1, i, 1);
	}
	sort(q + 1, q + now + 1, cmp);
	for(int i = 1; i <= now; i ++)
	{
		int L = q[i].l, R = q[i].r;
		while(l < L) addl(++ l);
		while(l > L) dell(l --);
		while(r < R) addr(++ r);
		while(r > R) delr(r --);
		ans[q[i].id] += q[i].flag * sum;
	}
	for(int i = 1; i <= Q; i ++)
	{
		cout << ans[i] << endl;
	}
}

回复

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

正在加载回复...