首页 > 其他分享 >「解题报告」CF643G Choosing Ads

「解题报告」CF643G Choosing Ads

时间:2023-04-30 15:33:35浏览次数:33  
标签:frac Ads int mid CF643G Choosing rc query struct

很有趣的一道题。

首先令 \(p \gets \lfloor\frac{p}{100}\rfloor\),那么我们可以把问题转化成求出所有出现次数 \(\ge \frac{n}{p + 1}\) 的至多 \(p\) 个数。

考虑 \(p=1\) 的时候,发现这个问题就是一个主元素的问题,而区间主元素有经典的摩尔投票合并法。考虑将这个做法进行拓展。

考虑摩尔投票法的本质,实际上是每次将两个不相等的数配对删去,然后最后仅会剩下一个数。那么考虑直接拓展为每次将 \(p+1\) 个不相等的数删去,然后剩下至多 \(p\) 个数。

正确性:这样至多配对 \(\lfloor\frac{n}{p + 1}\rfloor\) 次,那么对于所有出现次数大于 \(\frac{n}{p}\) 的数,最坏情况下也会有剩余(\(\lfloor\frac{n}{p + 1}\rfloor \le \frac{n}{p}\)),所以这样一定能够留下所有出现次数大于 \(\frac{n}{p}\) 的数。那么直接线段树上维护这个过程就做完了。区间修改很容易实现。

我写的实现比较丑,精细实现一下能够做到 \(O(np \log n)\),合并过程我直接无脑 \(O(p^2)\) 合并了,反正 \(p\le 5\)。

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 150005;
int n, m, p;
int a[MAXN];
struct SegmentTree {
    struct Value {
        int v[5], c[5];
    };
    struct Node {
        Value val;
        int tag, len;
    } t[MAXN << 2];
#define lc (i << 1)
#define rc (i << 1 | 1)
    void tag(int i, int x) {
        t[i].val.v[0] = x, t[i].val.c[0] = t[i].len;
        for (int j = 1; j < p; j++) {
            t[i].val.v[j] = t[i].val.c[j] = 0;
        }
        t[i].tag = x;
    }
    void pushDown(int i) {
        if (t[i].tag) {
            tag(lc, t[i].tag);
            tag(rc, t[i].tag);
            t[i].tag = 0;
        }
    }
    Value Merge(Value x, Value y) {
        static int tmp[15], cnt[15], id[15];
        Value z;
        merge(x.v, x.v + p, y.v, y.v + p, tmp);
        sort(tmp, tmp + 2 * p);
        int o = unique(tmp, tmp + 2 * p) - tmp;
        for (int i = 0; i < o; i++) {
            id[i] = i, cnt[i] = 0;
        }
        for (int j = 0; j < p; j++) {
            cnt[lower_bound(tmp, tmp + o, x.v[j]) - tmp] += x.c[j];
            cnt[lower_bound(tmp, tmp + o, y.v[j]) - tmp] += y.c[j];
        }
        sort(id, id + o, [&](int x, int y) { return cnt[x] > cnt[y]; });
        for (int i = o - 1; i >= p; i--) {
            for (int j = i - p; j <= i; j++) {
                cnt[id[j]] -= cnt[id[i]];
            }
        }
        for (int j = 0; j < p; j++) {
            if (j < o) {
                z.v[j] = tmp[id[j]];
                z.c[j] = cnt[id[j]];
            } else {
                z.v[j] = z.c[j] = 0;
            }
        }
        return z;
    }
    void pushUp(int i) {
        t[i].val = Merge(t[lc].val, t[rc].val);
    }
    void build(int i = 1, int l = 1, int r = n) {
        t[i].len = r - l + 1;
        if (l == r) {
            t[i].val.v[0] = a[l], t[i].val.c[0] = 1;
            return;
        }
        int mid = (l + r) >> 1;
        build(lc, l, mid), build(rc, mid + 1, r);
        pushUp(i);
    }
    void update(int a, int b, int v, int i = 1, int l = 1, int r = n) {
        if (a <= l && r <= b) {
            tag(i, v);
            return;
        }
        int mid = (l + r) >> 1;
        pushDown(i);
        if (a <= mid) update(a, b, v, lc, l, mid);
        if (b > mid) update(a, b, v, rc, mid + 1, r);
        pushUp(i);
    }
    Value query(int a, int b, int i = 1, int l = 1, int r = n) {
        if (a <= l && r <= b) return t[i].val;
        int mid = (l + r) >> 1;
        pushDown(i);
        if (b <= mid) return query(a, b, lc, l, mid);
        if (a > mid) return query(a, b, rc, mid + 1, r);
        return Merge(query(a, b, lc, l, mid), query(a, b, rc, mid + 1, r));
    }
} st;
int main() {
    scanf("%d%d%d", &n, &m, &p);
    p = 100 / p;
    for (int i = 1; i <= n; i++) {
        scanf("%d", &a[i]);
    }
    st.build();
    while (m--) {
        int op, l, r; scanf("%d%d%d", &op, &l, &r);
        if (op == 1) {
            int v; scanf("%d", &v);
            st.update(l, r, v);
        } else {
            auto val = st.query(l, r);
            printf("%d ", p);
            for (int i = 0; i < p; i++) {
                printf("%d ", val.v[i]);
            }
            printf("\n");
        }
    }
    return 0;
}

