【BZOJ 2821】作诗
【题目链接】
https://www.lydsy.com/JudgeOnline/problem.php?id=2821
【算法】
如果不强制在线,显然莫队是可以解决此题的,那么,强制在线怎么办呢? 分块
将这个序列分成sqrt(n)段(sqrt表示开方),预处理每段每个数出现的次数与该段“多少数出现了正偶数次”,就可以在线回答询问了
【代码】
- #include<bits/stdc++.h>
- using namespace std;
- const int MAXN = ;
- const int MAXB = ;
- int i,n,m,c,l,r,x,y,len,block,lastans;
- int a[MAXN],belong[MAXN],cnt[MAXN],L[MAXB],R[MAXB];
- int sum[MAXB][MAXN],ans[MAXB][MAXB];
- inline void init()
- {
- int i,j,k;
- len = (int)sqrt(n);
- block = n / len;
- for (i = ; i <= block; i++)
- {
- L[i] = (i - ) * len + ;
- R[i] = i * len;
- }
- if (R[block] < n)
- {
- block++;
- L[block] = R[block-] + ;
- R[block] = n;
- }
- for (i = ; i <= n; i++) belong[i] = (i - ) / len + ;
- for (i = ; i <= n; i++) sum[belong[i]][a[i]]++;
- for (i = ; i <= block; i++)
- {
- for (j = ; j <= c; j++)
- {
- sum[i][j] += sum[i-][j];
- }
- }
- for (i = ; i <= block; i++)
- {
- for (j = i; j <= block; j++)
- {
- ans[i][j] = ans[i][j-];
- for (k = L[j]; k <= R[j]; k++)
- {
- cnt[a[k]]++;
- if (cnt[a[k]] % == ) ans[i][j]++;
- else if (cnt[a[k]] > ) ans[i][j]--;
- }
- }
- for (j = L[i]; j <= n; j++) cnt[a[j]]--;
- }
- }
- inline int query(int l,int r)
- {
- int i,ret = ,t;
- int p = belong[l],
- q = belong[r];
- if (p == q)
- {
- for (i = l; i <= r; i++)
- {
- cnt[a[i]]++;
- if (cnt[a[i]] % == ) ret++;
- else if (cnt[a[i]] > ) ret--;
- }
- for (i = l; i <= r; i++) cnt[a[i]]--;
- return ret;
- } else
- {
- ret = ans[p+][q-];
- for (i = l; i <= R[p]; i++)
- {
- cnt[a[i]]++;
- t = sum[q-][a[i]] - sum[p][a[i]] + cnt[a[i]];
- if (t % == ) ret++;
- else if (t > ) ret--;
- }
- for (i = L[q]; i <= r; i++)
- {
- cnt[a[i]]++;
- t = sum[q-][a[i]] - sum[p][a[i]] + cnt[a[i]];
- if (t % == ) ret++;
- else if (t > ) ret--;
- }
- for (i = l; i <= R[p]; i++) cnt[a[i]]--;
- for (i = L[q]; i <= r; i++) cnt[a[i]]--;
- return ret;
- }
- }
- int main()
- {
- scanf("%d%d%d",&n,&c,&m);
- for (i = ; i <= n; i++) scanf("%d",&a[i]);
- init();
- lastans = ;
- for (i = ; i <= m; i++)
- {
- scanf("%d%d",&x,&y);
- l = (x + lastans) % n + ;
- r = (y + lastans) % n + ;
- if (l > r) swap(l,r);
- printf("%d\n",lastans = query(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] 作诗
Link: BZOJ 2821 传送门 Solution: 一道类似区间众数的经典分块 由于个数为偶数这样的条件不能支持快速合并 因此要先$O(n*sqrt(n))$预处理出$pre[i][j]$表示 ...
- 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次, ...
随机推荐
- Solr快速入门(一)
概述 本文档介绍了如何获取和运行Solr,将各种数据源收集到多个集合中,以及了解Solr管理和搜索界面. 首先解压缩Solr版本并将工作目录更改为安装Solr的子目录.请注意,基本目录名称可能随Sol ...
- SqlServer显示“正在还原...”
还原数据库时,提示还原成功,但是数据库一直显示“正在还原...”的状态. 可以通过执行以下命令即可 RESTORE DATABASE DB_NAME WITH RECOVERY 原因: 关于recov ...
- 用 Swift 开发一个 TODO 应用
背景 相信不少 iOS 程序员对于 Swift 依旧持以观望的态度,一来是这小家伙刚出来没几天,本身还处于完善的阶段:二来是学习的成本较高,看完官方文档怎么也要个几天的时间:三来是反正最近几年很难在工 ...
- 利用a链接发送电子邮件
实例代码: <a href="mailto:name1@rapidtables.com?cc=name2@rapidtables.com&subject=你好%20我是&quo ...
- 第五周课后作业——适用于人工智能的visual studio 的创新分析
个人觉得作业布置的(2)(3)(4)(5)的顺序并不合理,我将以(5)(2)(3)(4)的顺序开展我的分析. 创新的定义是做出一些改变或创造出新的东西,既是过程,也是结果.这是一个很泛的概念,所以去问 ...
- Module, Package in Python
1.To put it simple, Module是写好的一系列函数或变量,文件以.py为后缀,可以在其他Module中整体或部分引用. PS: 在Module中[结尾或开头]加入if __name ...
- python 编码问题解决方案
1.UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128) ...
- root密码忘记怎么办?
忘记root密码:按 e进入内核在按e,后面加1 .按b启动 进入命令行输入passwd,设置新的密码后exit退出即可
- Windows平台上使用ANT编译Hadoop Eclipse Plugin
一.准备工作: 1.安装JDK 下载页面:http://www.oracle.com/technetwork/java/javase/downloads/index.html JDK6,JDK7都 ...
- RxSwift學習教程之基礎篇
前言 我們在 iOS 開發過程中,幾乎無時無刻都要面對異步事件的處理.例如,按鍵點擊.數據保存..音頻後臺播放.交互動畫展示.這些事件並不具備特定時序性,甚至它們可能同時發生. 雖然 Apple 提供 ...