CF EDU 131 D - Permutation Restoration
贪心、扫描线思想
题意
有 的一个排列 , 给定 , 满足 , 求 (n <= 5e5)
思路
先解出每一个 的取值区间,然后就是经典的作业调度问题
- 的取值区间
- 转化为扫描线问题,把区间左端点看作关键时间点,用vector存在 l 时间有哪些 [i, r] 可以加入优先队列(r味关键字的小根堆),然后在从优先队列里取出当前 r 最小的,这个时间点就分配给这个任务
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cmath>
#include <queue>
using namespace std;
#define endl "\n"
typedef long long ll;
typedef pair<int, int> PII;
const int N = 5e5 + 10;
int n;
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int T;
cin >> T;
while(T--)
{
cin >> n;
vector<vector<PII> > event(n + 1);
for (int i = 1; i <= n; i++)
{
int b;
cin >> b;
int l, r;
if (i % (b + 1) == 0)
l = i / (b + 1) + 1;
else
l = (i + b) / (b + 1);
if (b)
r = i / b;
else
r = n;
event[l].push_back({r, i});
}
vector<int> ans(n + 1);
priority_queue<PII, vector<PII>, greater<PII> > heap;
for (int l = 1; l <= n; l++)
{
for (auto evt : event[l])
heap.push(evt);
auto [r, id] = heap.top();
heap.pop();
ans[id] = l;
}
for (int i = 1; i <= n; i++)
cout << ans[i] << " ";
cout << endl;
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!