「luogu4135」作诗

传送门

分块好题。

预处理出 \(f[i][j]\) 表示 \(i\) 号块到 \(j\) 号块的答案,\(num[i][k]\) 表示 \(k\) 在前 \(i\) 块的出现次数,暴力预处理,暴力查询,复杂度 \(O(n \sqrt n)\)

参考代码:

#include <algorithm>
#include <cstdio>
#include <cmath>
#define rg register
#define file(x) freopen(x".in", "r", stdin), freopen(x".out", "w", stdout)
using namespace std;
template < class T > inline void read(T& s) {
s = 0; int f = 0; char c = getchar();
while ('0' > c || c > '9') f |= c == '-', c = getchar();
while ('0' <= c && c <= '9') s = s * 10 + c - 48, c = getchar();
s = f ? -s : s;
} const int _ = 1e5 + 10, __ = 318; int n, c, q, a[_], Q[_], cnt[_];
int gap, pos[_], f[__][__], num[__][_]; inline int Query(int l, int r) {
int res;
if (pos[l] == pos[r]) {
res = 0;
for (rg int i = l; i <= r; ++i) {
++cnt[a[i]];
if (cnt[a[i]] != 1) { if (cnt[a[i]] & 1) --res; else ++res; }
}
for (rg int i = l; i <= r; ++i) cnt[a[i]] = 0;
} else {
res = f[pos[l] + 1][pos[r] - 1];
Q[0] = 0;
for (rg int i = l; i <= pos[l] * gap && i <= n; ++i) Q[++Q[0]] = a[i];
for (rg int i = (pos[r] - 1) * gap + 1; i <= r; ++i) Q[++Q[0]] = a[i];
for (rg int i = 1; i <= Q[0]; ++i) {
if (cnt[Q[i]] == 0) {
cnt[Q[i]] = num[pos[r] - 1][Q[i]] - num[pos[l]][Q[i]] + 1;
if (cnt[Q[i]] != 1) { if (cnt[Q[i]] & 1) --res; else ++res; }
} else { ++cnt[Q[i]]; if (cnt[Q[i]] & 1) --res; else ++res; }
}
for (rg int i = 1; i <= Q[0]; ++i) cnt[Q[i]] = 0;
}
return res;
} int main() {
#ifndef ONLINE_JUDGE
file("poetize");
#endif
read(n), read(c), read(q), gap = sqrt(n);
for (rg int i = 1; i <= n; ++i) read(a[i]), pos[i] = (i - 1) / gap + 1;
for (rg int i = 1; i <= pos[n]; ++i) {
for (rg int j = 1; j <= c; ++j) num[i][j] = num[i - 1][j];
for (rg int j = (i - 1) * gap + 1; j <= i * gap; ++j) ++num[i][a[j]];
}
for (rg int i = 1; i <= pos[n]; ++i)
for (rg int j = i; j <= pos[n]; ++j) {
f[i][j] = f[i][j - 1];
for (rg int k = (j - 1) * gap + 1; k <= j * gap; ++k) {
if (cnt[a[k]] == 0) {
cnt[a[k]] = num[j - 1][a[k]] - num[i - 1][a[k]] + 1;
if (cnt[a[k]] != 1) { if (cnt[a[k]] & 1) --f[i][j]; else ++f[i][j]; }
} else { ++cnt[a[k]]; if (cnt[a[k]] & 1) --f[i][j]; else ++f[i][j]; }
}
for (rg int k = (j - 1) * gap + 1; k <= j * gap; ++k) cnt[a[k]] = 0;
}
for (rg int ans = 0, l, r; q--; ) {
read(l), l = (l + ans) % n + 1;
read(r), r = (r + ans) % n + 1;
if (l > r) swap(l, r);
ans = Query(l, r), printf("%d\n", ans);
}
return 0;
}

