首页 > 其他分享 >【主席树】CF813 E. Army Creation

【主席树】CF813 E. Army Creation

时间:2023-08-26 22:13:40浏览次数:47  
标签:Node rt Army int Creation add ans np CF813

【主席树】CF813 E. Army Creation

题目链接:https://codeforces.com/contest/813/problem/E

题意

多次询问,求一个区间内,所有数个数的总和,但相同的数最多被计算k次,强制在线。

题解

这道题和牛客一道题很像,是那道题的加强版,链接在这:题解链接

那道题可以离线,所以离线处理+树状数组可以做,但这道题强制在线,于是我们掏出主席树。

可以发现,在区间 0~n-1 上依次建主席树的历史版本,然后就可以把每个历史版本都当作一个遍历到那个位置的树状数组来用了。

其他步骤和我前面说的那道青春版的题很像,也是尽量选最靠近r的左边的k个数最优,超出部分直接删掉就好了。

代码

#include <bits/stdc++.h>
using namespace std;
using i64 = long long;

struct Node {
    Node *l;
    Node *r;
    int v;
};
Node *add(Node *p, int l, int r, int x, int d) {
    Node *np = new Node();
    if (p) *np = *p;
    np->v += d;
    if (l == r) return np;
    int m = (l + r) / 2;
    if (x <= m) {
        np->l = add(np->l, l, m, x, d);
    } else {
        np->r = add(np->r, m + 1, r, x, d);
    }
    return np;
}
int query(Node *p, int l, int r, int x) {
    if (r < x) return 0;
    if (x <= l) return p ? p->v : 0;
    int ans = 0;
    int m = (l + r) / 2;
    ans += query(p ? p->l : nullptr, l, m, x);
    ans += query(p ? p->r : nullptr, m + 1, r, x);
    return ans;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, k;
    cin >> n >> k;
    vector<int> a(n);
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }

    int mx = *max_element(a.begin(), a.end());
    vector<Node *> rt(n + 1);
    vector<vector<int>> pos(mx + 1);
    for (int i = 0; i < n; i++) {
        rt[i + 1] = add(rt[i], 0, n - 1, i, 1);
        if (pos[a[i]].size() >= k) {
            rt[i + 1] = add(rt[i + 1], 0, n - 1, *(pos[a[i]].end() - k), -1);
        }
        pos[a[i]].push_back(i);
    }

    int ans = 0;
    int q;
    cin >> q;
    while (q--) {
        int l, r;
        cin >> l >> r;
        l = (l + ans) % n + 1;
        r = (r + ans) % n + 1;
        if (l > r) swap(l, r);
        l--, r--;

        ans = query(rt[r + 1], 0, n - 1, l);
        cout << ans << '\n';
    }

    return 0;
}

标签:Node,rt,Army,int,Creation,add,ans,np,CF813
From: https://www.cnblogs.com/blockche/p/17659546.html

相关文章

  • eclipse new creation file type
    ......
  • Codeforces Round #291 (Div. 2)-D. R2D2 and Droid Army(RMQ)
    原题链接D.R2D2andDroidArmytimelimitpertestmemorylimitpertestinputoutputAnarmyof n droidsislinedupinonerow.Eachdroidisdescribedby m integers a......
  • 【Oracle】Generate the tablespace creation in a time
     此脚本的使用场景是需要使用datapump方式进行数据迁移时,需要在目标数据库上创建对应的表空间,这时对于表空间数量比较多的系统,比如peoplesoft来说,手工单独创建表空间会是一个比较麻烦的事情。以下脚本在源数据库上运行,获取表空间的创建脚本,然后只需对路径相应修改即可使用。......
  • 微软官方MediaCreationTool(win10、win11安装系统的工具)下载镜像慢问题的解决
    现在重装win10、win11系统,很多人使用微软官方的MediaCreationTool制作U盘镜像,该工具会帮助用户从微软官方下载镜像到U盘,但很多咱们国内地方的下载速度很慢。看了一些说法,最终怀疑到DNS上面来,实际改了一下,效果非常好,我家300Mbps的宽带,以前下这个得4-5个小时,改了DNS只需要不到5分钟......
  • LongRunnigTask TaskCreationOptions.LongRunning 参数
    这样在C#使用LongRunnigTask是错的 Task.Factory.StartNew有一个重载,是支持TaskCreationOptions.LongRunning参数来指定Task的特征的。但是可能在没有注意的情况下,你就使用了错误的用法。那么本文我们来简单阐述一下这个参数的作用,和使用的注意要点。这样其实是错......
  • POJ 3069 Saruman's Army(贪心)
    传送门这个题是说给你n个点,然后让你标记其中尽可能少的点,使得n个点都处于被标记点左右不超过R的区间内我们使用的是贪心算法,也就是我们要将被标记的点尽可能的朝右边去即可,首先我们将他们从左到右进行排序,第一个我们所选取的被标记的点应该是能够包含掉左边的点的最靠右的点。。。......
  • Dynamic Process Creation Using API [JBPM 5.1]
    [url]http://atulkotwale.blogspot.com/2012/01/dynamic-process-creation-using-api-jbpm.html[/url]HiFriends,Asyouguysallknowjbpmhascameupwithnewversion.Ithassomebeautifulfeatures.InthispostIwillshowyouhowcanwe......
  • 错问题:--谷粒商城--org.springframework.beans.factory.beancreationexception: error
    做谷粒商城使用人人开源的时候,导入nacos时出现这个问题最后发现是自己在导入时没有把这个版本改掉,最终出现问题,大概原因就是spring的版本和nacos的版本不匹配。<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent<......
  • papmelon 214. 萨鲁曼的军队 Saruman's Army
    地址https://www.papamelon.com/problem/214解答贪心算法尽可能标记右边的点也就是后边的点在覆盖空间的可能性更大#include<iostream>#include<algorithm>#include<set>#include<assert.h>usingnamespacestd;constintN=1010;intn,r;intarr[N];......
  • 关于 SAP UI5 接口 sap.ui.core.IAsyncContentCreation 的问题讨论
    SAPUI5接口sap.ui.core.IAsyncContentCreation是一种异步内容创建接口,用于延迟创建UI元素。在SAPUI5中,UI元素通常是使用XML视图或JS视图创建的,这些视图可以在页面加载......