首页 > 其他分享 >带修莫队模板

带修莫队模板

时间:2024-07-17 12:40:27浏览次数:14  
标签:cnt qt int ++ -- now 模板 修莫队

取分块大小 \(n^\frac{2}{3}\) 最优。
例题:数颜色

#include<bits/stdc++.h>

using namespace std;

using i64 = long long;

const int N = 1e6 + 5;
int cnt[N], a[N];

struct query {
    int l, r, t, id;//加入时间戳
};

struct modfiy {
    int pos, val;
};

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

    int n, m;
    cin >> n >> m;

    int M = pow(n, 2.0 / 3.0);

    for (int i = 1; i <= n; i ++)
        cin >> a[i];

    int cntc = 0, cntq = 0;
    vector<query> q;
    vector<modfiy> c;
    for (int i = 0; i < m; i ++) {
        char op;
        int l, r;
        cin >> op >> l >> r;
        if (op == 'Q') {
            int qt = c.size();
            q.push_back({l, r, qt, (int)q.size()});
        } else {
            c.push_back({l, r});
        }
    }
	//排序与普通莫队不同
    sort(q.begin(), q.end(), [&M](query x, query y) {
        return (((x.l / M) ^ (y.l / M)) ? x.l < y.l : ((x.r / M) ^ (y.r / M)) ? x.r < y.r : x.t < y.t);
    });

    int l = 1, r = 0, time = 0, now = 0;
    vector<int> ans(q.size());
    for (int i = 0; i < q.size(); i ++) {
        auto [ql, qr, qt, id] = q[i];

        while (l < ql)  now -= !--cnt[a[l++]];
        while (l > ql) now += !cnt[a[--l]]++;
        while (r < qr) now += !cnt[a[++r]]++;
        while (r > qr) now -= !--cnt[a[r--]];

        while (time < qt) {
            if (ql <= c[time].pos && c[time].pos <= qr)
                now -= !--cnt[a[c[time].pos]] - !cnt[c[time].val]++;
            swap(a[c[time].pos], c[time].val);
            ++time;
        }
        while (time > qt) {
            --time;
            if (ql <= c[time].pos && c[time].pos <= qr)
                now -= !--cnt[a[c[time].pos]] - !cnt[c[time].val]++;
            swap(a[c[time].pos], c[time].val);
        }
        ans[id] = now;
    }

    for (int i = 0; i < q.size(); i ++)
        cout << ans[i] << "\n";

    return 0;
}

标签:cnt,qt,int,++,--,now,模板,修莫队
From: https://www.cnblogs.com/Kescholar/p/18307062

相关文章

  • 基于Go1.19的站点模板爬虫教程
    以下是基于Go1.19的站点模板爬虫教程。我们将使用Go编程语言创建一个简单的网页爬虫,爬取指定网站的内容。我们将使用一些常见的Go库,例如net/http和golang.org/x/net/html,来处理HTTP请求和解析HTML。第一步:安装和设置安装Go:如果你还没有安装Go,请先从Go官方......
  • 易优CMS模板标签tags标签调用
    【基础用法】标签:tags描述:TAG调用用法:{eyou:tagssort='now'getall='0'loop='100'}<ahref='{$field.link}'>{$field.tag}</a>(文档数:{$field.total}){/eyou:tags}属性:aid=''文档ID,在内容页可以不设置该属性typeid=''栏......
  • 莫队模板
    #include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;constintN=1e6+5;intcnt[N],a[N];structquery{intl,r,id;};intmain(){ios::sync_with_stdio(false);cin.tie(nullptr);intn;cin>>n;......
  • vue基础day01(MVVM、绑定、事件、结构模板)
    vue基础一、什么是vue构建用户界面的渐进式框架,采用自底向上逐层应用开发核心理念:数据驱动视图,组件化开发二、框架和库的区别框架:一套完整的解决方案,对项目的侵入性较大,项目如果需要更换框架,需要重新架构整个项目库:提供了一个小的功能,对项目的侵入性较小,如果某个库无......
  • Asp .Net Core 系列:基于 T4 模板生成代码
    目录简介组成部分分类VisualStudio中使用T4模板创建T4模板文件2.编写T4模板3.转换模板中心控制Manager根据MySQL数据生成实体简介T4模板,即TextTemplateTransformationToolkit,是微软官方在VisualStudio中引入的一种代码生成引擎。自VisualStudio2008开始,T4模板就被......
  • 【模板】插头 DP
    为了利用位运算的良好性质,采用四进制状态压缩代替三进制通过哈希表压缩有限的状态与普通的按行滚动的滚动数组不同,插头DP中的滚动数组是按格滚动的因为布尔数组值默认为false,所以我们可以用“true”代表“可通行”转移时需要找到与之匹配的括号——实现算法时不能够总是代入......
  • 关于静态文件目录与模板引用和Nginx location块的适配设置
    项目配置文件内关于静态文件的设置项#静态文件的URL前缀STATIC_URL='/static/'#项目根目录的静态文件目录STATICFILES_DIRS=[os.path.join(BASE_DIR,'static'),os.path.join(BASE_DIR,'parallel/static'),os.path.join(BASE_DIR,'blog/static&#......
  • 海量元宇宙场景模板,视创云展解锁你的无限创意虚拟空间!
    ​一站式元宇宙虚拟活动云平台视创云展,集成了海量的元宇宙场景模板,并借助其强大的模块化功能体系,使得用户能够轻松跨越技术门槛,迅速创作出高质量的3D场景。用户可自由发挥创意,构建出独一无二的元宇宙空间,完美契合多样化的场景应用需求。1、海量模板,随心选择:视创云展拥有海量......
  • 模板——类模板2——继承,文件,友元
    1.类模板与继承1.1当子类继承的父类是一个类模板时,子类在声明时,要指定父类中T的类型1.2如果不指定,编译器无法给子类分配内存1.3如果想灵活指定父类中的T的类型,子类也需变成类模板template<classT>classBase{public: Tage;};//classSon:publicBase//错误,c++编译......
  • 模板——类模板1--与函数的关系
    1.类模板基本语法template<classT,classT2>类template<classNameType,classAgeType>classPerson{public: Person(NameTypename,AgeTypeage) { this->m_name=name; this->m_age=age; } voidShowPerson() { cout<<"姓名:&quo......