Link:

BZOJ 2821 传送门

Solution:

一道类似区间众数的经典分块

由于个数为偶数这样的条件不能支持快速合并

因此要先$O(n*sqrt(n))$预处理出$pre[i][j]$表示第$i$块到第$j$块的答案

同时要建立每种颜色的有序序列方便求出一个区间内某种颜色的个数

这样每次查询时就能$O(1)$得出整块答案,$O(size*logn)$算出非整块的数对答案的影响

Code:

#include <bits/stdc++.h>

using namespace std;
#define X first
#define Y second
#define pb push_back
typedef double db;
typedef long long ll;
typedef pair<int,int> P;
const int MAXN=1e5+,CNT=;
vector<int> col[MAXN];
int n,c,m,l,r,dat[MAXN],pre[CNT][CNT],block;
int L[MAXN],R[MAXN],sub[MAXN],vis[MAXN],sum[MAXN],cnt,res; void PRE()
{
for(int i=;i<=cnt;i++)
{
int cur=;
for(int j=L[i];j<=n;j++)
sum[dat[j]]=;
for(int j=L[i];j<=n;j++)
{
if(!(sum[dat[j]]&)&&sum[dat[j]]) cur--;
sum[dat[j]]++;
if(!(sum[dat[j]]&)) cur++;
pre[i][sub[j]]=cur;
}
}
for(int i=;i<=n;i++)
col[dat[i]].pb(i);
for(int i=;i<=c;i++)
if(col[i].size()) sort(col[i].begin(),col[i].end());
} int cal(int x,int l,int r)
{
int lft=lower_bound(col[x].begin(),col[x].end(),l)-col[x].begin();
int rgt=upper_bound(col[x].begin(),col[x].end(),r)-col[x].begin()-;
return max(rgt-lft+,);
}
void work(int pos,int &ret,int l,int r,int x,int y)
{
if(vis[dat[pos]]) return;
int t1=cal(dat[pos],l,r),t2=cal(dat[pos],x,y);
//注意这里的判断
if(!(t1&)&&(!t2||t2&)) ret++;
else if((t1&)&&!(t2&)&&t2)ret--;
vis[dat[pos]]=;
}
int solve(int l,int r)
{
int bl=sub[l],br=sub[r],ret=;
if(bl==br||bl+==br)
{
for(int i=l;i<=r;i++)
{
if(vis[dat[i]]) continue;
int t=cal(dat[i],l,r);
ret+=(!(t&));vis[dat[i]]=;
}
for(int i=l;i<=r;i++) vis[dat[i]]=;
}
else
{
ret=pre[bl+][br-];
for(int i=l;i<L[bl+];i++)
work(i,ret,l,r,L[bl+],R[br-]);
for(int i=R[br-]+;i<=r;i++)
work(i,ret,l,r,L[bl+],R[br-]);
for(int i=l;i<L[bl+];i++) vis[dat[i]]=;
for(int i=R[br-]+;i<=r;i++) vis[dat[i]]=;
}
return ret;
} int main()
{
scanf("%d%d%d",&n,&c,&m);
block=sqrt((double)n/log((double)n)*log());
cnt=n/block+(n%block!=);
for(int i=;i<=n;i++) scanf("%d",&dat[i]);
for(int i=;i<=n;i++) sub[i]=(i-)/block+;
for(int i=;i<=cnt;i++)
L[i]=(i-)*block+,R[i]=i*block;
R[cnt]=n;PRE(); while(m--)
{
scanf("%d%d",&l,&r);
l=(l+res)%n+;r=(r+res)%n+;
if(l>r) swap(l,r);
printf("%d\n",res=solve(l,r));
}
return ;
}

[BZOJ 2821] 作诗的更多相关文章

  1. 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 ...

  2. [BZOJ 2821] 作诗(Poetize) 【分块】

    题目链接:BZOJ - 2821 题目分析 因为强制在线了,所以无法用莫队..可以使用分块来做. 做法是,将 n 个数分成 n/x 个块,每个块大小为 x .先预处理出 f[i][j] ,表示从第 i ...

  3. bzoj 2821 作诗 分块

    基本思路和蒲公英一样 还是预处理出每两个块间的答案 询问时暴力跑两边的贡献 #include<cstdio> #include<cstring> #include<ios ...

  4. BZOJ 2821作诗(Poetize) 分块

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

  5. 2821: 作诗(Poetize)

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

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

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

  7. 作诗(bzoj 2821)

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

  8. BZOJ2821:作诗——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=2821 问题描述 神犇SJY虐完HEOI之后给傻×LYD出了一题: SHY是T国的公主,平时的一大爱好 ...

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

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

随机推荐

  1. 【BZOJ】4555: [Tjoi2016&Heoi2016]求和 排列组合+多项式求逆 或 斯特林数+NTT

    [题意]给定n,求Σi=0~nΣj=1~i s(i,j)*2^j*j!,n<=10^5. [算法]生成函数+排列组合+多项式求逆 [题解]参考: [BZOJ4555][Tjoi2016& ...

  2. MyBatis笔记之配置输出日志并打印输出SQL语句

    1. 引入Log4J的Maven依赖: <dependency> <groupId>log4j</groupId> <artifactId>log4j& ...

  3. unity3d 资源文件从MAX或者MAYA中导出的注意事项

    unity3d 资源文件从MAX或者MAYA中导出的注意事项     1.首先,Unity3d 中,导出带动画的资源有2种导出方式可以选择:    1) 导出资源时,只导出一个文件,保留模型,骨骼和所 ...

  4. php遍历路径——php经典实例

    php遍历路径——php经典实例 代码: <html> <head> <title>遍历目录</title> <meta charset=&quo ...

  5. 【日期控件】JQueryUI的datepicker日期控件

    在输入日期的时候我们经常需要日期控件,jQueryUI的datapicker就是一个很好的日期控件. 1.简单的datepicker控件 目录结构:(要将images图片放到css目录下面)

  6. MongoDB之安装和基本使用(一)

    环境 ubuntu16.04 mongodb基本特点 MongoDB 是一个基于分布式 文件存储的NoSQL数据库;可以把MongoDB想象成一个大py字典. 模式自由 :可以把不同结构的文档存储在同 ...

  7. Linux进程的创建函数fork()及其fork内核实现解析【转】

    转自:http://www.cnblogs.com/zengyiwen/p/5755193.html 进程的创建之fork() Linux系统下,进程可以调用fork函数来创建新的进程.调用进程为父进 ...

  8. module 'pytest' has no attribute 'allure'问题解决

    安装allure后执行命令后报错module 'pytest' has no attribute 'allure' C:\Users\Desktop\xin>pytest -s -q --all ...

  9. kvm安装准备

    到实际情况下,做虚拟化是直接做在真机上. 但实验时,可以在虚拟机上进行.(因为做实验的时候没办法连接到桥接模式的网络,所以使用了NAT方式来连接网络) 在vmware安装centos 64bit fo ...

  10. C/C++——[05] 函数

    函数是 C/C++语言中的一种程序组件单位.一个函数通常代表了一种数据处理的功能,由函数体和函数原型两部分组成.函数原型为这个数据处理功能指定一个标识符号(函数的名称).说明被处理数据的组成及其类型. ...