bzoj3781 小B的询问【莫队】

来源:互联网 发布:知乎 pocket 编辑:程序博客网 时间:2024/05/21 06:38

链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3781
题意:中文题。
分析:赤裸裸的莫队
代码:
#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<string>#include<vector>#include<queue>#include<cmath>#include<stack>#include<set>#include<map>#define INF 0x3f3f3f3f#define Mn 50005#define Mm 2000005#define mod 1000000007#define CLR(a,b) memset((a),(b),sizeof((a)))#define CPY(a,b) memcpy ((a), (b), sizeof((a)))#pragma comment(linker, "/STACK:102400000,102400000")#define ul u<<1#define ur (u<<1)|1using namespace std;typedef long long ll;int read() {    char c;    int ans=0,f=1;c=getchar();    while(c<'0'||c>'9') {if(c=='-')f=-1;c=getchar();}    while(c>='0'&&c<='9') {ans=ans*10+c-'0';c=getchar();}    return  ans*f;}struct node {    int l,r;    int id;}q[Mn];int block;bool cmp(node a,node b) {    if(a.l/block==b.l/block) return a.r<b.r;    return a.l<b.l;}int a[Mn];ll ans[Mn];int num[Mn];ll sum;void update(int x,int p) {    sum+=1+p*2*num[a[x]];    num[a[x]]+=p;}int main() {    int n=read(),m=read(),k=read();    CLR(ans,0);    CLR(num,0);    for(int i=1;i<=n;i++) {        a[i]=read();    }    block=(int)sqrt(n);    for(int i=1;i<=m;i++) {        q[i].id=i;        q[i].l=read();        q[i].r=read();    }    sort(q+1,q+1+m,cmp);    sum=0;    for(int l=1,r=0,i=1;i<=m;i++) {        for(;r<q[i].r;r++) update(r+1,1);        for(;r>q[i].r;r--) update(r,-1);        for(;l>q[i].l;l--) update(l-1,1);        for(;l<q[i].l;l++) update(l,-1);        ans[q[i].id]=sum;    }    for(int i=1;i<=m;i++) {        printf("%d\n",ans[i]);    }    return 0;}


0 0