洛谷P4135 作诗
题意:[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 作诗的更多相关文章
- 洛谷P4135 作诗 (分块)
洛谷P4135 作诗 题目描述 神犇SJY虐完HEOI之后给傻×LYD出了一题: SHY是T国的公主,平时的一大爱好是作诗. 由于时间紧迫,SHY作完诗之后还要虐OI,于是SHY找来一篇长度为N的文章 ...
- 洛谷 P4135 作诗 题解
题面. 之前做过一道很类似的题目 洛谷P4168蒲公英 ,然后看到这题很快就想到了解法,做完这题可以对比一下,真的很像. 题目要求区间内出现次数为正偶数的数字的数量. 数据范围1e5,可以分块. 我们 ...
- 洛谷 P4135 作诗
分块大暴力,跟区间众数基本一样 #pragma GCC optimize(3) #include<cstdio> #include<algorithm> #include< ...
- 洛谷 P4135 作诗(分块)
题目链接 题意:\(n\) 个数,每个数都在 \([1,c]\) 中,\(m\) 次询问,每次问在 \([l,r]\) 中有多少个数出现偶数次.强制在线. \(1 \leq n,m,c \leq 10 ...
- 洛谷P4135 作诗(不一样的分块)
题面 给定一个长度为 n n n 的整数序列 A A A ,序列中每个数在 [ 1 , c ] [1,c] [1,c] 范围内.有 m m m 次询问,每次询问查询一个区间 [ l , r ] [l, ...
- 洛谷P4135 Ynoi2016 掉进兔子洞 (带权bitset?/bitset优化莫队 模板) 题解
题面. 看到这道题,我第一反应就是莫队. 我甚至也猜出了把所有询问的三个区间压到一起处理然后分别计算对应询问答案. 但是,这么复杂的贡献用什么东西存?难道要开一个数组 query_appear_tim ...
- P4135 作诗——分块
题目:https://www.luogu.org/problemnew/show/P4135 分块大法: 块之间记录答案,每一块记录次数前缀和: 注意每次把桶中需要用到位置赋值就好了: 为什么加了特判 ...
- luogu P4135 作诗
嘟嘟嘟 郑重声明:我的前几到分块题写法上都有点小毛病,以这篇为主! 这道题感觉也是分块的基本套路,只不过卡常,得开氧气. 维护俩:sum[i][j]表示前 i 块中,数字 j 出现了多少次,ans[i ...
- P4135 作诗
传送门 分块 设sum[ i ] [ j ] 存从左边到第 i 块时,数字 j 的出现次数 f [ i ] [ j ] 存从第 i 块,到第 j 块的一整段的答案 那么最后答案就是一段区间中几块整段的 ...
随机推荐
- # 2017-2018-2 20155319『网络对抗技术』Exp7:网络欺诈防范
2017-2018-2 20155319『网络对抗技术』Exp7:网络欺诈防范 一.原理与实践说明 1.实践目标 本实践的目标是:理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法. 2. ...
- 矩阵乘法&&矩阵快速幂&&最基本的矩阵模型——斐波那契数列
矩阵,一个神奇又令人崩溃的东西,常常用来优化序列递推 在百度百科中,矩阵的定义: 在数学中,矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合 ,最早来自于方程组的系数及常数所构成的方阵.这一 ...
- Number.toString SyntaxError
问题分析 问题 20.toString(); VM163:1 Uncaught SyntaxError: Invalid or unexpected token 分析 "."号的原 ...
- ElasticSearch查询 第一篇:搜索API
<ElasticSearch查询>目录导航: ElasticSearch查询 第一篇:搜索API ElasticSearch查询 第二篇:文档更新 ElasticSearch查询 第三篇: ...
- 一个Python开源项目-腾讯哈勃沙箱源码剖析(上)
前言 2019年来了,2020年还会远吗? 请把下一年的年终奖发一下,谢谢... 回顾逝去的2018年,最大的改变是从一名学生变成了一位工作者,不敢说自己多么的职业化,但是正在努力往那个方向走. 以前 ...
- Express模版引擎hbs备忘
最近几天折腾了下express,想找个合适的模版引擎,下面是一些折腾过程的备忘 选择标准 选择一门模版语言时,可能会考虑的几点 语法友好(micro tmpl那种语法真是够了) 支持模版嵌套(子模版的 ...
- npm install —— 从一个简单例子,看本地安装与全局安装的区别
npm的包安装分为本地安装(local).全局安装(global)两种,从敲的命令行来看,差别只是有没有-g而已,比如 npm install grunt # 本地安装 npm install -g ...
- 贪心Crossing river
英文题目: A group of N people wishes to go across a river with only one boat, which can at most carry tw ...
- (转)Unity内建图标列表
用法 Gizmos.DrawIcon(transform.position, "PointLight Gizmo"); UnityEditor.EditorGUIUtility.F ...
- DRF框架QQ登录功能
用户模块---QQ登录 流程图 QQ登录文档:http://wiki.connect.qq.com/%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C_oauth2-0 流程简述 ...