【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次, ...
随机推荐
- Oracle-基本SQL语句
--添加一个表 create table TestUser ( id int primary key , name varchar(20) , address varchar(20) ) /* *设置 ...
- mysql连接出现error node【1045】
第一步:在my.ini下找到mysqlid.在后边添加skip-grant-tables 第二步:重新启动mysql服务 第三步:重新设置密码 第四步: 将skip-grant-tables删除掉,保 ...
- java题(转载)
1.下面中哪两个可以在A的子类中使用:( ) class A { protected int method1 (int a, int b) { return 0; } } A. public int ...
- VFS文件系统结构分析 与socket
本文乃fireaxe原创,使用GPL发布,可以自由拷贝,转载.但转载请保持文档的完整性,并注明原作者及原链接.内容可任意使用,但对因使用该内容引起的后果不做任何保证. 作者:fireaxe_hq@ho ...
- Js中的4个事件
除了加载文档的事件onload和鼠标相关的一些事件如onclick,onmouseover等.js还有一些相对不常用的事件,这些事件也有各自的应用场景,本文就介绍 onkeydown,oncontex ...
- Java中的自动转换
特点: 1. 系统自动完成的,不需要程序员手动修改代码 2.将 取值范围小的类型 自动提升为 取值范围大的类型 注意: 整数类型直接写会默认为int 小数类型直接写默认为double 类型的范围大小 ...
- MyBatis 基础入门
MyBatis 是一个半自动化的持久层的框架,能让开发者专注SQL本身 JDBC 连接数据库的硬编码问题,通过config,mapper配置文件解决 Mybatis开发需要关注的文件 l POJO类( ...
- Jmeter中使用CSV Data Set Config
A
- 06006_redis数据存储类型——String
1.概述 (1)字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这意味着该类型可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息等: (2)在Redis中 ...
- 【codeforces 805C】Find Amir
[题目链接]:http://codeforces.com/contest/805/problem/C [题意] 你能从任意一个位置i到达任意一个位置j; 花费为(i+j)%(n+1); 问你从任意一个 ...