abc283 F - Permutation Distance
题意:
给定 的排列 ,对每个 ,计算
思路:
我超,俩绝对值怎么办?硬拆就完事了!
经典二维偏序,树状数组或者线段树维护最值,做四次
const signed N = 2e5 + 5, INF = 1e9;
int n, a[N], ans[N];
int tr[N * 4];
void init() {
fill(tr, tr + N * 4, INF);
}
void modify(int u, int l, int r, int p, int x) { //单点修改
if(l == r) return tr[u] = x, void();
int mid = (l + r) / 2;
if(p <= mid) modify(u * 2, l, mid, p, x);
else modify(u * 2 + 1, mid + 1, r, p, x);
tr[u] = min(tr[u * 2], tr[u * 2 + 1]);
}
int ask(int u, int l, int r, int x, int y) {
if(x > y) return INF;
if(x <= l && r <= y) return tr[u];
int mid = (l + r) / 2, s = INF;
if(x <= mid) s = min(s, ask(u * 2, l, mid, x, y));
if(y > mid) s = min(s, ask(u * 2 + 1, mid + 1, r, x, y));
return s;
}
void sol() {
cin >> n;
for(int i = 1; i <= n; i++)
cin >> a[i];
fill(ans, ans + N, INF);
init(); for(int i = 1; i <= n; i++) {
ans[i] = min(ans[i], i + a[i] + ask(1, 1, n, 1, a[i] - 1));
modify(1, 1, n, a[i], -i - a[i]);
}
init(); for(int i = 1; i <= n; i++) {
ans[i] = min(ans[i], i - a[i] + ask(1, 1, n, a[i] + 1, n));
modify(1, 1, n, a[i], -i + a[i]);
}
init(); for(int i = n; i >= 1; i--) {
ans[i] = min(ans[i], -i + a[i] + ask(1, 1, n, 1, a[i] - 1));
modify(1, 1, n, a[i], i - a[i]);
}
init(); for(int i = n; i >= 1; i--) {
ans[i] = min(ans[i], -i - a[i] + ask(1, 1, n, a[i] + 1, n));
modify(1, 1, n, a[i], i + a[i]);
}
for(int i = 1; i <= n; i++)
cout << ans[i] << ' ';
}
标签:
线段树
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
2022-01-03 cf1010 D. Mars rover(树)