社区讨论
样例过但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 条回复,欢迎继续交流。
正在加载回复...