题解 Wide Swap】的更多相关文章

题目传送门 题目大意 给出一个长度为 \(n\) 的排列 \(a_{1,2,...,n}\) 以及常数 \(k\),每次可以交换两个数 \(a_i,a_j\) 当且仅当 \(j-i\ge k \text{ and } |a_i-a_j|=1\) ,问最小能变成的最小字典序的 \(a\) 序列. \(n\le 5\times 10^5\) 思路 首先很重要的一点是,我们肯定得把题目转换一下,不然 \(j-i\ge k\) 这个条件太难用了.我们其实可以设 \(p_i\) 表示元素 \(i\) 所在…
Wide Swap Time Limit: 50 Sec  Memory Limit: 512 MB Description Input Output Sample Input 8 3 4 5 7 8 3 1 2 6 Sample Output 1 2 6 7 5 3 4 8 HINT Solution 首先,直接做难度系数较高,假设原序列为a,我们考虑设一个p,p[a_i] = i,即将题目中的权值与下标调换. 那么显然,要令a字典序最小,只要让p字典序最小即可.因为“权值小的尽量前”与“前面…
AT1984 Wide Swap 题意翻译 给出一个元素集合为\(\{1,2,\dots,N\}(1\leq N\leq 500,000)\)的排列\(P\),当有\(i,j(1\leq i<j\leq N)\)满足\(j-i\geq K\)\((1\leq K\leq N-1)\)且\(|P_{i}-P{j}|=1\)时,可以交换\(P_{i}\)和\(P_{j}\) 求:可能排列中字典序最小的排列 输入格式: \(N\) \(K\) \(P_{1}\) \(P_{2}\) \(\dots\)…
前言   [LeetCode 题解]系列传送门:  http://www.cnblogs.com/double-win/category/573499.html   1.题目描述 Given a linked list, swap every two adjacent nodes and return its head. For example, Given 1->2->3->4, you should return the list as 2->1->4->3. Yo…
题目链接: https://atcoder.jp/contests/agc001/tasks/agc001_f 题解: 先变成排列的逆,要求\(1\)的位置最小,其次\(2\)的位置最小,依次排下去(称之为逆字典序).有一些条件,如果两数\(x,y\)的差小于\(K\), 那么它们的相对位置不可变. 所以如果从必须在前面的往必须在后面的连边,得到的图将是一个DAG,现在需要求它的一个拓扑序满足上面的最优化条件. 先排除几个错误结论: 翻转后字典序越大,字典序越小,错误.逆字典序越大,字典序越大/…
problem: Given a linked list, swap every two adjacent nodes and return its head. For example, Given 1->2->3->4, you should return the list as 2->1->4->3. Your algorithm should use only constant space. You may not modify the values in the…
Atcoder 题面传送门 & 洛谷题面传送门 咦?鸽子 tzc 来补题解了?奇迹奇迹( 首先考虑什么样的排列可以得到.我们考虑 \(p\) 的逆排列 \(q\),那么每次操作的过程从逆排列的角度思考,就可视作每次在逆排列中交换两个相邻,且元素值之差 \(\ge k\) 的元素.注意到对于两个元素 \(x,y\),如果 \(|x-y|<k\),那么我们肯定永远无法交换它们,它们的相对位置顺序也永远无法改变,因为要改变它们的相对顺序必须交换它们.而一对 \(|q_i-q_j|<k,i&l…
Description 给你一个长度为$n$的排列,每次可以交换$|i-j|\geq K$并且$|a_i-a_j|=1$的数对,问你经过若干次变换后最小字典序的排列是啥 Solution 对$a$做一个变换,令$b_{a_i}=i$,$b$数组的意思就是$i$在哪个位置 那么问题就转化成 你可以交换相邻的$|b_i-b_{i+1}|\geq K$的数对 这个时候很多人都说只要令$b$的字典序最小就可以了,但我感觉不是很对.. 毕竟$b$字典序小和$a$字典序小没有什么关系啊.. 再想一想上面条件…
1.题目描述 2.问题分析 对两个节点进行交换操作 3.代码 ListNode* swapPairs(ListNode* head) { if( !head || head->next == NULL ){ return head; } ListNode dummy(); ListNode* d = &dummy; ListNode* p = head; while( p && p->next != NULL ){ ListNode* tmp = p->next-…
因为不太熟悉链表操作,所以解决方法烦了点,空间时间多有冗余. 代码中l,r分别是每一组的需要交换的左右指针,temp是下一组的头指针,用于交换后链接:res是交换后的l指针,用于本组交换后尾指针在下一组交换后链接上交换后的头指针. /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} *…