Description

有一个长度为n的序列,序列每个元素的范围[1,c],有m个询问x y,表示区间[x,y]中出现正偶数次的数的种类数。

Solution

大力分块解决问题。

把序列分块,f[i][j]表示第i块到第j块的答案,并记录块的前缀数的出现次数。

f[i][j]直接暴力算,块的前缀数的出现次数也可以直接算,都是nsqrt(n)。

遇到询问x y,中间答案的块可以直接统计,然后再暴力统计左右两边零碎的贡献,也是nsqrt(n)。

Code

 #include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath> using namespace std; #define REP(i, a, b) for (int i = (a), i##_end_ = (b); i <= i##_end_; ++i)
const int maxn = 1e5+;
int n, c, m, a[maxn];
int bel[maxn], l[maxn], r[maxn];
int cnt[][maxn], s_block, t[maxn], f[][]; int solve(int x, int y)
{
int L = bel[x], R = bel[y];
if (L == R)
{
REP(i, x, y) t[a[i]] = ;
int ret = ;
REP(i, x, y) if (t[a[i]] ++) ret += (t[a[i]]&) ? - : ;
return ret;
}
else
{
int ret = f[L+][R-];
REP(i, x, r[L]) t[a[i]] = ;
REP(i, l[R], y) t[a[i]] = ;
REP(i, x, r[L]) if (!t[a[i]]) t[a[i]] = cnt[R-][a[i]]-cnt[L][a[i]];
REP(i, l[R], y) if (!t[a[i]]) t[a[i]] = cnt[R-][a[i]]-cnt[L][a[i]];
REP(i, x, r[L]) if (t[a[i]] ++) ret += (t[a[i]]&) ? - : ;
REP(i, l[R], y) if (t[a[i]] ++) ret += (t[a[i]]&) ? - : ;
return ret;
}
} int main()
{
scanf("%d %d %d", &n, &c, &m);
REP(i, , n) scanf("%d", &a[i]);
int block = int(sqrt(n));
REP(i, , n)
{
bel[i] = i/block+, r[bel[i]] = i;
if (i == || bel[i] != bel[i-]) l[bel[i]] = i;
}
s_block = n/block+;
REP(i, , s_block)
{
REP(j, , c) t[j] = ;
REP(j, i, s_block)
{
f[i][j] = (j == i) ? : f[i][j-];
REP(k, l[j], r[j]) if (t[a[k]] ++) f[i][j] += (t[a[k]]&) ? - : ;
}
}
REP(i, , s_block)
{
REP(j, , c) cnt[i][j] = cnt[i-][j];
REP(j, l[i], r[i]) cnt[i][a[j]] ++;
}
int x, y, ans = ;
while (m --)
{
scanf("%d %d", &x, &y);
x = (x+ans)%n+, y = (y+ans)%n+;
if (x > y) swap(x, y);
printf("%d\n", ans = solve(x, y));
}
return ;
}

BZOJ 2821作诗(Poetize) 分块的更多相关文章

  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. 2821: 作诗(Poetize)

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

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

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

  5. [BZOJ 2821] 作诗

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

  6. bzoj 2821 作诗 分块

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

  7. BZOJ2821 作诗(Poetize) 分块

    题意 算法 经验总结 代码 题意 不带修改,查询数列[1,n]中[l,r]内的出现正偶数次的数的个数, 数列中的数 <= 1e5, n <= 1e5, 强制在线 算法 ​ 查询的内容: 区 ...

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

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

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

    BZOJ2821 作诗(Poetize) Description 神犇SJY虐完HEOI之后给傻×LYD出了一题: SHY是T国的公主,平时的一大爱好是作诗. 由于时间紧迫,SHY作完诗之后还要虐OI ...

随机推荐

  1. JAVA记录-Servlet RequestDispatcher请求转发

    RequestDispatcher接口提供将请求转发送到另一个资源的功能,它可能是html,servlet或jsp等. 此接口也可用于包括另一资源的内容.它是servlet协作的一种方式. 在Requ ...

  2. MySql与对应的Java的时间类型

    MySql的时间类型有          Java中与之对应的时间类型date                                           java.sql.Date Date ...

  3. CSS规范 - 优化方案--(来自网易)

    值缩写 缩写值可以减少CSS文件大小,并增加可读性和可维护性. 但并非所有的值都必须缩写,因为当一个属性的值缩写时,总是会将所有项都设置一遍,而有时候我们不希望设置值里的某些项. /* 比如我们用下面 ...

  4. BZOJ1009 GT考试

    1009: [HNOI2008]GT考试 Time Limit: 1 Sec  Memory Limit: 162 MB Description 阿申准备报名参加GT考试,准考证号为N位数X1X2.. ...

  5. 如何用Procmon.exe来监视SQLSERVER的logwrite大小

    如何用Procmon.exe来监视SQLSERVER的logwrite大小 在微软亚太区数据库技术支持组官方博客里面,你会发现很多篇文章都用到了Procmon.exe这个工具 今天我也介绍一下这个工具 ...

  6. 爬虫笔记之自如房屋价格图片识别(价格字段css背景图片偏移显示)

    一.前言 自如房屋详情页的价格字段用图片显示,特此破解一下以丰富一下爬虫笔记系列博文集. 二.分析 & 实现 先打开一个房屋详情页观察一下: 网页的源代码中没有直接显示价格字段,价格的显示是使 ...

  7. Spark笔记之使用UDF(User Define Function)

    一.UDF介绍 UDF(User Define Function),即用户自定义函数,Spark的官方文档中没有对UDF做过多介绍,猜想可能是认为比较简单吧. 几乎所有sql数据库的实现都为用户提供了 ...

  8. (FFT) A * B Problem Plus

    题目链接:https://cn.vjudge.net/contest/280041#problem/F 题目大意:给你两个数,求这俩数相乘的结果.(长度最长5000) 具体思路:硬算肯定是不行的,比如 ...

  9. Nuts & Bolts Problem

    Given a set of n nuts of different sizes and n bolts of different sizes. There is a one-one mapping ...

  10. Python的CGI编程实现-通过接口运行服务器py脚本

    yum 安装apcche [apache]yum 安装Apache(Centos 6.9) https://www.cnblogs.com/lauren1003/p/5993654.html只需一行命 ...