zoukankan      html  css  js  c++  java
  • 洛谷P4867 Gty的二逼妹子序列(莫队+树状数组)

    传送门

    本来打算用主席树

    然后发现没办法维护颜色数

    于是用了莫队加树状数组

    然后竟然A了……

     1 //minamoto
     2 #include<iostream>
     3 #include<cstdio>
     4 #include<cmath>
     5 #include<algorithm>
     6 using namespace std;
     7 #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
     8 char buf[1<<21],*p1=buf,*p2=buf;
     9 inline int read(){
    10     #define num ch-'0'
    11     char ch;bool flag=0;int res;
    12     while(!isdigit(ch=getc()))
    13     (ch=='-')&&(flag=true);
    14     for(res=num;isdigit(ch=getc());res=res*10+num);
    15     (flag)&&(res=-res);
    16     #undef num
    17     return res;
    18 }
    19 char sr[1<<21],z[20];int C=-1,Z;
    20 inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}
    21 inline void print(int x){
    22     if(C>1<<20)Ot();if(x<0)sr[++C]=45,x=-x;
    23     while(z[++Z]=x%10+48,x/=10);
    24     while(sr[++C]=z[Z],--Z);sr[++C]='
    ';
    25 }
    26 const int N=1e5+5,M=1e6+5;
    27 int cnt[N],a[N],ans[M],c[N],rt[N],n,m,res,l,r,s;
    28 struct node{
    29     int l,r,ql,qr,id;
    30     node(){}
    31     node(int l,int r,int ql,int qr,int id):l(l),r(r),ql(ql),qr(qr),id(id){}
    32     inline bool operator <(const node &b)const
    33     {return rt[l]==rt[b.l]?rt[l]&1?r<b.r:r>b.r:l<b.l;}
    34 }q[M];
    35 inline void change(int x,int y){
    36     for(;x<=n;x+=x&-x) c[x]+=y;
    37 }
    38 inline int query(int x){
    39     int res=0;
    40     for(;x;x-=x&-x) res+=c[x];
    41     return res;
    42 }
    43 inline void add(int x){
    44     if(++cnt[x]==1) change(x,1);
    45 }
    46 inline void del(int x){
    47     if(--cnt[x]==0) change(x,-1);
    48 }
    49 int main(){
    50 //    freopen("testdata.in","r",stdin);
    51     n=read(),m=read(),s=sqrt(n);
    52     for(int i=1;i<=n;++i) a[i]=read(),rt[i]=(i-1)/s+1;
    53     for(int i=1,l,r,ql,qr;i<=m;++i)
    54     l=read(),r=read(),ql=read(),qr=read(),q[i]=node(l,r,ql,qr,i);
    55     sort(q+1,q+1+m);
    56     l=1,r=0,res=0;
    57     for(int i=1;i<=m;++i){
    58         while(l>q[i].l) add(a[--l]);
    59         while(r<q[i].r) add(a[++r]);
    60         while(l<q[i].l) del(a[l++]);
    61         while(r>q[i].r) del(a[r--]);
    62         ans[q[i].id]=query(q[i].qr)-query(q[i].ql-1);
    63     }
    64     for(int i=1;i<=m;++i) print(ans[i]);
    65     Ot();
    66     return 0;
    67 }
  • 相关阅读:
    Python基础之内存管理与垃圾回收机制
    Git常用命令
    Git分支操作
    码云配置SSH公钥
    Git基本操作
    Git基本理论
    版本控制
    Python基础之Python语法
    成为一名JAVA高级工程师你需要学什么【转】
    一个java高级工程师的进阶之路【转】
  • 原文地址:https://www.cnblogs.com/bztMinamoto/p/9756178.html
Copyright © 2011-2022 走看看