当前位置: 首页 > news >正文

BZOJ 2821 作诗(Poetize)(分块)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2821

题意:给出长度为n的一个数列,每次在线询问区间[L,R]有多少数字出现了偶数次?

思路:分成sqrt(n)块,记录cnt[i][j]表示第i块到第j块的答案数。然后记录每个数字出现的位置。对于询问[L,R],先找到L和R所在的块l和r,若l和r是同一块则直接暴力即可。否则[l+1,r-1]之间的答案已经统计。对于剩下的两段零头,记录这两段零头内出现的数字以及他们的次数,然后查找这些数字在[l+1,r-1]出现的次数,联系在两段零头中出现的次数更新答案。

 


  
int pl[420],pr[420],pNum,cnt[420][420];
int n,m,K,size;
vector<int> V[N];
int a[N],c[N];
  
int Q[N];
  
int get(int L,int R,int x)
{
    if(L>R) return 0;
      
    L=pl[L]; R=pr[R];
    int l=0,r=SZ(V[x])-1;
    while(V[x][l]<L) l++;
    while(V[x][r]>R) r--;
    return max(0,r-l+1);
}
  
  
int cal(int L,int R)
{
    int l=0,r=pNum;
    while(pr[l]<L) l++;
    while(pl[r]>R) r--;
    int i,ans=0;
    if(l==r||l+1==r)
    {
        for(i=L;i<=R;i++)
        {
            c[a[i]]++;
            if(c[a[i]]==1) continue;
            if(c[a[i]]&1) ans--;
            else ans++;
        }
        for(i=L;i<=R;i++) c[a[i]]=0;
        return ans;
    }
    int head=0,tail=0,x,y;
    for(i=L;i<=pr[l];i++)
    {
        c[a[i]]++;
        if(c[a[i]]==1) Q[tail++]=a[i];
    }
    for(i=pl[r];i<=R;i++)
    {
        c[a[i]]++;
        if(c[a[i]]==1) Q[tail++]=a[i];
    }
    l++; r--;
    ans=cnt[l][r];
    for(i=head;i<tail;i++) 
    {
        x=Q[i];
        y=get(l,r,x);
        if(y==0) ans+=(c[x]%2==0);
        else if(y%2==1&&c[x]%2==1) ans++;
        else if(y%2==0&&c[x]%2==1) ans--;
        c[x]=0;
    }
    return ans;
}
  
  
int main()
{
    RD(n,m,K);
    int i,j,k;
    size=0;
    while(size*size<n) size++;
    pNum=0;
    int L=1,R;
    while(L<=n)
    {
        R=min(n,L+size-1);
        pl[++pNum]=L;
        pr[pNum]=R;
          
        L=R+1;
    }
    pl[0]=-INF; pr[0]=0;
    pl[++pNum]=n+1; pr[pNum]=INF;
    FOR1(i,n) RD(a[i]),V[a[i]].pb(i);
    FOR1(i,m) V[i].pb(n+1);
    int temp;
    for(i=1;i<=pNum-1;i++)
    {
        FOR1(j,m) c[j]=0;
        temp=0;
        for(j=i;j<=pNum-1;j++)
        {
            for(k=pl[j];k<=pr[j];k++)
            {
                c[a[k]]++;
                if(c[a[k]]==1) continue;
                if(c[a[k]]&1) temp--;
                else temp++;
            }
            cnt[i][j]=temp;
        }
    }
    FOR1(i,m) c[i]=0;
    int ans=0;
    while(K--)
    {
        RD(L,R);
        L=(L+ans)%n+1;
        R=(R+ans)%n+1;
        if(L>R) swap(L,R);
        ans=cal(L,R);
        PR(ans);
    }
}

相关文章:

  • python学习笔记(九):操作数据库
  • Java今年最流行的三大框架你应该学习了
  • JSON数组,JSON对象,数组的区别与基本操作整理
  • 阿里云全球19个地域节点,哪个节点的服务器好,速度快?
  • 回顾2017:基础设施支出增长 思科占主导地位
  • 微服务入门【系列视频课程】
  • mongodb集群模式(主从模式,副本集模式,分片模式)
  • 透彻影像王书浩:三易其辙与功不唐捐
  • 如何使用 Spinnaker 和 Kubernetes 进行数据库变更发布
  • 为什么需要模版成员方法
  • W3C官方推荐使用新发布的HTML5.2
  • Lintcode: Minimum Subarray 解题报告
  • laravel ORM get() first()
  • h5 扫描二维码打开app和点击下载功能的实现
  • 云时代重新定义主机安全:自动化安全闭环是核心
  • [ JavaScript ] 数据结构与算法 —— 链表
  • C# 免费离线人脸识别 2.0 Demo
  • canvas绘制圆角头像
  • C语言笔记(第一章:C语言编程)
  • ECMAScript入门(七)--Module语法
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • leetcode386. Lexicographical Numbers
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • SAP云平台里Global Account和Sub Account的关系
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 关于使用markdown的方法(引自CSDN教程)
  • ------- 计算机网络基础
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 我看到的前端
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (分享)自己整理的一些简单awk实用语句
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (一)Thymeleaf用法——Thymeleaf简介
  • (一)基于IDEA的JAVA基础12
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • *上位机的定义
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • @autowired注解作用_Spring Boot进阶教程——注解大全(建议收藏!)
  • @SentinelResource详解
  • @Transactional 详解
  • [ NOI 2001 ] 食物链
  • [ 隧道技术 ] 反弹shell的集中常见方式(二)bash反弹shell
  • [14]内置对象
  • [Android 13]Input系列--获取触摸窗口
  • [Android]创建TabBar
  • [ARC066F]Contest with Drinks Hard
  • [ASP.NET MVC]如何定制Numeric属性/字段验证消息
  • [BPU部署教程] 教你搞定YOLOV5部署 (版本: 6.2)
  • [BZOJ4016][FJOI2014]最短路径树问题