EVERYTHING HAPPENS FOR TH|

wnsyou

园龄:2年4个月粉丝:19关注:16

2023-03-03 20:21阅读: 40评论: 0推荐: 0

abc233_f Swap and Sort 题解

Swap and Sort

题意

有一个 1n 的全排列 p1pn

m 种操作,第 i 种操作可以交换 paipbi

请问最多执行 5×105 次操作能否使得 p 升序排列。

  • 如果可能,第一行输出操作次数,第二行输出操作序列
  • 否则,输出-1

数据范围

  • 2n1000
  • 1mmin(2×105,n(n1)2)
  • 1ai<bin 且当 ij(ai,bi)(aj,bj)

思路

建图

详见代码注释。

次数限制分析

首先来分析一下:

  • 同一个操作执行了偶数次,就相当于没有执行
  • 同一个操作执行了奇数次,就相当于执行1

所以在操作次数尽量小的情况下,最多执行 n22 次。

然后就会惊喜地发现:100022 就是 5×105,也就是说,只要每个操作都是有意义的且在不限定次数的情况下是可以完成的,就是可以完成的。

图->树

接下来就需要把有环图转成树了。

由于我们分析了次数限制不是很重要,所以是可以断掉环上的任意的边的,因为不需要操作数量最小。

求答案

找答案其实很简单,只要注意细节,为了防止在交换之后原本处理好的节点重新被交换到了一个错误的地方,我们只能去求每棵树的叶子节点。

复杂度

  • 时间:O(n+m)
  • 空间:O(n+m)

Code

点击查看代码
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int M = 2e5 + 10;
struct node {
int x, id;
};
int n, m, a[1010], f[1010], l, r, num, b[1010], fa[1010];
vector<node> nv[1010], v[1010];
vector<int> ans;
queue<int> q;
void stree (int x) {
f[x] = 1; // 标记这个节点在图中
for (auto i : nv[x]) {
if (!f[i.x]) {
v[x].push_back({i.x, i.id}), v[i.x].push_back({x, i.id}), b[x]++, fa[i.x] = x, stree(i.x); // 记录这个节点的儿子
}
}
}
void dfs (int x, int y, int sum) {
if (a[x] == l) { // 终于交换到了目的地
num = sum; // 记录答案
return ;
}
for (auto i : v[x]) {
if (i.x != y) { // 不是上一个节点
dfs(i.x, x, sum + 1); // 进行dfs
}
if (num != -1) { // 已经交换到了目的地
ans.push_back(i.id);
swap(a[x], a[i.x]); // 记得真正地交换一下
return ;
}
}
}
void Ans () { // 求答案
for (int i = 1; i <= n; i++) {
if (!b[i]) { // 是叶子节点
q.push(i);
}
}
while (!q.empty()) {
l = q.front(), num = -1, q.pop();
dfs(l, 0, 0);
if (num == -1) { // 到不了目标点
cout << -1;
exit(0);
}
b[fa[l]]--; // 当前点没了,它的父亲的儿子数量要减1
if (!b[fa[l]]) { // 它的父亲成了叶子节点
q.push(fa[l]); // 加入答案处理队伍
}
}
}
int main(){
ios::sync_with_stdio(0), cin.tie(0);
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
cin >> m;
for (int i = 1; i <= m; i++) {
cin >> l >> r, nv[r].push_back({l, i}), nv[l].push_back({r, i}); // 记录交换
}
for (int i = 1; i <= n; i++) {
if (!f[i]) {
stree(i); // 生成树
}
}
Ans();
cout << ans.size() << '\n';
for (auto i : ans) {
cout << i << ' '; // 处理操作序列
}
return 0;
}

本文作者:wnsyou の blog

