zoukankan      html  css  js  c++  java
  • 【莫队】bzoj4866: [Ynoi2017]由乃的商场之旅

    莫队的一些套路

    Description

    由乃有一天去参加一个商场举办的游戏。商场派了一些球王排成一行。每个人面前有几堆球。说来也巧,由乃和你
    一样,觉得这游戏很无聊,于是决定换一个商场。另一个商场是Deus的,他看到由乃来了,于是想出了一个更有趣
    的游戏:写数据结构题这个题是这样的:
     
    我们的情人,不过是随便借个名字,用幻想吹出来的肥皂泡,把信拿去吧,你可以使假戏成真。我本来是无病呻吟
    ,漫无目的的吐露爱情---现在这些漂泊不定的鸟儿有地方栖息了,你可以从信里看出来。拿去吧---由于不是出自
    真心,话就说得格外动听,拿去吧,就这么办吧...由于世界会在7月20日完结,作为救世主,间宫卓司要在19日让
    所有人回归天空现在已经是19日傍晚,大家集合在C栋的天台上,一共n个人在他们面前,便是终之空,那终结的天
     
    回归天空是一件庄重的事情,所以卓司决定让大家分批次进行,给每个人给了一个小写字母'a'->'z'作为编号一个
    区间的人如果满足他们的编号重排之后可以成为一个回文串,则他们可以一起回归天空,即这个区间可以回归天空
    由于卓司是一个喜欢妄想的人,他妄想了m个区间,每次他想知道每个区间中有多少个子区间可以回归天空因为世
    界末日要来了,所以卓司的信徒很多
     
    由乃天天做数据结构已经快恶心死了,于是让您帮她做当然,您天天做数据结构题,肯定也觉得恶心死了,不过可
    爱即正义!所以这个题还是要做的~

    Input

    第一行两个数n,m
    之后一行一个长为n的字符串,代表每个人的编号
    之后m行每行两个数l,r代表每次卓司妄想的区间
    n,m<=60000

    Output

    m行,每行一个数表示答案

    Sample Input

    6 6
    zzqzzq
    1 6
    2 4
    3 4
    2 3
    4 5
    1 1

    Sample Output

    16
    4
    2
    2
    3
    1

    题目分析

    应该是一类常见套路:考虑每加入一个元素对于已知区间的贡献。

    那么这里把每个字母看成$2^i$,先预处理出每一个位置的异或前缀和,莫队查询时答案增上全为偶次的字符+枚举为奇数的字母的贡献即可。

    注意莫队中加入与删除操作的顺序,这个有些时候是会相互影响的。

    然后用unsigned short int卡空间,就好了。

     1 #include<bits/stdc++.h>
     2 #define S(p) cnt[tmp^(1<<p)]
     3 #define Add(val) tmp=c[val],nw+=cnt[tmp],nw+=S(0)+S(1)+S(2)+S(3)+S(4)+S(5)+S(6)+S(7)+S(8)+S(9)+S(10)+S(11)+S(12)+S(13)+S(14)+S(15)+S(16)+S(17)+S(18)+S(19)+S(20)+S(21)+S(22)+S(23)+S(24)+S(25),++cnt[tmp]
     4 #define Del(val) tmp=c[val],--cnt[tmp],nw-=cnt[tmp],nw-=S(0)+S(1)+S(2)+S(3)+S(4)+S(5)+S(6)+S(7)+S(8)+S(9)+S(10)+S(11)+S(12)+S(13)+S(14)+S(15)+S(16)+S(17)+S(18)+S(19)+S(20)+S(21)+S(22)+S(23)+S(24)+S(25)
     5 const int maxn = 70035;
     6 const int maxp = 67108900;
     7 
     8 int blk[maxn],size;
     9 struct QRs
    10 {
    11     int l,r,id;
    12     bool operator < (QRs a) const
    13     {
    14         return blk[l]==blk[a.l]?(blk[l]&1?r < a.r:r > a.r):blk[l] < blk[a.l];
    15     }
    16 }q[maxn];
    17 int n,m,c[maxn],ans[maxn],L,R,nw,tmp;
    18 unsigned short cnt[maxp];
    19 char s[maxn];
    20 
    21 int read()
    22 {
    23     char ch = getchar();
    24     int num = 0, fl = 1;
    25     for (; !isdigit(ch); ch=getchar())
    26         if (ch=='-') fl = -1;
    27     for (; isdigit(ch); ch=getchar())
    28         num = (num<<1)+(num<<3)+ch-48;
    29     return num*fl;
    30 }
    31 int main()
    32 {
    33     n = read(), m = read(), scanf("%s",s+1);
    34     size = std::min(2*(int)sqrt(n+0.5), n)+5;
    35     for (int i=1; i<=n; i++) blk[i] = i/size, c[i] = c[i-1]^(1<<(s[i]-'a'));
    36     for (int i=1; i<=m; i++) q[i].l = read()-1, q[i].r = read(), q[i].id = i;
    37     std::sort(q+1, q+m+1);
    38     L = 1, R = 0;
    39     for (int i=1; i<=m; i++)
    40     {
    41         while (L > q[i].l) --L, Add(L);
    42         while (R < q[i].r) ++R, Add(R);
    43         while (L < q[i].l) Del(L), ++L;
    44         while (R > q[i].r) Del(R), --R;
    45         ans[q[i].id] = nw;
    46     }
    47     for (int i=1; i<=m; i++) printf("%d
    ",ans[i]);
    48     return 0;
    49 }

    END

  • 相关阅读:
    java实现调用打印机代码
    java合并PDF文件
    关于如何把项目做得更好的一次思考
    web语义化之SEO和ARIA
    快速理解web语义化
    使用HTML5地理位置定位到城市的方法及注意事项
    Plupload上传插件简单整理
    两列布局——左侧宽度固定,右侧宽度自适应的两种方法
    Java并发编程之线程基础
    Spring Boot学习之YAML文件配置
  • 原文地址:https://www.cnblogs.com/antiquality/p/10011504.html
Copyright © 2011-2022 走看看