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. CF&&CC百套计划4 Codeforces Round #276 (Div. 1) A. Bits

    http://codeforces.com/contest/484/problem/A 题意: 询问[a,b]中二进制位1最多且最小的数 贪心,假设开始每一位都是1 从高位i开始枚举, 如果当前数&g ...

  2. Java SpringMVC框架学习(二)httpServeltRequest和Model传值的区别

    HttpServletRequest 为什么大多程序在controller中给jsp传值时使用model.addAttribute()而不使用httpServeletRequest.setAttrib ...

  3. 【NOI】2017 整数(BZOJ 4942,LOJ2302) 压位+线段树

    [题目]#2302. 「NOI2017」整数 [题意]有一个整数x,一开始为0.n次操作,加上a*2^b,或询问2^k位是0或1.\(n \leq 10^6,|a| \leq 10^9,0 \leq ...

  4. 洛谷 P1609 最小回文数 题解

    这题其实并不难,重点在你对回文数的了解,根本就不需要高精度. 打个比方: 对于一个形如 ABCDEFGH 的整数 有且仅有一个比它大的最小回文数 有且仅有一个比它小的最大回文数 而整数 ABCDDCB ...

  5. Wordpress页脚

    <?php /** * The template for displaying the footer */ ?> <?php if ( apply_filters( 'show_fl ...

  6. 利用gcc自带的功能-fstack-protector检测栈溢出及其实现【转】

    转自:https://www.cnblogs.com/leo0000/p/5719186.html 最近又遇到了一个崩溃,栈回溯非常怪异. /lib/i386-linux-gnu/libc.so.6( ...

  7. 内存对齐与ANSI C中struct型数据的内存布局 【转】

    转自:http://blog.chinaunix.net/uid-25909619-id-3032209.html 当在C中定义了一个结构类型时,它的大小是否等于各字段(field)大小之和?编译器将 ...

  8. shell函数中eof报错(warning: here-document at line 9 delimited by end-of-file (wanted `EOF'))

    在shell编写函数时,函数中有eof和EOF,如果是在sublime编写按照格式tab缩进会有以下报错 解决办法: 取消函数中的tab缩进,在运行即可

  9. php正则字符串提取汉字

    /*$str 为输入.输出字符串变量*/ preg_match_all('/[\x{4e00}-\x{9fff}]+/u', $str, $matches); $str = join('', $mat ...

  10. CMD命令行下修改网络IP设置的方法

    1.全自动修改网络地址: 复制代码 代码如下: @echo off netsh interface ip set address name="本地连接" static 192.16 ...