作诗(bzoj 2821)
Description
Input
Output
输出共m行,每行一个整数,第i个数表示SHY第i次能选出的汉字的最多种类数。
Sample Input
1 2 2 3 1
0 4
1 2
2 2
2 3
3 5
Sample Output
0
0
0
1
HINT
对于100%的数据,1<=n,c,m<=10^5
- /*
- 分块
- 对于每次询问,我们可以先得到所有的整块中偶数的数的个数(可以预处理),对于不完整的,扫一遍,
- 得到每个数的个数,然后通过二分查找他们在(x,y)中出现的次数就可以判定了。
- 但是分块方式特别不清真,每块大小sqrt(n/logn),因为每次询问都要二分,复杂度最多可达logn,所以
- 要这样分块。
- 这里说一下,我测的极端数据,按照sqrt(n)来分块要跑8s+,按照这道题的分块方法,只需3s+。
- */
- #include<cstdio>
- #include<iostream>
- #include<vector>
- #include<cmath>
- #include<cstring>
- #include<algorithm>
- #define N 100010
- #define M 3010
- using namespace std;
- int a[N],bl[N],f[M][M],n,c,m,cnt[N],q[N],len;
- vector<int> ve[N];
- void init(int s){
- memset(cnt,,sizeof(cnt));
- int tot=;
- for(int i=(s-)*len+;i<=n;i++){
- cnt[a[i]]++;
- if(cnt[a[i]]%==&&cnt[a[i]]!=) tot--;
- if(cnt[a[i]]%==) tot++;
- f[s][bl[i]]=tot;
- }
- }
- int querysum(int x,int y,int v){
- return upper_bound(ve[v].begin(),ve[v].end(),y)-lower_bound(ve[v].begin(),ve[v].end(),x);
- }
- int query(int x,int y){
- //memset(cnt,0,sizeof(cnt));
- int ans=f[bl[x]+][bl[y]-];
- int tot=;
- for(int i=x;i<=min(bl[x]*len,y);i++){
- if(!cnt[a[i]]) q[++tot]=a[i];
- cnt[a[i]]++;
- }
- if(bl[x]!=bl[y])
- for(int i=(bl[y]-)*len+;i<=y;i++){
- if(!cnt[a[i]]) q[++tot]=a[i];
- cnt[a[i]]++;
- }
- for(int i=;i<=tot;i++){
- int sum=querysum(x,y,q[i]),sum1=sum-cnt[q[i]],sum2=cnt[q[i]];
- if(sum1&){
- if(sum2&) ans++;
- }
- else if(sum1){
- if(sum2&) ans--;
- }
- else {
- if(!(sum2&)) ans++;
- }
- }
- for(int i=x;i<=min(bl[x]*len,y);i++) cnt[a[i]]=;
- for(int i=(bl[y]-)*len+;i<=y;i++) cnt[a[i]]=;
- return ans;
- }
- int main(){
- scanf("%d%d%d",&n,&c,&m);
- //len=sqrt(n);
- len=sqrt((double)n/log((double)n)*log());
- for(int i=;i<=n;i++){
- scanf("%d",&a[i]);
- bl[i]=(i-)/len+;
- ve[a[i]].push_back(i);
- }
- for(int i=;i<=bl[n];i++)
- init(i);
- int ans=;
- memset(cnt,,sizeof(cnt));
- for(int i=;i<=m;i++){
- int x,y;scanf("%d%d",&x,&y);
- x=(x+ans)%n+;y=(y+ans)%n+;
- if(x>y) swap(x,y);
- ans=query(x,y);
- printf("%d\n",ans);
- }
- 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] 作诗
Link: BZOJ 2821 传送门 Solution: 一道类似区间众数的经典分块 由于个数为偶数这样的条件不能支持快速合并 因此要先$O(n*sqrt(n))$预处理出$pre[i][j]$表示 ...
- 2821: 作诗(Poetize)
2821: 作诗(Poetize) Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 1078 Solved: 348[Submit][Status] ...
- BZOJ2821:作诗——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=2821 问题描述 神犇SJY虐完HEOI之后给傻×LYD出了一题: SHY是T国的公主,平时的一大爱好 ...
- 【分块】BZOJ2821 作诗(Poetize)
2821: 作诗(Poetize) Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 3265 Solved: 951[Submit][Status][ ...
- 【BZOJ2821】作诗(Poetize) 分块
Description 神犇SJY虐完HEOI之后给傻×LYD出了一题:SHY是T国的公主,平时的一大爱好是作诗.由于时间紧迫,SHY作完诗之后还要虐OI,于是SHY找来一篇长度为N的文章,阅读M次, ...
- 做10年Windows程序员与做10年Linux程序员的区别(附无数评论)(开源软件相当于熟读唐诗三百首,不会作诗也会吟)
如果一个程序员从来没有在linux,unix下开发过程序,一直在windows下面开发程序, 同样是工作10年, 大部分情况下与在linux,unix下面开发10年的程序员水平会差别很大.我写这篇文章 ...
- [Luogu 4135] 作诗
Description 神犇SJY虐完HEOI之后给傻×LYD出了一题: SHY是T国的公主,平时的一大爱好是作诗. 由于时间紧迫,SHY作完诗之后还要虐OI,于是SHY找来一篇长度为N的文章,阅读M ...
随机推荐
- HTTPs与HTTP的性能
(参考:https://blog.csdn.net/chinafire525/article/details/78911734 https://blog.csdn.net/hherima/articl ...
- fgetc, fgets, getc, getchar, gets, ungetc - 输入字符和字符串
总览 (SYNOPSIS) #include <stdio.h> int fgetc(FILE *stream); char *fgets(char *s, int size, FILE ...
- Asp.Net Core 进阶(一) —— 读取appsettings.json
我们以前在Asp.Net MVC中使用 System.Configuration.ConfigurationManager 来读取web.config文件.但是Asp.Net Core MVC已经没有 ...
- ssh的server安装和安装指定版本的软件的方法
ssh程序分为有客户端程序openssh-client和服务端程序openssh-server.如果需要ssh登陆到别的电脑,需要安装openssh-client,该程序ubuntu是默认安装的.而如 ...
- Django-C002-深入模型,到底有多深
此文章完成度[100%]留着以后忘记的回顾.多写多练多思考,我会努力写出有意思的demo,如果知识点有错误.误导,欢迎大家在评论处写下你的感想或者纠错. ORM介绍:对象关系映射(英语:(Object ...
- 初涉树形dp
算是一个……复习以及进阶? 什么是树形dp 树形dp是一种奇妙的dp…… 它的一个重要拓展是和各种树形的数据结构结合,比如说在trie上.自动机上的dp. 而且有些时候还可以拓展到环加外向树.仙人掌上 ...
- Git学习——版本切换
版本回退 回退到前面几个版本的命令如下: git reset --hard HEAD^ //回退到前一个版本 git reset --hard HEAD^^ //回退到前前一个版本 git reset ...
- 【php】 检测 ie ie11 edge浏览器
来源 php.net 官网评论截取 -- Declan kelly Please note that Internet Explorer 11 no longer contains MSIE in i ...
- leepcode(斐波那契数列与float("inf")无穷大)解析
12.加一 给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一. 最高位数字存放在数组的首位, 数组中每个元素只存储一个数字. 你可以假设除了整数 0 之外,这个整数不会以零开头. 示例 ...
- Beautiful Soup 4.2.0 doc_tag、Name、Attributes、多值属性
找到了bs4的中文文档,对昨天爬虫程序里所涉及的bs4库进行学习.这篇代码涉及到tag.Name.Attributes以及多值属性. ''' 对象的种类 Beautiful Soup将复杂HTML文档 ...