题目:https://www.luogu.org/problemnew/show/P4135

分块大法;

块之间记录答案,每一块记录次数前缀和;

注意每次把桶中需要用到位置赋值就好了;

为什么加了特判会 T 一个点?

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int const maxn=1e5+;
int n,c,m,mod,a[maxn],ans,blk[maxn],base,t[maxn],cnt[][maxn],bst[],bed[],f[][];
void pre(int x)
{
int tmp=,tem=x;
memset(t,,sizeof t);
for(int i=bst[x];i<=n;i++)
{
t[a[i]]++;
if(t[a[i]]%==)tmp++;
else if(t[a[i]]>)tmp--;
if(i==bed[tem])f[x][tem]=tmp,tem++;
}
}
int main()
{
scanf("%d%d%d",&n,&c,&m);
base=sqrt(n);
for(int i=;i<=n;i++)scanf("%d",&a[i]),blk[i]=(i-)/base+;
for(int i=;i<=blk[n];i++)bst[i]=(i-)*base+,bed[i]=min(n,i*base);
for(int i=;i<=blk[n];i++)pre(i);
for(int i=;i<=blk[n];i++)
{
for(int k=;k<=c;k++)cnt[i][k]=cnt[i-][k];
for(int j=bst[i];j<=bed[i];j++)cnt[i][a[j]]++;
}
for(int i=,l,r;i<=m;i++)
{
scanf("%d%d",&l,&r);
l=(l+ans)%n+; r=(r+ans)%n+;
if(l>r)swap(l,r);
// if(l==r){printf("0\n"); ans=0; continue;}//ans=0!!! //加特判变慢了???
ans=;
if(blk[l]==blk[r])
{
for(int j=l;j<=r;j++)t[a[j]]=;
for(int j=l;j<=r;j++)
{
t[a[j]]++;
if(t[a[j]]%==)ans++;
else if(t[a[j]]>)ans--;
}
printf("%d\n",ans);
}
else
{
if(blk[r]>blk[l]+)ans=f[blk[l]+][blk[r]-];
for(int j=l;j<=bed[blk[l]];j++)t[a[j]]=cnt[blk[r]-][a[j]]-cnt[blk[l]][a[j]];
for(int j=bst[blk[r]];j<=r;j++)t[a[j]]=cnt[blk[r]-][a[j]]-cnt[blk[l]][a[j]];
for(int j=l;j<=bed[blk[l]];j++)
{
t[a[j]]++;
if(t[a[j]]%==)ans++;
else if(t[a[j]]>)ans--;
}
for(int j=bst[blk[r]];j<=r;j++)
{
t[a[j]]++;
if(t[a[j]]%==)ans++;
else if(t[a[j]]>)ans--;
}
printf("%d\n",ans);
}
}
return ;
}

P4135 作诗——分块的更多相关文章

  1. 洛谷P4135 作诗 (分块)

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

  2. 【分块】P4135 作诗

    分块太暴力惹... 没做出来.看了题解qaq 分析: 两头$\sqrt{n}$暴力维护 预处理ans[i][j],sum[i][j] sum[i][j]是一个前缀和,前i块值为j的数量 ans[i][ ...

  3. 洛谷 P4135 作诗(分块)

    题目链接 题意:\(n\) 个数,每个数都在 \([1,c]\) 中,\(m\) 次询问,每次问在 \([l,r]\) 中有多少个数出现偶数次.强制在线. \(1 \leq n,m,c \leq 10 ...

  4. 洛谷P4135 作诗(不一样的分块)

    题面 给定一个长度为 n n n 的整数序列 A A A ,序列中每个数在 [ 1 , c ] [1,c] [1,c] 范围内.有 m m m 次询问,每次询问查询一个区间 [ l , r ] [l, ...

  5. 洛谷P4135 作诗

    题意:[l,r]之间有多少个数出现了正偶数次.强制在线. 解:第一眼想到莫队,然后发现强制在线...分块吧. 有个很朴素的想法就是蒲公英那题的套路,做每块前缀和的桶. 然后发现这题空间128M,数组大 ...

  6. luogu P4135 作诗

    嘟嘟嘟 郑重声明:我的前几到分块题写法上都有点小毛病,以这篇为主! 这道题感觉也是分块的基本套路,只不过卡常,得开氧气. 维护俩:sum[i][j]表示前 i 块中,数字 j 出现了多少次,ans[i ...

  7. P4135 作诗

    传送门 分块 设sum[ i ] [ j ] 存从左边到第 i 块时,数字 j 的出现次数 f [ i ] [ j ] 存从第 i 块,到第 j 块的一整段的答案 那么最后答案就是一段区间中几块整段的 ...

  8. 洛谷 P4135 作诗

    分块大暴力,跟区间众数基本一样 #pragma GCC optimize(3) #include<cstdio> #include<algorithm> #include< ...

  9. [BZOJ2821]作诗(分块)

    题意 N个数,M组询问,每次问[l,r]中有多少个数出现正偶数次对于100%的数据,1≤n,c,m≤105 题解 (传说lyd省选的时候看错题   把题看成这个了   从此又多了一道分块神题)把N个数 ...

随机推荐

  1. Angular——todos案例

    基本介绍 (1)视图绑定两个数组,分别对应未完成和已完成 (2)数组的删除splice(),数组的追加push() 基本使用 <!DOCTYPE html> <html lang=& ...

  2. JS——滚动条

    1.核心思想与之前的拖拽盒子是一样的 2.完全将鼠标在盒子中的坐标给滚动条是错的,因为这样会使滚动条顶部立刻瞬间移动到鼠标位置 3.必须在鼠标按下事件时记住鼠标在滚动条内部的坐标,再将鼠标在盒子中的坐 ...

  3. 9、scala面向对象编程之继承

    1.  extends 2.override 和super 3.override field 4.isInstanceOf和asInstanceOf 5.getClass和classOf 6.使用模式 ...

  4. Go 时间相关

    >获取当前时间: t := time.Now() >获取当天开始.结束时间: tm1 := time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, ...

  5. 12--c完数/最大公约数/最小公倍数/素数/回文数

    完数/最大公约数/最小公倍数/素数/回文数 2015-04-08 10:33 296人阅读 评论(0) 收藏 举报  分类: C/C++(60)  哈尔滨工业大学(8)  版权声明:本文为博主原创文章 ...

  6. 常见Android安装启动失败问题

    1.INSTALL_FAILED_VERSION_DOWNGRADE版本过低2.Failed to install Funm_AND.apk on device 'QWOJLVR8KNHYA6NR': ...

  7. JAVA中EXTENDS 与 IMPLEMENT 区别

    简单说: 1.extends是继承父类,只要那个类不是声明为final或者那个类定义为abstract的就能继承,2.JAVA中不支持多重继承,但是可以用接口来实现,这样就要用到implements, ...

  8. Java中IO对象的输入输出流

    输入流: public void inputDemo () throws IOException { //文件名称 String fileName = "d:\\aaa.txt"; ...

  9. 踩过的坑:__file__、__package__和__name__

    不说废话,直接上示例结构图 Path.py内容如下: import os path1 = os.path.dirname(os.path.abspath(__file__)) path2 = os.p ...

  10. _initialize() 区别 __construct()

    _initialize()方法是在任何方法执行之前,都要执行的,当然也包括 __construct构造函数. 也就是说如果存在_initialize()函数,调用对象的任何方法都会导致_initial ...