题意:[l,r]之间有多少个数出现了正偶数次。强制在线。

解:第一眼想到莫队,然后发现强制在线...分块吧。

有个很朴素的想法就是蒲公英那题的套路,做每块前缀和的桶。

然后发现这题空间128M,数组大小我的是133M......看到有人卡到了122M,但是我又不想冒险,就换写法了。(题解里全是空间n1.5的...)

那就用蒲公英的另一个套路吧。。。vector + 二分。

预处理出每两个块之间的答案,然后查询的时候对边角扫一遍,每个数vector二分,求得出现几次,统计答案。

这样一来块大小是(n/logn)0.5的,然后交上去发现T成10分...自闭了。

YY出了个做法,每个数维护是第几个出现的该数值的数,然后发现对于某种数值只出现在一边边角的话,不会处理,又只会vector了...虽然还可以值域分块做到log(n0.5),但是感觉上没啥太大优化,懒得写了...

把之前的10分代码玄学调了一波块大小,然后吸氧,居然A了。。。。。。自闭了。

 // luogu-judger-enable-o2
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cmath> const int N = ; int bin[N], a[N], sum[][], n, lm, le[N], re[N], fr[N];
std::vector<int> v[N];
bool vis[N]; inline void read(int &x) {
x = ;
char c = getchar();
while(c < '' || c > '') {
c = getchar();
}
while(c >= '' && c <= '') {
x = (x << ) + (x << ) + c - ;
c = getchar();
}
return;
} inline int getTime(int x, int y, int c) {
if(x > y) {
return ;
}
x = std::lower_bound(v[c].begin(), v[c].end(), x) - v[c].begin();
y = std::upper_bound(v[c].begin(), v[c].end(), y) - v[c].begin() - ;
return y - x + ;
} inline int ask(int x, int y) {
int l = fr[x], r = fr[y], ans = ;
if(l == r) {
for(int k = x; k <= y; k++) {
if(bin[a[k]]) {
bin[a[k]] & ? ans++ : ans--;
}
bin[a[k]]++;
}
for(int k = x; k <= y; k++) {
bin[a[k]]--;
}
return ans;
}
for(int k = x; k <= re[l]; k++) {
bin[a[k]]++;
}
for(int k = le[r]; k <= y; k++) {
bin[a[k]]++;
}
for(int k = x; k <= re[l]; k++) {
if(vis[a[k]]) {
continue;
}
vis[a[k]] = ;
if(bin[a[k]] & ) {
int t = getTime(le[l + ], re[r - ], a[k]);
if(t) {
ans += t & ? : -;
}
}
else {
ans += getTime(le[l + ], re[r - ], a[k]) == ;
}
}
for(int k = le[r]; k <= y; k++) {
if(vis[a[k]]) {
continue;
}
vis[a[k]] = ;
if(bin[a[k]] & ) {
int t = getTime(le[l + ], re[r - ], a[k]);
if(t) {
ans += t & ? : -;
}
}
else {
ans += getTime(le[l + ], re[r - ], a[k]) == ;
}
}
for(int k = x; k <= re[l]; k++) {
vis[a[k]] = ;
bin[a[k]]--;
}
for(int k = le[r]; k <= y; k++) {
vis[a[k]] = ;
bin[a[k]]--;
}
return ans + sum[l + ][r - ];
} int main() {
int m;
read(n);
read(lm);
read(m);
int T = sqrt((double)(n) / log2(n) * );
for(int i = ; i <= n; i++) {
read(a[i]);
v[a[i]].push_back(i);
fr[i] = (i - ) / T + ;
}
// prework
for(int i = ; i <= fr[n]; i++) {
le[i] = re[i - ] + ;
re[i] = le[i] + T - ;
if(i == fr[n]) {
re[i] = n;
}
} for(int l = ; l <= fr[n]; l++) {
int ans = ;
for(int r = l; r <= fr[n]; r++) {
for(int k = le[r]; k <= re[r]; k++) {
if(bin[a[k]]) {
bin[a[k]] & ? ans++ : ans--;
}
bin[a[k]]++;
}
sum[l][r] = ans;
}
for(int k = le[l]; k <= n; k++) {
bin[a[k]]--;
}
} int lastans = ;
for(int i = , x, y; i <= m; i++) {
read(x);
read(y);
x = (x + lastans) % n + ;
y = (y + lastans) % n + ;
if(x > y) {
std::swap(x, y);
}
lastans = ask(x, y);
printf("%d\n", lastans);
} return ;
}

AC代码

udpate:其实可以删去只出现一次的数。不过恶意卡的话没啥优化效果。

