bzoj2821作诗
http://www.lydsy.com/JudgeOnline/problem.php?id=2821
分块
我们把数列分成$\sqrt{N}$块
记$f[i][j]$表示第i块到第j块的答案,这个可以在$O(N\sqrt{N})$内得到。
记$g[i][j]$第1到第i块中数字j出现了多少次,这个我们可以先求出第i块中数字j出现了多少次,然后求前缀和即可,这个可以在$O(C\sqrt{N})$内得到。
对于询问区间[l,r]我们可以从f数组中快速求出中间连续的完整的块答案。
对于剩余部分,我们可以一个一个调整答案,反正剩余部分的长度是$\sqrt{N}$级别的。
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<fstream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<utility>
#include<set>
#include<bitset>
#include<vector>
#include<functional>
#include<deque>
#include<cctype>
#include<climits>
#include<complex>
//#include<bits/stdc++.h>适用于CF,UOJ,但不适用于poj using namespace std; typedef long long LL;
typedef double DB;
typedef pair<int,int> PII;
typedef complex<DB> CP; #define mmst(a,v) memset(a,v,sizeof(a))
#define mmcy(a,b) memcpy(a,b,sizeof(a))
#define fill(a,l,r,v) fill(a+l,a+r+1,v)
#define re(i,a,b) for(i=(a);i<=(b);i++)
#define red(i,a,b) for(i=(a);i>=(b);i--)
#define ire(i,x) for(typedef(x.begin()) i=x.begin();i!=x.end();i++)
#define fi first
#define se second
#define m_p(a,b) make_pair(a,b)
#define p_b(a) push_back(a)
#define SF scanf
#define PF printf
#define two(k) (1<<(k)) template<class T>inline T sqr(T x){return x*x;}
template<class T>inline void upmin(T &t,T tmp){if(t>tmp)t=tmp;}
template<class T>inline void upmax(T &t,T tmp){if(t<tmp)t=tmp;} const DB EPS=1e-;
inline int sgn(DB x){if(abs(x)<EPS)return ;return(x>)?:-;}
const DB Pi=acos(-1.0); inline int gint()
{
int res=;bool neg=;char z;
for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());
if(z==EOF)return ;
if(z=='-'){neg=;z=getchar();}
for(;z!=EOF && isdigit(z);res=res*+z-'',z=getchar());
return (neg)?-res:res;
}
inline LL gll()
{
LL res=;bool neg=;char z;
for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());
if(z==EOF)return ;
if(z=='-'){neg=;z=getchar();}
for(;z!=EOF && isdigit(z);res=res*+z-'',z=getchar());
return (neg)?-res:res;
} const int maxN=;
const int maxC=;
const int maxcnt=; int N,C,Q;
int a[maxN+];
int cnt,len,l[maxcnt+],r[maxcnt+];
int id[maxN+];
int f[maxcnt+][maxcnt+];
int g[maxcnt+][maxC+];
int t[maxC+];
int ans; int main()
{
freopen("bzoj2821.in","r",stdin);
freopen("bzoj2821.out","w",stdout);
int i,j,k;
N=gint();C=gint();Q=gint();
re(i,,N)a[i]=gint();
len=int(sqrt(DB(N)));
re(i,,N)
{
if((i-)%len==)r[cnt]=i-,l[++cnt]=i;
id[i]=cnt;
}
r[cnt]=N;
re(i,,cnt)
{
int res=;
re(j,i,cnt)
{
re(k,l[j],r[j])
{
t[a[k]]++;
if(t[a[k]]>= && !(t[a[k]]&))res++;
if(t[a[k]]>= && (t[a[k]]&))res--;
}
f[i][j]=res;
}
re(k,l[i],N)t[a[k]]--;
}
re(i,,cnt)re(j,l[i],r[i])g[i][a[j]]++;
re(i,,cnt)re(j,,C)g[i][j]+=g[i-][j];
ans=;
while(Q--)
{
int L=(gint()+ans)%N+,R=(gint()+ans)%N+,res=;
if(L>R)swap(L,R);
if(id[L]==id[R] || id[L]+==id[R])
{
re(i,L,R)
{
t[a[i]]++;
if(t[a[i]]>= && !(t[a[i]]&))res++;
if(t[a[i]]>= && (t[a[i]]&))res--;
}
re(i,L,R)t[a[i]]--;
ans=res;
}
else
{
int p=(L==l[id[L]])?id[L]:id[L]+,q=(R==r[id[R]])?id[R]:id[R]-;
res=f[p][q];
red(i,l[p]-,L)
{
t[a[i]]++;
t[a[i]]+=g[q][a[i]]-g[p-][a[i]];
if(t[a[i]]>= && !(t[a[i]]&))res++;
if(t[a[i]]>= && (t[a[i]]&))res--;
t[a[i]]-=g[q][a[i]]-g[p-][a[i]];
}
re(i,r[q]+,R)
{
t[a[i]]++;
t[a[i]]+=g[q][a[i]]-g[p-][a[i]];
if(t[a[i]]>= && !(t[a[i]]&))res++;
if(t[a[i]]>= && (t[a[i]]&))res--;
t[a[i]]-=g[q][a[i]]-g[p-][a[i]];
}
red(i,l[p]-,L)t[a[i]]--;
re(i,r[q]+,R)t[a[i]]--;
ans=res;
}
PF("%d\n",ans);
}
return ;
}
bzoj2821作诗的更多相关文章
- BZOJ2821 作诗(Poetize) 【分块】
BZOJ2821 作诗(Poetize) Description 神犇SJY虐完HEOI之后给傻×LYD出了一题: SHY是T国的公主,平时的一大爱好是作诗. 由于时间紧迫,SHY作完诗之后还要虐OI ...
- 【分块】BZOJ2821 作诗(Poetize)
2821: 作诗(Poetize) Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 3265 Solved: 951[Submit][Status][ ...
- BZOJ2821 作诗(Poetize) 主席树 bitset
原文链接https://www.lydsy.com/JudgeOnline/problem.php?id=2821 题目传送门 - BZOJ2821 题意 $n$ 个数,$m$ 组询问,每次问 $[l ...
- BZOJ2821 作诗(分块)
和区间众数几乎一模一样的套路. // luogu-judger-enable-o2 #include<iostream> #include<cstdio> #include&l ...
- bzoj2821: 作诗(Poetize)
分块 分sqrt(n)块 F[i][j]表示块i到块j的答案 s[i][j]表示数字i在前j块内出现了几次 #include <iostream> #include <cstdio& ...
- BZOJ2821 作诗(Poetize) 分块
题意 算法 经验总结 代码 题意 不带修改,查询数列[1,n]中[l,r]内的出现正偶数次的数的个数, 数列中的数 <= 1e5, n <= 1e5, 强制在线 算法 查询的内容: 区 ...
- 2018.09.30 bzoj2821: 作诗(Poetize)(分块)
传送门 分块经典题目. 先将数列分块. 然后预处理出每两个块之间有多少个数出现了正偶数次. 这样查询的时候对于中间的完整块直接用预处理出的数组搞定. 剩下的暴力枚举求解. 代码: #include&l ...
- [BZOJ2821]作诗
description 在线询问区间内出现次数为正偶数的数的种数. data range \[n,m\le 10^5\] solution 分块大法好 首先离散化权值 这种对于权值做询问并且询问放在一 ...
- [BZOJ2821]作诗(分块)
题意 N个数,M组询问,每次问[l,r]中有多少个数出现正偶数次对于100%的数据,1≤n,c,m≤105 题解 (传说lyd省选的时候看错题 把题看成这个了 从此又多了一道分块神题)把N个数 ...
随机推荐
- 适配ios7
if ([self respondsToSelector:@selector(edgesForExtendedLayout)]) { self.edgesForExtendedLayout = UIR ...
- Android 出现警告Exported service does not require permission
在配置Android清单文件的时候,配置service,或者activity,或者receive的时候,出现Exported service does not require permission警告 ...
- A+B问题(java)
import java.util.Scanner; public class Main { public static void main ( String args[] ) { Scanner in ...
- Java设计模式---组合模式
一.组合模式定义 组合模式定义: Compose objects into tree structures to represent part-whole hierarchies. Composite ...
- jquery 滚动加载
<html xmlns="http://www.w3.org/1999/xhtml"><head runat="server"> < ...
- CSS元素分类及区别
元素是文档结构的基础,在CSS中,每个元素生成了一个包含了元素内容的框(box,也译为“盒子”).但是不同的元素显示的方式会有所不同,例如<div>和<span>就不同,而&l ...
- asp.net微信开发第九篇----模板消息的使用
微信平台的模板消息,使用起来非常好,效果如下: 和平时我们微信中关注信用卡官方微信,如果消费了,信用卡官方微信就返回一个模板消息给我们告知,余额还有多少,消费了多少. 使用的步骤,我只简单介绍了怎么使 ...
- PHP对表单提交特殊字符的过滤和处理
PHP关于表单提交特殊字符的处理方法做个汇总,主要涉及htmlspecialchars/addslashes/stripslashes/strip_tags/mysql_real_escape_str ...
- Android Studio中新建项目时Your android sdk is out of date or is missing templates的解决办法
在Android Studio中新建项目时出现了以下问题:Your android sdk is out of date or is missing templates. Please ensure ...
- Android v2.0 基本概念 - 浅谈
目录 Android框架 Linux Kernel 系统运行库 Libraries Android Runtime Application Framework Application Android框 ...