[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次, ...
随机推荐
- 51nod 1073 约瑟夫环
题目链接 先说一下什么是约瑟夫环,转自:传送门 关于约瑟夫环问题,无论是用链表实现还是用数组实现都有一个共同点:要模拟整个游戏过程,不仅程序写起来比较烦,而且时间复杂度高达O(nm),当n,m非常大( ...
- # 2018高考&自主招生 - 游记
准备了一整个学期的高考和自主招生终于结束了....从育英出来, 以一个失败者的身份来写游记, 权当为明年的决战提供经验与总结. Day -1, June 5th 下午同学收拾考场, 自己在那里看书.. ...
- android ViewPager之OnPageChangeListener接口
项目中在使用ViewPager的时候,一般都要在界面滑动的时候做一些事情,android中有个专门的状态回调接口OnPageChangeListener. /** * Callback interfa ...
- 关于parse_str变量覆盖分析
这个漏洞有两个姿势.一个是不存在的时候一个是存在的时候. 经过测试该漏洞只在php5.2中存在,其余均不存在. 倘若在parse_str函数使用的代码上方未将其定义那么即存在变量覆盖漏洞否则不行. 还 ...
- ISG2018 web题Writeup
0x01.命令注入 这题可以使用burpsuite扫出来,但是可能需要测一下. 得知payload为:i%7cecho%20gzavvlsv9c%20q9szmriaiy%7c%7ca%20%23'% ...
- linux 进程优先级 之设置实时进程 (另一种方式是设置nice值)【转】
转自:https://www.cnblogs.com/jkred369/p/6731353.html Linux内核的三种调度策略: 1,SCHED_OTHER 分时调度策略, 2,SCHED_FIF ...
- NEERC2012
NEERC2012 A - Addictive Bubbles 题目描述:有一个\(n \times m\)的棋盘,还有不同颜色的棋子若干个,每次可以消去一个同种颜色的联通块,得到的分数为联通块中的棋 ...
- selenium grid结构图
调用 Selenium-Grid 的基本结构图如下: 上面是使用 selenium-grid 的一种普通方式,仅仅使用了其支持的分布式执行的功能,即当你同时需 要测试用例比较多时,可以平行的执行这些用 ...
- UBuntu14.04 --vim安装YouCompleteMe插件
说明 我电脑的系统参数(用 uname -a命令查看)如下: Linux avyn-Lenovo --generic #-Ubuntu SMP Tue Mar :: UTC i686 i686 i68 ...
- windows下phpstrom中xdebug的使用
https://laravel-china.org/articles/16425/windows-phpstorm-xdebug-breakpoint-debugging