zoukankan      html  css  js  c++  java
  • RMQ(2)莫队

    http://codeforces.com/contest/617/problem/E

    莫队算法,O(n1.5),在数据量1e5的时候还可以使用

    主要为研究[l,r][l,r+1]的O(1)或O(logn)转移,如能实现,那么就可以AC了

    增加了a[r+1]后可以发现,需计算

    根据异或和的性质转换后

    所以,则在转移前后维护好SUM[L-1]到SUM[R]的哈希表,即可在O(1)得到转移后的结果

    代码:

     1 #include<stdio.h>
     2 #include<algorithm>
     3 #include<string.h>
     4 #include<map>
     5 #include<queue>
     6 #include<set>
     7 #include<cmath>
     8 #include<vector> 
     9 #define MAXN 1000005 
    10 using namespace std;
    11 typedef long long ll;
    12 int a[100005];
    13 struct Edg{
    14     int l,r;
    15     int num,pos;
    16     ll v;
    17 }e[100005];
    18 int b[1500005]={0},sum[1000005];
    19 bool cmp1(struct Edg x,struct Edg y)
    20 {    if(x.pos==y.pos) return x.r<y.r;
    21     return x.l<y.l;
    22 }
    23 bool cmp2(struct Edg x,struct Edg y)
    24 {
    25     return x.num<y.num;
    26 }
    27 int main()
    28 {    int n,m,k;
    29     
    30     scanf("%d%d%d",&n,&m,&k);
    31     for(int i=1;i<=n;i++)
    32     {
    33         scanf("%d",&a[i]);
    34     }
    35     sum[0]=0;
    36     
    37     for(int i=1;i<=n;i++)
    38     {
    39         sum[i]=sum[i-1]^a[i];
    40     }
    41     int x=sqrt(n);   //注意
    42     for(int i=1;i<=m;i++)
    43     {
    44         scanf("%d%d",&e[i].l,&e[i].r);
    45         e[i].num=i,e[i].pos=e[i].l/x;
    46     }
    47     
    48     sort(e+1,e+m+1,cmp1);
    49     int l=1,r=0;
    50     ll temp=0;
    51     memset(b,0,sizeof(b));
    52 
    53      for(int i=1;i<=m;i++)
    54     {
    55         while(r<e[i].r)
    56         {
    57             r++;
    58             temp+=b[sum[r]^k];
    59             b[sum[r]]++;
    60         }
    61         while(r>e[i].r)
    62         {
    63             b[sum[r]]--;
    64             temp-=b[sum[r]^k];
    65             r--;
    66         }
    67         while(l>e[i].l-1)
    68         {
    69             l--;
    70             temp+=b[sum[l]^k];
    71             b[sum[l]]++;
    72         }
    73         while(l<e[i].l-1)
    74         {
    75             b[sum[l]]--;
    76             temp-=b[sum[l]^k];
    77             l++;
    78         }
    79         e[i].v=temp;
    80     }
    81 
    82     sort(e+1,e+m+1,cmp2);
    83     for(int k=1;k<=m;k++)
    84     {
    85         printf("%lld
    ",e[k].v);
    86     }
    87     return 0;
    88 } 
  • 相关阅读:
    建站始末——(转载)
    阿里云——大神建个人网站分享(转载)
    从零开始建设个人网站
    前端资料——书籍
    【python】*与** 参数问题
    【python】python异常类型
    【python】unittest中常用的assert语句
    【性能测试】性能测试总结<四>
    【性能测试】性能测试总结<三>
    【性能测试】性能测试总结<二>
  • 原文地址:https://www.cnblogs.com/lnu161403214/p/8612577.html
Copyright © 2011-2022 走看看