Codeforces Round #424 Div2 E. Cards Sorting

本文介绍了一种使用线段树数据结构解决特定卡片游戏问题的方法。通过维护区间内的卡片总数和最小值,实现对游戏过程中玩家抽取卡片行为的有效模拟。文章详细展示了算法的具体实现过程,包括初始化、更新及查询等关键步骤。

我只能说真的看不懂题解的做法
我的做法就是线段树维护,毕竟每个数的顺序不变嘛
那么单点维护 区间剩余卡片和最小值

每次知道最小值之后,怎么知道需要修改的位置呢
直接从每种数维护的set找到现在需要修改的数的在初始卡片的位置

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <algorithm>
#include <iostream>
#include <map>
#include <set>
#include <queue>
#include <cmath>
using namespace std;
typedef long long ll;
#define MP(x, y) make_pair(x, y)
#define lson l,m, rt<<1
#define rson m+1, r, rt<<1|1
const int N = 1e5+5;
const int INF = 0x3f3f3f3f;
int MOD;
int A[N];
int Min[N << 2];
int Sum[N << 2];
void Build(int l, int r, int rt) {
    if(l == r) {
        Min[rt] = A[l]; Sum[rt] = 1;
        return;
    }
    int m = (l + r) >> 1;
    Build(lson); Build(rson);
    Sum[rt] = Sum[rt << 1] + Sum[rt << 1|1];
    Min[rt] = min(Min[rt <<1] , Min[rt << 1|1]);
}
void Update(int pos, int l, int r, int rt) {
    if(l == r) {
        Min[rt] = INF; Sum[rt] = 0;
        return;
    }
    int m = (l + r) >> 1;
    if(pos <= m) Update(pos, lson);
    else Update(pos, rson);
    Sum[rt] = Sum[rt<<1] + Sum[rt<<1|1];
    Min[rt] = min(Min[rt<<1], Min[rt<<1|1]);
}
int Total(int pos, int l, int r, int rt) {
    if(pos == 0) return 0;
    if(pos == r) {
        return Sum[rt];
    }
    int m = (l + r) >> 1;
    if(pos <= m) return Total(pos, lson);
    else return Sum[rt<<1] + Total(pos, rson);
}

map<int, set<int> > mp;
set<int> ::iterator it;

int main() {
    int n;
    while(~scanf("%d", &n)) {
        ll ans = 0;
        mp.clear();
        for(int i = 1; i <= n; ++i) {
            scanf("%d",&A[i]);
            mp[A[i]].insert(i);
        }
        Build(1, n, 1);

        int pos = 1;
        for(int i = 1; i <= n; ++i) {
            int tar = Min[1]; int nwpos;
            it = mp[tar].lower_bound(pos);

            if(it == mp[tar].end()) {
                it = mp[tar].begin();
            }           
            nwpos = *it;
            mp[tar].erase(it);

        //  printf("%d %d\n", tar, nwpos);

            Update(nwpos, 1, n, 1);
            int t1 = Total(nwpos, 1,n,1); int t2 = Total(pos - 1, 1,n,1);
        //  printf("%d %d\n", t1, t2);
            if(pos <= nwpos) {
                ans += t1 - t2 + 1;
            }else {
                ans += Sum[1] - t2 + t1 + 1;
            }
            pos = nwpos;
        }

        printf("%d\n", ans);
    }
    return 0;
}
多源动态最优潮流的分布鲁棒优化方法(IEEE118节点)(Matlab代码实现)内容概要:本文介绍了基于Matlab代码实现的多源动态最优潮流的分布鲁棒优化方法,适用于IEEE118节点电力系统。该方法结合两阶段鲁棒模型与确定性模型,旨在应对电力系统中多源输入(如可再生能源)的不确定性,提升系统运行的安全性与经济性。文中详细阐述了分布鲁棒优化的建模思路,包括不确定性集合的构建、目标函数的设计以及约束条件的处理,并通过Matlab编程实现算法求解,提供了完整的仿真流程与结果分析。此外,文档还列举了大量相关电力系统优化研究案例,涵盖微电网调度、电动汽车集群并网、需求响应、储能配置等多个方向,展示了其在实际工程中的广泛应用价值。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及从事能源系统优化工作的工程师。; 使用场景及目标:①用于研究高比例可再生能源接入背景下电力系统的动态最优潮流问题;②支撑科研工作中对分布鲁棒优化模型的复现与改进;③为电力系统调度、规划及运行决策提供理论支持与仿真工具。; 阅读建议:建议读者结合提供的Matlab代码与IEEE118节点系统参数进行实操演练,深入理解分布鲁棒优化的建模逻辑与求解过程,同时可参考文中提及的其他优化案例拓展研究思路。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值