标签:frac,Ads,int,mid,CF643G,Choosing,rc,query,struct
From: https://www.cnblogs.com/apjifengc/p/17365342.html

相关文章

  • To build this project, the following workloads must be installed: macos问题的处
    如遇跨平台的NETSDK1147错误的处理方法:【报错提示】NETSDK1147Tobuildthisproject,thefollowingworkloadsmustbeinstalled:macosToinstalltheseworkloads,runthefollowingcommand:dotnetworkloadrestore   KristofferStrube.Blazor.SVGEditor   You......
  • ReadAlignChunk_processChunks.cpp:204:processChunks EXITING because of FATAL ERRO
     001、star报错 002、解决方法fastq文件为压缩格式,运行时需添加该参数:--readFilesCommandzcat ......
  • Provisional heads are shown、NullPointerException空指针异常?堆栈与队列的区别?Java
    Provisionalheadsareshown排查是否插件拦截,我的以前没有这种,所以排除本地网络节点问题,连接不到图片服务器,以下是解决方法:1.进入到C盘Windows文件夹System32/drivers/etc目录下,打开hosts文件,绑定下2.改下本地dns为公共dns网络节点导致的问题,一般为运营商导致,产生问题的原因为......
  • Constructing Roads
    ConstructingRoadsTimeLimit:2000/1000MS(Java/Others)    MemoryLimit:65536/32768K(Java/Others)TotalSubmission(s):17199    AcceptedSubmission(s):6529ProblemDescriptionThereareNvillages,whicharenumberedfrom1toN,andyou......
  • P3008 [USACO11JAN]Roads and Planes G
    P3008[USACO11JAN]RoadsandPlanesG思路按照分连通块的方法进行计算,并且如果不是本连通块的点,不能在现在的本次dfs中求解最小值。要一个一个的联通快进行标记。/*不能直接走disj的话,缩点的思想很重要首先尽量不要使用spfa进行走图,可能会卡对道路进行求连通块,对航线求度数......
  • 基于ads1299的可穿戴脑电信号采集之性能调试总结
    一前言问题背景:最近做项目,遇到了一个问题,就是采集的信号有噪声,在这里做了很多尝试。 二测试步骤A内部方波信号质量,通过测试发现内部方波信号质量特别好。这个说明了软件和存储这块,没啥问题的,还有干扰,那就是前端的硬件引入的干扰了。 B这个是空采的......
  • Codeforces Round #Pi (Div. 2) E. President and Roads (最短路+强连通求割边)
    题目地址:codeforces#pi(DIV2)E题目很水。。就是先求两边最短路,然后把可能为最短路的边挑出来,然后判断是否yes只需要转化成无向图跑一遍tarjan,找出割边,割边就是yes,然后剩下的边就让它的值为最短路-1就行了,如果-1后变成了非正数,就是no.但是!!!居然卡spfa!!那是不是说cf以后就不......
  • Python json基本使用json.dumps() 和json.loads()
    Python中json的基本使用 json.dumps()和json.loads()JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,它是JavaScript的子集,易于人阅读和编写。Json最广泛的应用是作为AJAX中web服务器和客户端的通讯的数据格式,现在也常用于http请求中。Python中可用json模块来......
  • UVa 11723 Numbering Roads (water ver.)
    11723-NumberingRoadsTimelimit:1.000secondshttp://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=2823Inmycountry,streetsdon’thavenames,eachofthemarejustgivenanumber......
  • 论文阅读笔记《Sim-to-real learning for bipedal locomotion under unsensed dynamic
    Sim-to-reallearningforbipedallocomotionunderunsenseddynamicloads目录Sim-to-reallearningforbipedallocomotionunderunsenseddynamicloads介绍背景研究现状本文贡献学习策略无负载策略的训练有负载策略的训练实验模拟器实验虚实迁移实验总结本文的贡献对研究......