样例能过,0#求调
查看原帖
样例能过,0#求调
389348
TuYaBoYu楼主2024/7/30 17:37

快读没问题,快写没问题

#include <bits/stdc++.h>
#define gl(s) ((((s)-1)*B)+1)
#define gr(s) ((s)*B)
#define space putchar(' ')
#define enter putchar('\n')
using namespace std;
typedef long long ll;
const int maxn = 5e4+7;
ll ans[maxn],c;
int g[400],arr[maxn],col[maxn];
int n,B,tot,m,k;
template<typename T>void read(T& n)
{
    T f=1,k=0;char c=getchar();
    while(c>'9'||c<'0'){if(c=='-'){f=-1;}c=getchar();}
    while(c<='9'&&c>='0'){k=(k<<3)+(k<<1)+c-'0';c=getchar();}
    n=f*k;
}
  
template<typename T>void write(T x)
{
    if(x==0){putchar('0');return;}
    if(x<0)putchar('-'),x=-x;
    if(x>9)write(x/10);
    putchar(x%10+'0');
}

struct node {
	int l,r,id;
}q[maxn];

bool cmp(node a,node b) {
	return (g[a.l]==g[b.l])?((g[a.l]&1)?(a.r>b.r):(a.r<b.r)):(g[a.l]<g[b.l]);
}

void add(int x) {
	c+=(col[arr[x]]<<1);
	++c;
	++col[arr[x]];
}

void del(int x) {
	c-=(col[arr[x]]<<1);
	++c;
	--col[arr[x]];
}

signed main() {
	read(n),read(m),read(k);
	B=ceil(double(sqrt(n*1.0)));
	tot=n/B;
	if(tot*B<n)++tot;
	for(int i=1;i<=n;++i) {
		g[i]=(i-1)/B+1;
		read(arr[i]);
	}
	for(int i=1;i<=m;++i) {
		read(q[i].l);
		read(q[i].r);
		q[i].id=i;
	}
	sort(q+1,q+m+1,cmp);
	int l=1,r=0;
	for(int i=1;i<=m;++i) {
		while(l>q[i].l) --l,add(l);
		while(r<q[i].r) ++r,add(r);
		while(l<q[i].l)del(l),++l;
		while(r>q[i].r)del(r),--r;
		ans[q[i].id]=c;
	}
	for(int i=1;i<=m;++i)
		write(ans[i]),enter;
    return 0;
}
2024/7/30 17:37
加载中...