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. Let's Encrypt 免费通配 https 签名证书 安装方法2 ,安卓签名无法认证!

    Let's Encrypt 免费通配 https 签名证书 安装方法 按照上文 配置完毕后你会发现 在pc浏览器中正常访问,在手机浏览器中无法认证 你只需要安装一个或多个中级证书 1.查看Nginx ...

  2. 【洛谷 P3648】 [APIO2014]序列分割 (斜率优化)

    题目链接 假设有\(3\)段\(a,b,c\) 先切\(ab\)和先切\(bc\)的价值分别为 \(a(b+c)+bc=ab+bc+ac\) \((a+b)c+ab=ab+bc+ac\) 归纳一下可以 ...

  3. Python面向对象学习 1 (什么是面向对象,面向对象的应用场景,待更新)

    程序设计的三种基本结构: 面向对象,面向过程,函数式编程   1,什么是面向对象编程    面向对象编程是一种编程方式,此编程方式的落地需要使用 “类” 和 “对象” 来实现,所以,面向对象编程其实就 ...

  4. java在CMD窗口执行程序的时候输入密码(隐藏一些敏感信息)

    有时候我们需要从CMD窗口执行一些命令,有时候会输入一些敏感的信息,比如密码之类的东西,所以我们可以从控制台读取但是不希望别人看见我们的密码: import java.io.Console; /** ...

  5. Linux sqlite3基本命令

    简介sqlite3一款主要用于嵌入式的轻量级数据库,本文旨在为熟悉sqlite3基本命令提供技术文档. 备注:本文所有操作均在root用户下进行. 1.安装sqlite3 ubuntu下安装sqlit ...

  6. Ubuntu命令设置ip网关dns

    本文系转载,介绍Ubuntu如何设置IP和网络来连接网络 如果是在虚拟机中使用Ubuntu,那么设置之前请先参照我的上一遍文章虚拟机Net方式设置连接外网中的网络设置部分,先设置好主机的网络,然后配置 ...

  7. 137.Single Number II---位运算---《剑指offer》40

    题目链接:https://leetcode.com/problems/single-number-ii/description/ 题目大意:给出一串数,每个数都出现三次,只有一个数只出现一次,把这个出 ...

  8. 「caffe编译bug」.build_release/lib/libcaffe.so: undefined reference to cv::imread

    转自:https://www.douban.com/note/568788483/ CXX/LD -o .build_release/tools/convert_imageset.bin.build_ ...

  9. Spring Cloud Feign 输出日志

    还需要在application 文件中配置: #feign调用日志输出logging.level.cn.XXX=DEBUG Logger.Level下面有几种级别. BASIC : 只输出 请求URL ...

  10. Tutorial 5: Relationships & Hyperlinked APIs

    转载自:http://www.django-rest-framework.org/tutorial/5-relationships-and-hyperlinked-apis/ Tutorial 5: ...