洛谷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 块的一整段的答案 那么最后答案就是一段区间中几块整段的 ...
随机推荐
- Egret(白鹭引擎)——“TypeError: Cannot read property 'asCom' of null”
前言 相信我,这个错误新手都不陌生:TypeError: Cannot read property 'asCom' of null 还有,一定要看我上一篇,哦不(人家应该是报了这个错,才找到看到这篇文 ...
- mongodb分片集群
第一章 1.mongodb 分片集群解释和目的 一组Mongodb复制集,就是一组mongod进程,这些进程维护同一个数据集合.复制集提供了数据冗余和高等级的可靠性,这是生产部署的基础. 第二章 1. ...
- 小程序swiper组件高度自适应【转载】
最近在做小程序开发,复制官方文档上的swiper组件实测后发现,图片不能自适应.网上找了几个版本测试都发现存在一些小问题,目前这个版本本人实测是最好用的.记录一下,方便日后使用. 感谢原创大神的帮助, ...
- PAT-1010 Radix
1010 Radix (25 分) Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 1 ...
- Web Workers文档
Web Worker为Web内容在后台线程中运行脚本提供了一种简单的方法.线程可以执行任务而不干扰用户界面.此外,他们可以使用XMLHttpRequest执行 I/O (尽管responseXML和 ...
- Redis学习笔记之入门基础知识——五种数据类型
1) 字符串 SET设置值,GET获取值,DEL删除值 INCR key-name将键存储的值加上1 DECR key-name将键存储的值减去1 INCRBY key-name amou ...
- Linux内核分析(第二周)
操作系统是如何工作的? 一.总结:三大法宝 1.存储程序计算机 + 函数调用堆栈 + 中断机制 2.堆栈:C语言程序运行时候必须的一个记录调用路径和参数的空间(函数调用框架/提供局部变量/传递参数/保 ...
- ios UnitTest 学习笔记
一.运行第一个单元测试: 1.在Xcode 5中新建一个工程默认自带一个单元测试的文件夹,IDE自动生成了一个实现XCTestCase的.m文件,里面有一个失败测试(早期版本中实现的是SenTestC ...
- ns3的输入输出奥秘(三) Tracing系统
Tracing系统 (1)ASCII Tracing 还是以myfirst.cc为例子 可以在Simulator::Run()前面加上 AsciiTraceHelper ascii; pointToP ...
- Alpha 冲刺十
团队成员 051601135 岳冠宇 051604103 陈思孝 031602629 刘意晗 031602248 郑智文 031602234 王淇 会议照片 项目燃尽图 项目进展 完善各自部分 项目描 ...