【题目链接】

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】作诗的更多相关文章

  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] 作诗

    Link: BZOJ 2821 传送门 Solution: 一道类似区间众数的经典分块 由于个数为偶数这样的条件不能支持快速合并 因此要先$O(n*sqrt(n))$预处理出$pre[i][j]$表示 ...

  4. bzoj 2821 作诗 分块

    基本思路和蒲公英一样 还是预处理出每两个块间的答案 询问时暴力跑两边的贡献 #include<cstdio> #include<cstring> #include<ios ...

  5. BZOJ 2821作诗(Poetize) 分块

    Description 有一个长度为n的序列,序列每个元素的范围[1,c],有m个询问x y,表示区间[x,y]中出现正偶数次的数的种类数. Solution 大力分块解决问题. 把序列分块,f[i] ...

  6. 2821: 作诗(Poetize)

    2821: 作诗(Poetize) Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 1078  Solved: 348[Submit][Status] ...

  7. 【分块】BZOJ2821 作诗(Poetize)

    2821: 作诗(Poetize) Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 3265  Solved: 951[Submit][Status][ ...

  8. 作诗(bzoj 2821)

    Description 神犇SJY虐完HEOI之后给傻×LYD出了一题:SHY是T国的公主,平时的一大爱好是作诗.由于时间紧迫,SHY作完诗 之后还要虐OI,于是SHY找来一篇长度为N的文章,阅读M次 ...

  9. BZOJ2821:作诗——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=2821 问题描述 神犇SJY虐完HEOI之后给傻×LYD出了一题: SHY是T国的公主,平时的一大爱好 ...

  10. 【BZOJ2821】作诗(Poetize) 分块

    Description 神犇SJY虐完HEOI之后给傻×LYD出了一题:SHY是T国的公主,平时的一大爱好是作诗.由于时间紧迫,SHY作完诗之后还要虐OI,于是SHY找来一篇长度为N的文章,阅读M次, ...

随机推荐

  1. Oracle-基本SQL语句

    --添加一个表 create table TestUser ( id int primary key , name varchar(20) , address varchar(20) ) /* *设置 ...

  2. mysql连接出现error node【1045】

    第一步:在my.ini下找到mysqlid.在后边添加skip-grant-tables 第二步:重新启动mysql服务 第三步:重新设置密码 第四步: 将skip-grant-tables删除掉,保 ...

  3. java题(转载)

    1.下面中哪两个可以在A的子类中使用:( ) class A { protected int method1 (int a, int b) { return 0; } } A. public int ...

  4. VFS文件系统结构分析 与socket

    本文乃fireaxe原创,使用GPL发布,可以自由拷贝,转载.但转载请保持文档的完整性,并注明原作者及原链接.内容可任意使用,但对因使用该内容引起的后果不做任何保证. 作者:fireaxe_hq@ho ...

  5. Js中的4个事件

    除了加载文档的事件onload和鼠标相关的一些事件如onclick,onmouseover等.js还有一些相对不常用的事件,这些事件也有各自的应用场景,本文就介绍 onkeydown,oncontex ...

  6. Java中的自动转换

    特点: 1. 系统自动完成的,不需要程序员手动修改代码 2.将 取值范围小的类型 自动提升为 取值范围大的类型 注意: 整数类型直接写会默认为int  小数类型直接写默认为double 类型的范围大小 ...

  7. MyBatis 基础入门

    MyBatis 是一个半自动化的持久层的框架,能让开发者专注SQL本身 JDBC 连接数据库的硬编码问题,通过config,mapper配置文件解决 Mybatis开发需要关注的文件 l POJO类( ...

  8. Jmeter中使用CSV Data Set Config

    A

  9. 06006_redis数据存储类型——String

    1.概述 (1)字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这意味着该类型可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息等: (2)在Redis中 ...

  10. 【codeforces 805C】Find Amir

    [题目链接]:http://codeforces.com/contest/805/problem/C [题意] 你能从任意一个位置i到达任意一个位置j; 花费为(i+j)%(n+1); 问你从任意一个 ...