「luogu4135」作诗的更多相关文章

  1. Solution -「Luogu 4135」作诗

    写在前面 & 前置芝士   好像是好久没有打理 blog 了.感觉上学期是有点颓.嘶,初三了好好冲一次吧.   那么回到这道题目.你会分块就能看懂. 题目大意   先挂个来自洛谷的 link. ...

  2. CH4907 作诗

    题意 4907 作诗 0x49「数据结构进阶」练习 描述 神犇SJY虐完HEOI之后给傻×LYD出了一题:SHY是T国的公主,平时的一大爱好是作诗.由于时间紧迫,SHY作完诗之后还要虐OI,于是SHY ...

  3. FileUpload控件「批次上传 / 多档案同时上传」的范例--以「流水号」产生「变量名称」

    原文出處  http://www.dotblogs.com.tw/mis2000lab/archive/2013/08/19/multiple_fileupload_asp_net_20130819. ...

  4. 「JSOI2018」战争

    「JSOI2018」战争 解题思路 我们需要每次求给一个凸包加上一个向量后是否与另外一个凸包相交,也就是说是否存在 \[ b\in B,(b+w)\in A \] 这里 \(A, B\) 表示凸包内部 ...

  5. 「Sqlserver」数据分析师有理由爱Sqlserver之二-像使用Excel一般地使用Sqlserver

    大家一谈数据库,就觉得非常高深莫测,深不见底,非凡人敢去触摸.但Excel的话,没人敢说自己不会使用吧(相反一大堆人的简历上写着精通OFFICE所有软件套件).换作其他非微软厂商的数据库,的确很容易产 ...

  6. 「Sqlserver」数据分析师有理由爱Sqlserver之九-无利益关系推荐Sqlserver书单

    在前面系列文章的讲述下,部分读者有兴趣进入Sqlserver的世界的话,笔者不太可能在自媒体的载体上给予全方位的带领,最合适的方式是通过系统的书籍来学习,此篇给大家梳理下笔者曾经看过的自觉不错值得推荐 ...

  7. 「Azure」数据分析师有理由爱Azure之一-Azure能带给我们什么?

    前面我们以相同的方式从数据分析师的视角介绍了Sqlserver,本系列亦同样地延续下去,同样是挖掘数据分析师值得使用的Azure云平台的功能.因云平台功能太多,笔者所接触的面也十分有限,有更专业的读者 ...

  8. 「Kafka」Kafka中offset偏移量提交

    在消费Kafka中分区的数据时,我们需要跟踪哪些消息是读取过的.哪些是没有读取过的.这是读取消息不丢失的关键所在. Kafka是通过offset顺序读取事件的.如果一个消费者退出,再重启的时候,它知道 ...

  9. 「JSOI2011」柠檬

    「JSOI2011」柠檬 传送门 斜率优化题. 在优化前,还有一个值得一提的优化: 对于最后的最优分割方案,每一段的两个端点一定是同颜色的,并且作为这一段的 \(s_0\) 证明:如果不作为这一段的 ...

随机推荐

  1. VMware 14 激活密钥

    VMware 14 激活密钥 FF31K-AHZD1-H8ETZ-8WWEZ-WUUVA CV7T2-6WY5Q-48EWP-ZXY7X-QGUWD

  2. [JavaScript] 两个数相除有余数时结果加1

    实现代码 ; ; ?(total/item):(Math.floor(total/item)+); console.log(page)

  3. Tomcat部署Web项目的3种方式

    一.将war包丢进webapps 这是最简单粗暴的方式:将web工程打成war,丢进tomcat/webapps目录即可,tomcat会自动解压.无需修改任何配置文件即可完成部署. 这里我准备了tom ...

  4. 150元搭建微型家庭服务器(支持DLAN,samda,aria2)

    概览 看到有人用树莓派搭家庭服务器,感觉太不值了,300块都可以搭一台性能还可以的低功耗x86主机了,我搭一个100块顶多的服务器玩玩. 0.Linux服务器学习(比虚拟机双系统舒服多了) 1.流媒体 ...

  5. 关于idea2019.2.3版本中文控制台乱码问题

    出现乱码后根据网上找的方法全都试过后还是显示乱码 更改VM Options为        -Dfile.encoding=UTF-8 添加备选字体 更改这两个文件 更改编码格式 以上这些方法全部设置 ...

  6. Java后台技术(TDDL)

    从PC客户端开发转项目经理已经有一段时间了,感觉还不错,平安这边的项目经理还需要对外,所以部门其他项目经理经常需要出差去见客户,我专门对内,部门所有的开发和测试每天做什么.接下来做什么我都必须了解,部 ...

  7. h5页面判断移动端系统为Android或IOS

    最近遇到了一个需求,即所谓的 app+web 混合开发,需要将 h5 内嵌到 APP 中,这个时候因为要对 Android 和 IOS 有不同的处理逻辑,所以我们就需要判断一下,移动端的系统到时是哪一 ...

  8. html 中js 如何给字符串加换行符

    var str = 你好'+"\n"+ '世界'; 这种写法在html中是会被识别为"你好\n世界" 那么如何保证其这么写会被识别,只需要在该div的样式中加入 ...

  9. HDU1024 Max Sum Plus Plus (优化线性dp)

    Now I think you have got an AC in Ignatius.L's "Max Sum" problem. To be a brave ACMer, we ...

  10. 误删/boot下文件或目录的修复方式!

    步骤:进入硬盘的急救模式,进入磁盘,挂载光盘到/media上,rpm安装内核到media目录下,从装grub程序到/dev/sda,然后将grub文件从定向到/boot下,然后重启. 第一步:进入bi ...