传送门

分块经典题目。


先将数列分块。

然后预处理出每两个块之间有多少个数出现了正偶数次。

这样查询的时候对于中间的完整块直接用预处理出的数组搞定。

剩下的暴力枚举求解。

代码:

#include<bits/stdc++.h>
#define N 100005
using namespace std;
inline int read(){
    int ans=0;
    char ch=getchar();
    while(!isdigit(ch))ch=getchar();
    while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
    return ans;
}
int n,c,m,a[N],lastans,blo[N],cnt[N],cal[255][N],sum[255][255],sig=500,blos;
inline int query(int ql,int qr){
    int l=blo[ql],r=blo[qr],ret=0;
    if(r-l<2){
        for(int i=ql;i<=qr;++i){
            ++cnt[a[i]];
            if(!(cnt[a[i]]&1))++ret;
            else if(cnt[a[i]]>2)--ret;
        }
        for(int i=ql;i<=qr;++i)--cnt[a[i]];
        return ret;
    }
    ret+=sum[l+1][r-1];
    for(int i=ql;i<=l*sig;++i){
        ++cnt[a[i]];
        int tmp=cnt[a[i]]+cal[r-1][a[i]]-cal[l][a[i]];
        if(!(tmp&1))++ret;
        else if(tmp>2)--ret;
    }
    for(int i=(r-1)*sig+1;i<=qr;++i){
        ++cnt[a[i]];
        int tmp=cnt[a[i]]+cal[r-1][a[i]]-cal[l][a[i]];
        if(!(tmp&1))++ret;
        else if(tmp>2)--ret;
    }
    for(int i=ql;i<=l*sig;++i)--cnt[a[i]];
    for(int i=(r-1)*sig+1;i<=qr;++i)--cnt[a[i]];
    return ret;
}
int main(){
    n=read(),c=read(),m=read();
    for(int i=1;i<=n;++i)++cal[(blo[i]=(i-1)/sig+1)][(a[i]=read())];
    blos=blo[n];
    for(int i=1;i<=c;++i)for(int j=1;j<=blos;++j)cal[j][i]+=cal[j-1][i];
    for(int i=1;i<=blos;++i){
        int tmp=0;
        for(int j=(i-1)*sig+1;j<=n;++j){
            ++cnt[a[j]];
            if(!(cnt[a[j]]&1))++tmp;
            else if(cnt[a[j]]>2)--tmp;
            sum[i][blo[j]]=tmp;
        }
        for(int j=(i-1)*sig+1;j<=n;++j)--cnt[a[j]];
    }
    while(m--){
        int l=(read()+lastans)%n+1,r=(read()+lastans)%n+1;
        if(l>r)swap(l,r);
        printf("%d\n",lastans=query(l,r));
    }
    return 0;
}

2018.09.30 bzoj2821: 作诗(Poetize)(分块)的更多相关文章

  1. BZOJ2821 作诗(Poetize) 分块

    题意 算法 经验总结 代码 题意 不带修改,查询数列[1,n]中[l,r]内的出现正偶数次的数的个数, 数列中的数 <= 1e5, n <= 1e5, 强制在线 算法 ​ 查询的内容: 区 ...

  2. BZOJ2821 作诗(Poetize) 【分块】

    BZOJ2821 作诗(Poetize) Description 神犇SJY虐完HEOI之后给傻×LYD出了一题: SHY是T国的公主,平时的一大爱好是作诗. 由于时间紧迫,SHY作完诗之后还要虐OI ...

  3. 【分块】BZOJ2821 作诗(Poetize)

    2821: 作诗(Poetize) Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 3265  Solved: 951[Submit][Status][ ...

  4. BZOJ 2821: 作诗(Poetize)( 分块 )

    分块,分成N^0.5块.O(N^1.5)预处理出sm[i][j]表示前i块中j的出现次数, ans[i][j]表示第i~j块的答案. 然后就可以O(N^0.5)回答询问了.总复杂度O((N+Q)N^0 ...

  5. 【BZOJ2821】作诗(Poetize) 分块

    Description 神犇SJY虐完HEOI之后给傻×LYD出了一题:SHY是T国的公主,平时的一大爱好是作诗.由于时间紧迫,SHY作完诗之后还要虐OI,于是SHY找来一篇长度为N的文章,阅读M次, ...

  6. BZOJ2821 作诗(Poetize) 主席树 bitset

    原文链接https://www.lydsy.com/JudgeOnline/problem.php?id=2821 题目传送门 - BZOJ2821 题意 $n$ 个数,$m$ 组询问,每次问 $[l ...

  7. bzoj2821: 作诗(Poetize)

    分块 分sqrt(n)块 F[i][j]表示块i到块j的答案 s[i][j]表示数字i在前j块内出现了几次 #include <iostream> #include <cstdio& ...

  8. BZOJ2821 作诗(分块)

    和区间众数几乎一模一样的套路. // luogu-judger-enable-o2 #include<iostream> #include<cstdio> #include&l ...

  9. BZOJ 2821作诗(Poetize) 分块

    Description 有一个长度为n的序列,序列每个元素的范围[1,c],有m个询问x y,表示区间[x,y]中出现正偶数次的数的种类数. Solution 大力分块解决问题. 把序列分块,f[i] ...

随机推荐

  1. mysql的时区错误的解决办法

    十二月 02, 2018 9:16:19 下午 com.mchange.v2.resourcepool.BasicResourcePool 警告: Having failed to acquire a ...

  2. IIS 更新EXE文件

    IIS 更新EXE文件 MIME,add,文件扩展名带不带.都可以,会自动加上.的 文件扩展名:.exe MIME类型:application/octet-stream .ini文件

  3. 取得grid单元格里刚输入的文本,未保存的文本

    取得grid单元格里刚输入的文本内容,未保存的文本,正在输入的值,正在编辑的值,编辑框 dbgrid->DataSource->DataSet->UpdateRecord(); pr ...

  4. 怎样在Windows本地搭建redis服务器

    1.下载最新redis       https://github.com/MicrosoftArchive/redis/releases 2.解压如果是mis 版本直接下一步下一步即可 3.接下来我们 ...

  5. 机器学习入门-线性判别分析(LDA)1.LabelEncoder(进行标签的数字映射) 2.LinearDiscriminantAnalysis (sklearn的LDA模块)

    1.from sklearn.processing import LabelEncoder 进行标签的代码编译 首先需要通过model.fit 进行预编译,然后使用transform进行实际编译 2. ...

  6. 16 python xml模块

    1.基本概念 xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单. 不过,古时候,在json还没诞生的黑暗年代,大家只能选择用xml呀. 至今很多传统公司如金 ...

  7. 15 python re 模块

    1.基础知识 正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎 正则表达式的大致匹配流程:依次拿出表达式和文本中的字符比较, 如果每一个字符都能匹配,则匹配成功:一旦有匹 ...

  8. iOS 真机调试 Xcode 显示 device Error: device unavailable

    一般来说有两个原因: 1. iphone没有加到test device里,将iphone的设备id加到test device列表里 2. Xcode不支持当前的iOS版本,将Xcode升级到最新版

  9. ios 给图片加文字

    - (UIImage*) drawText:(NSString*)text inImage:(UIImage*)image { //prepare image context UIGraphicsBe ...

  10. 【转】Luajit-2.1.0-beta1的发布和生成arm64用bytecode的解脱

    来自:Luajit-2.1.0-beta1的发布和生成arm64用bytecode的解脱 前情提要:由于苹果要求2015年2月1日上架的新app必须支持64位的arm64,旧的app也得在6月1日支持 ...