「luogu4135」作诗

「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;
}

原文地址:https://www.cnblogs.com/zsbzsb/p/12231587.html

时间: 2024-10-09 13:15:44

「luogu4135」作诗的相关文章

程序员「奇葩」说

一直以来「奇葩」这个词都是偏贬义的,直到去年有个综艺节目叫「奇葩说」挺热闹,这里的人不一定是奇葩,更多指达人的意思. 「奇葩说」里的达人都是能说会道的,我的主业是程序员,所以只能写写在我职业生涯中碰到的一些「奇葩」程序员. 你懂的,我这里的「奇葩」没有任何贬义的意思. 月在胸襟人在途 我刚入行时的第一位项目经理,70后.那年三十出头,在银行客户现场做项目经理,负责一个二十来人的客户现场团队. 虽然他的职位是项目经理,但实际那时他真是一名地道的资深程序员. 70 后的程序员大都是从写 C 开始的,

大数据和「数据挖掘」是何关系?---来自知乎

知乎用户,互联网 244 人赞同 在我读数据挖掘方向研究生的时候:如果要描述数据量非常大,我们用Massive Data(海量数据)如果要描述数据非常多样,我们用Heterogeneous Data(异构数据)如果要描述数据既多样,又量大,我们用Massive Heterogeneous Data(海量异构数据)--如果要申请基金忽悠一笔钱,我们用Big Data(大数据) 编辑于 2014-02-2817 条评论感谢 收藏没有帮助举报作者保留权利 刘知远,NLPer 4 人赞同 我觉得 大数据

开放的智力8:实用「成功学」

可实现的「成功学」 现在我想为这里的年轻人介绍一种可实现的「成功学」.希望这个我自创的理论,可以改变很多人的一生. 当我们评价一个事情值不值得去做.应该花多少精力去做的时候,应该抛弃单一的视角,而是分两个不同的维度来看,一是该事件将给我带来的收益大小(认知.情感.物质.身体方面的收益皆可计入),即「收益值」:二是该收益随时间衰减的速度,我称为「收益半衰期」,半衰期长的事件,对我们的影响会持续得较久较长. 这两个维度正交以后就形成了一个四象限图.我们生活.学习和工作中的所有事情都可以放进这个图里面

技术人员应对「考核」的一些思考

来这个公司实习已经半年多了,在年前经历了一次年终考核,最终对我的工作的评级是 C(及格-符合当前职位的工作),让我不禁思考自己在项目中的一些工作的问题,为什么我是C?是我做的不够好吗?或者说在哪里做的不够好? 从考核流程来看,基本上是 CTO 与 Team Leader 对团队成员的「年终总结与次年工作计划」进行Rank,个人狭义的认为「考核」的主要支持材料就是这个总结了. 他山之石 其他公司是怎么考核的呢?说实话我也不太清楚,刚入行,只能通过搜索了解,在网上了解到有以下几种:发精品博客.发论文

大數據的「真面目」及其運用

大數據的定義 近年來,人們對「大數據」的關注度日益提高.這都歸因於麥肯錫全球研究院在2011年發布的研究報告.該報告認為人們即將迎來一個利用規模大到超出現有數據處理系統能力的巨量信息時代,並暗示戰略性地利用這些信息數據,就有可能產生巨大的商業機會. 那麼大數據到底是什麼呢?從字面來看,它指的是以現有信息處理技術無法應對的龐大信息量.而實際上,當我們將儲蓄了各種服務的使用信息數據與用戶的屬性信息相結合,並在這些信息數據發生時能夠全量獲取,就被稱做大數據. 典型的是互聯網服務的利用數據.另外還包括零

分布式系统「伸缩性」大招之——「水平&amp;垂直切分」详解

如果第二次看到我的文章,欢迎右侧扫码订阅我哟~  ?? 本文长度为5389字,建议阅读14分钟. 坚持原创,每一篇都是用心之作- 没想到这篇文章写了这么长,一时半会没消化完的话,可以收藏一下先. 这是「伸缩性」章节的第四篇,先给新来的小伙伴们简单回顾下前三篇的内容. 做「伸缩性」最重要的就是先做好「无状态」,如此才可以随心所欲的进行横向“扩展”,而不用担心在多个副本之间切换会产生错乱.<分布式系统关注点——「无状态」详解>聊的就是这个. 不过,就算做好了横向扩展,本质上还是一个“大程序”,只是

「02」《机器学习经&amp;#183;天工开物篇》

上期导读:机器学习,到底在学些什么? 起源 故事要从上古神器差分机说起. 从古至今,所有的算法修炼和真气推演记录,全部要靠门派里的外门弟子手写,工序繁杂不说,还耗时良久,导致各大门派的修炼进度一直提不上来. 直到两百年前,神器大师查尔斯·巴贝奇开始了差分机的设计和制造,在后续大师的不断改良之后,终于实现了从真气计算到密文印刷的过程全部自动化,这样还可以避免人为误差,在那个时候,这是一个非常开创性的想法. ? 差分机使用有限差分法来机器计算多项式函数(一种真气运转模式)的值.有限差分方法是个简单但

各大媒体对「木兰」编程语言的不当言论盘点

在下一介草民,与以下媒体.组织.当事人素昧平生.只是有幸在关于「木兰」编程语言的新闻发表的第一时间看到,就在某论坛提问"「木兰」编程语言有什么特色?",其中不少网友回复被之后各种媒体引用. 自那之后目睹各大媒体针对「木兰」编程语言的报道,其中不乏从技术角度看非常不严谨甚至有极大误导性的言论.在此作一盘点. 不才对编程语言领域仅略知皮毛,在十年前计算机硕士阶段修了几门相关入门课程.如有谬误请不吝赐教. 中科院声明 2020 年 1 月 19 日,中科院计算所发布<关于"木

「JSOI2011」汇总

「JSOI2011」柠檬 斜率优化题. 在优化前,还有一个值得一提的优化: 对于最后的最有分割方案,每一段的两个端点一定是同颜色的,并且作为这一段的 \(s_0\) 证明:如果不作为这一段的 \(s_0\),那么它显然没有贡献,把这一个单独分出来显然更优,直到最后两个端点就一定都是 \(s_0\) ,颜色相同. 那么我们只需要从之前和该点种类相同的位置进行转移即可. 这样就从直接枚举的复杂度 \(O(n^3)\) 优化到了 \(O(n^2)\) ,但还是不够,继续考虑优化. 我们先把转移方程写出