[BZOJ 2821] 作诗
Link:
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] 作诗的更多相关文章
- 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 ...
- [BZOJ 2821] 作诗(Poetize) 【分块】
题目链接:BZOJ - 2821 题目分析 因为强制在线了,所以无法用莫队..可以使用分块来做. 做法是,将 n 个数分成 n/x 个块,每个块大小为 x .先预处理出 f[i][j] ,表示从第 i ...
- bzoj 2821 作诗 分块
基本思路和蒲公英一样 还是预处理出每两个块间的答案 询问时暴力跑两边的贡献 #include<cstdio> #include<cstring> #include<ios ...
- BZOJ 2821作诗(Poetize) 分块
Description 有一个长度为n的序列,序列每个元素的范围[1,c],有m个询问x y,表示区间[x,y]中出现正偶数次的数的种类数. Solution 大力分块解决问题. 把序列分块,f[i] ...
- 2821: 作诗(Poetize)
2821: 作诗(Poetize) Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 1078 Solved: 348[Submit][Status] ...
- 【分块】BZOJ2821 作诗(Poetize)
2821: 作诗(Poetize) Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 3265 Solved: 951[Submit][Status][ ...
- 作诗(bzoj 2821)
Description 神犇SJY虐完HEOI之后给傻×LYD出了一题:SHY是T国的公主,平时的一大爱好是作诗.由于时间紧迫,SHY作完诗 之后还要虐OI,于是SHY找来一篇长度为N的文章,阅读M次 ...
- BZOJ2821:作诗——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=2821 问题描述 神犇SJY虐完HEOI之后给傻×LYD出了一题: SHY是T国的公主,平时的一大爱好 ...
- 【BZOJ2821】作诗(Poetize) 分块
Description 神犇SJY虐完HEOI之后给傻×LYD出了一题:SHY是T国的公主,平时的一大爱好是作诗.由于时间紧迫,SHY作完诗之后还要虐OI,于是SHY找来一篇长度为N的文章,阅读M次, ...
随机推荐
- Oracle数据库语句
Oracle数据库语句 ORACLE支持五种类型的完整性约束 NOT NULL (非空)--防止NULL值进入指定的列,在单列基础上定义,默认情况下,ORACLE允许在任何列中有NULL值. CHEC ...
- oozie与hive的简单案例
1.把oozie中自带的hive案例拷贝到 测试目录 /opt/cdh-5.3.6/oozie-4.0.0-cdh5.3.6/oozie-apps下 2. 编辑 job.properties # # ...
- Spring: J2EE框架
Spring Framework 是一个开源的Java/Java EE全功能栈(full-stack)的应用程序框架,以Apache许可证形式发布,也有.NET平台上的移植版本.该框架基于 Exper ...
- 【译】msfvenom
原文链接:MSFvenom 1.使用MSFvenom命令行界面 msfvenom是Msfpayload和Msfencode的组合,将这两个工具集成在一个框架实例中. msfvenom的优点是: 一个单 ...
- vue--------脚手架vue-cli搭建
今天在看公司的项目的时候,用到的是Vue框架,哈哈,Vue已经火好久了,想必大家也晓得哈,这里宝宝就不瞎渣渣了~ 由于宝宝已经三个月木有看过代码了,所以对新公司的很多的架构和代码都是懵逼的,再加上宝宝 ...
- Where can I check in?
Where can I check in? 在哪儿办理登记手续?
- PlantUML——1.Hello
官网: http://www.plantuml.com/ 第一步: 下载 plantuml.jar文件: 第二步:创建一个demo.txt文件(与plantuml.jar在同一目录),内容如下: @s ...
- Linux环境Nginx安装、调试以及PHP安装
linux版本:64位CentOS 6.4 Nginx版本:nginx1.8.0 php版本:php5.5 1.编译安装Nginx 官网:http://wiki.nginx.org/Install 下 ...
- setsid
说明:当进程是会话的领头进程时setsid()调用失败并返回(-1).setsid()调用成功后,返回新的会话的ID,调用setsid函数的进程成为新的会话的领头进程,并与其父进程的会话组和进程组脱离 ...
- 【转】Python OCR识别图片验证码
转载自:博客 对于某些网站登录的时候,往往需要输入验证码才能实现登录.如果要爬虫这类网站,往往总会比这个验证码导致无法爬取数据.以下介绍一种比较折中的方法,也是比较可行的方法: 实现思想: 1.通过截 ...