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. 2017ACM暑期多校联合训练 - Team 2 1001 HDU 6045 Is Derek lying? (模拟)

    题目链接 Problem Description Derek and Alfia are good friends.Derek is Chinese,and Alfia is Austrian.Thi ...

  2. 带你优雅的使用 icon

    前言 本篇文章其实陆陆续续写了快半年,主体部分写好了很久了,但由于种种原因一直没有发布.首先来说说写这篇文章的主要初衷是:在做前端后台项目的时候经常会用到很多 icon 图标,刚开始还好,但随着项目的 ...

  3. Python作业选课系统(第六周)

    作业需求: 角色:学校.学员.课程.讲师.完成下面的要求 1. 创建北京.上海 2 所学校 2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开 ...

  4. js_网页导出pdf文件

    打印当前页面,一开始我认为是需要输出pdf的,后来了解的需求是能够打印就可以了.需求既然都研究了,记录下. 更好的打印方式,window.print();会弹出打印对话框,打印的是window.doc ...

  5. Coursera在线学习---第五节.Logistic Regression

    一.假设函数与决策边界 二.求解代价函数 这样推导后最后发现,逻辑回归参数更新公式跟线性回归参数更新方式一摸一样. 为什么线性回归采用最小二乘法作为求解代价函数,而逻辑回归却用极大似然估计求解? 解答 ...

  6. javashop每次重新部署都要从新安装的问题

    javashop每次重新部署都要从新安装的问题 发现一个问题就是用MyEclipse是部署不上的,用eclipse才行. 这个问题的关键在于javashop有好多文件都是动态生成的,好多配置文件也是在 ...

  7. glom模块的使用(二)

    上次我们说到golm的简单应用这次我们继续带结构化数据的其他操作进行学习. Literal 用法:class glom.Literal(value) 这个方法的功能主要是添加自定义的键值. 例如: f ...

  8. Petrozavodsk Summer Training Camp 2017

    Petrozavodsk Summer Training Camp 2017 Problem A. Connectivity 题目描述:有\(n\)个点,现不断地加边.每条边有一种颜色,如果一个点对\ ...

  9. jquery 通过 live() 方法附加的事件处理程序适用于匹配选择器的当前及未来的元素(比如由脚本创建的新元素)

    jquery 通过 live() 方法附加的事件处理程序适用于匹配选择器的当前及未来的元素(比如由脚本创建的新元素) $("ul").append("<li cla ...

  10. 在Ubuntu上安装搜狗输入法

    1.进入搜狗输入法官网 2.下载Linux版本,选择64bit 下载 3.等待下载的同时,进行系统配置 进入系统设置->语言支持->进行更新(需要输入登录密码)->在键盘输入法系统选 ...