洛谷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 块的一整段的答案 那么最后答案就是一段区间中几块整段的 ...
随机推荐
- NetWork——描述一次完整的网络请求过程
台根DNS,根DNS服务器收到请求后会返回负责这个域名(.net)的服务器的一个IP,本地DNS服务器使用该IP信息联系负责.net域的这台服务器.这台负责.net域的服务器收到请求后,如果自己无法解 ...
- Hadoop日记Day7---HDFS的WED端口
HDFS 对外提供了可供访问的http server,开放了很多端口,下面介绍常用的几个端口(http://hadoop:……). 一.50070 端口,查看NameNode 状态,如图1.1所示. ...
- python常用算法实现
排序是计算机语言需要实现的基本算法之一,有序的数据结构会带来效率上的极大提升. 1.插入排序 插入排序默认当前被插入的序列是有序的,新元素插入到应该插入的位置,使得新序列仍然有序. def inser ...
- 大白话说Java泛型:入门、使用、原理
文章首发于[博客园-陈树义],点击跳转到原文<大白话说Java泛型:入门.使用.原理> 远在 JDK 1.4 版本的时候,那时候是没有泛型的概念的.当时 Java 程序员们写集合类的代码都 ...
- 拥抱函数式编程 I - 基本概念
函数编程与命令性编程 为支持使用纯函数方法解决问题,特此创建了函数编程范例. 函数编程是一种声明性编程形式.相比之下,大多数主流语言,包括面向对象的编程 (OOP) 语言(如 C#.Visual Ba ...
- mysql学习(4)python操作数据库
整理了一下前面3期学的内容后,现在练习使用python去操作数据库 #!python3# coding:utf-8import pymysqlclass mysql_option(): def __i ...
- Final发布 视频展示
1.视频链接 视频地址:http://v.youku.com/v_show/id_XMzk1OTYyNjE0NA==.html?spm=a2hzp.8244740.0.0 杨老师粉丝群——弹球学成语项 ...
- 软件工程 BUAAMOOC项目Postmortem结果
设想和目标 1.我们的软件要解决什么问题?是否定义的很清楚?是否对典型用户和典型场景有清晰的描述? 我们的软件是基于北航MOOC网站做的Android手机客户端,用于便捷的在学校里通过手机做到随时随地 ...
- Linux内核分析 读书笔记 (第一章、第二章)
第一章 Linux内核简介 1.1 Unix的历史 Unix很简洁,仅仅提供几百个系统调用并且有一个非常明确的设计目的. 在Unix中,所有东西都被当做文件,这种抽象使对数据和对设备的操作是通过一套相 ...
- Python 安装 imread报错
看到一篇博客才解决 http://blog.csdn.net/u010480899/article/details/52701025