本文链接:https://www.cnblogs.com/wnsyou-blog/p/17176666.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   wnsyou  阅读(40)  评论(0编辑  收藏  举报
  1. 1 勝利への道 安藤浩和
  2. 2 Minecraft’s End Eric Fullerton
  3. 3 月光曲完整版 贝多芬 云熙音乐
  4. 4 平凡之路 (Live版) 朴树
  5. 5 Minecraft C418
  6. 6 Paradise NiziU
  7. 7 叫我,灰原哀 龙大人不喷火
  8. 8 心机之蛙,一直摸你肚子 ——《名侦探柯南》原创同人曲 炊饭,叶辞樱,温海,寒砧,南柯柯,小茜玛姬,盛姝,阿崔Ac,贝壳初,千湛,兮茶子DaYu,乔慕,黎鹿北,起千温卿,遮阳伞,曲悠
  9. 9 战 歌 此去经年
叫我,灰原哀 - 龙大人不喷火
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作词 : 龙大人不喷火

作曲 : 纯哲不咕咕

编曲 : REVIVAL MUSIC

和声编写 : 胡佳弈

音源:灰原哀

这位就是从今天起要跟大家一起念书的灰原哀同学

什么嘛 摆一张臭脸

她好冷淡哦

我想她一定是紧张啦

我是海底逃出的鲨鱼

请多指教

不太礼貌 给你们警告

有我朋友出现的地方都会有人死掉

奇妙的 营造了

名侦探的名号

情报 是我 发出的信号

帮他 抓住这病号

就是 杀戮的殉道 者

你是否听到了

滴滴滴滴 炸弹的声音

听清叮咛 灵光乍现的分析 一半都靠我

当然不是小女孩 数理化信手都拈来

可御可萝不可得的女天才

丢失的挂件 达咩哟

抽丝的毛线 达咩哟

就拜托你帮忙开门 该死的静电 达咩哟

过时的行头 达咩哟

车内的停留 达咩哟

当爹当妈一级怪人 可怜的琴酒 达咩哟

重新开始希望也不会属于我

就像地平线送来朝阳又等待日落

天空走漏风声让我时刻保持沉默

黑色子弹划过 沉入夜色如墨

或许只有更沉的夜才更适合烟火

当我仰望天空在我眼中映下星河

这盛大的绚烂让我不再逃避闪躲

当我看向身侧 并非孤身一个

出谋划策 找寻下落

由我负责其中大多 数

小女孩也该有的酷

只有我能秀得住

就微笑看他 mz 枪发射

少年侦探队的家伙

或许应该对他们说

我的朋友 阿里嘎多

Baby 叫我 灰原哀

女孩心思 会难猜

我从反派反外 正义的板块 幕后的凶手被掩盖

就让我静静地等待着绯色的子弹壳穿过了他的胸膛

到最后那一刻或许我长大了不适合停留在谁的身旁

这些不会改变我

从来学不会软弱

看我 微笑的弧度 表演的无助

吸引更多人反侧

把你拐到梦想国度看焰火

我才是最完美的罪犯没有留下线索

丢失的挂件 达咩哟

抽丝的毛线 达咩哟

就拜托你帮忙开门 该死的静电 达咩哟

过时的行头 达咩哟

车内的停留 达咩哟

当爹当妈一级怪人 可怜的琴酒 达咩哟

重新开始希望也不会属于我

就像地平线送来朝阳又等待日落

天空走漏风声让我时刻保持沉默

黑色子弹划过 沉入夜色如墨

或许只有更沉的夜才更适合烟火

当我仰望天空在我眼中映下星河

这盛大的绚烂让我不再逃避闪躲

当我看向身侧 并非孤身一个

命运的天平我早就被放入了一边的托盘

另一边是药物枪火还有一把多兰

这首歌就要播完 或许不该有遮拦

最后一句就像生命我选择押在了柯南

嗯哼 我乱说的 干嘛这么认真啊

加载中…

{{tag.name}}

{{tran.text}}{{tran.sub}}
无对应文字
有可能是
{{input}}
尚未录入,我来提交对应文字
评论
收藏
关注
推荐
深色
回顶
收起
点击右上角即可分享
微信分享提示