洛谷P4135 作诗的更多相关文章

  1. 洛谷P4135 作诗 (分块)

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

  2. 洛谷 P4135 作诗 题解

    题面. 之前做过一道很类似的题目 洛谷P4168蒲公英 ,然后看到这题很快就想到了解法,做完这题可以对比一下,真的很像. 题目要求区间内出现次数为正偶数的数字的数量. 数据范围1e5,可以分块. 我们 ...

  3. 洛谷 P4135 作诗

    分块大暴力,跟区间众数基本一样 #pragma GCC optimize(3) #include<cstdio> #include<algorithm> #include< ...

  4. 洛谷 P4135 作诗(分块)

    题目链接 题意:\(n\) 个数,每个数都在 \([1,c]\) 中,\(m\) 次询问,每次问在 \([l,r]\) 中有多少个数出现偶数次.强制在线. \(1 \leq n,m,c \leq 10 ...

  5. 洛谷P4135 作诗(不一样的分块)

    题面 给定一个长度为 n n n 的整数序列 A A A ,序列中每个数在 [ 1 , c ] [1,c] [1,c] 范围内.有 m m m 次询问,每次询问查询一个区间 [ l , r ] [l, ...

  6. 洛谷P4135 Ynoi2016 掉进兔子洞 (带权bitset?/bitset优化莫队 模板) 题解

    题面. 看到这道题,我第一反应就是莫队. 我甚至也猜出了把所有询问的三个区间压到一起处理然后分别计算对应询问答案. 但是,这么复杂的贡献用什么东西存?难道要开一个数组 query_appear_tim ...

  7. P4135 作诗——分块

    题目:https://www.luogu.org/problemnew/show/P4135 分块大法: 块之间记录答案,每一块记录次数前缀和: 注意每次把桶中需要用到位置赋值就好了: 为什么加了特判 ...

  8. luogu P4135 作诗

    嘟嘟嘟 郑重声明:我的前几到分块题写法上都有点小毛病,以这篇为主! 这道题感觉也是分块的基本套路,只不过卡常,得开氧气. 维护俩:sum[i][j]表示前 i 块中,数字 j 出现了多少次,ans[i ...

  9. P4135 作诗

    传送门 分块 设sum[ i ] [ j ] 存从左边到第 i 块时,数字 j 的出现次数 f [ i ] [ j ] 存从第 i 块,到第 j 块的一整段的答案 那么最后答案就是一段区间中几块整段的 ...

随机推荐

  1. QQ 的一些URI 协议命令

    //System.Diagnostics.Process.Start(@"C:\Program Files\Tencent\TIM\Bin\Timwp.exe", "te ...

  2. 20155227《网络对抗》Exp4 恶意代码分析

    20155227<网络对抗>Exp4 恶意代码分析 实践目标 1.是监控你自己系统的运行状态,看有没有可疑的程序在运行. 2.是分析一个恶意软件,就分析Exp2或Exp3中生成后门软件:分 ...

  3. HW 2017 12 17可禾大佬神题

    好不容易搞来的题目,不写一写怎么行呢. 不过难度真心不高(一小时K掉),都是老题+暴力题,没有欧洲玄学. 再说一句,这试卷是叶可禾出的吧. T1 好老的题目,看到有多组数据我还怕了,以为有更流弊的算法 ...

  4. [SPOJ2939]Qtree5

    [SPOJ2939]Qtree5 Tags:题解 题意 链接 给你\(n\)个节点的黑白树,初始全黑.每次可以翻转某点颜色,或查询距离某点最近的白点的距离.\(n\le 10^5\).强制LCT,不准 ...

  5. C++ 字符串, 数字 相互转化

    1: strL.Format("%x", 12); //将数字12转换成,16进制字符(C),存于strL 2: strH.Format("%x",12); / ...

  6. jmeter分布式压力测试之添加压力机

    前提:多台电脑可以互相ping通 1.jmeter的bin目录下的jmeter.properties配置文件里面remote_hosts添加测试机的 IP:端口号,用英文“,”逗号间隔例如:remot ...

  7. package.json 中 npm 依赖包版本前的符号的意义

    版本的格式 major.minor.patch:主版本号.次版本号.修补版本号 patch:修复bug,兼容老版本 minor:新增功能,兼容老版本 major:新增功能,不兼容老版本 version ...

  8. Deferred Shading 延迟着色(翻译)

    原文地址:https://en.wikipedia.org/wiki/Deferred_shading 在3D计算机图形学领域,deferred shading 是一种屏幕空间着色技术.它被称为Def ...

  9. oracle创建用户和角色、管理授权以及表空间操作

    show user 显示当前用户connect username/password@datebasename as sysdba 切换用户和数据库 和用户身份 Oracle登录身份有三种: norma ...

  10. Windows下fabric sdk连接Linux上fabric网络的调试过程

    上个月刚入职一家公司从事区块链研发工作,选型采用Hyperledger Fabric作为开发平台.团队的小组成员全部采用的是在VirtualBox上面安装桌面版的Ubuntu 16.04虚拟机,开发工 ...