题解-USACO18DEC Sort It Out】的更多相关文章

Problem 洛谷5156 题意概要:给定一个长为\(n\)的排列,可以选择一个集合\(S\)使这个集合内部元素排到自己在整个序列中应该在的位置(即对于集合\(S\)内的每一个元素\(i\),使其排到第\(i\)号位置,使得整个排列在排序后为上升序列.求满足这样条件的,且集合大小最小的集合中字典序第\(k\)小的集合(可能总结不到位,看链接里的吧) \(n\leq 10^5\) Solution 不难发现出题人费尽心思写的题面就是在强烈暗示选取一个集合等价于将这个集合内所有元素排到自己该处于的…
(翻了翻其他的题解,觉得它们没讲清楚这个策略的正确性) Problem 洛谷5155 题意概要:给定一个长为\(n\)的序列,可以选择以\(\frac 12\)的概率进行左右移动,也可以结束并得到当前位置上的收益,求从每个位置开始时使用最优策略的最大期望收益是多少 \(n\leq 10^5\) Solution 关键在于需要考虑当前是选择移动还是直接结束.一个很明了的观点:如果当前移动后的收益期望比当前位置的收益大,那么会选择移动:否则选择直接停止.直接停止的贡献已经知道,那么要求的就是当前点选…
1.题目描述 2.问题分析 使用sort算法 3.代码 ListNode* sortList(ListNode* head) { if( head == NULL || head->next == NULL ) return head; vector<int> v; ListNode *ptr = head; while( ptr != NULL ){ v.push_back(ptr->val); ptr = ptr->next; } sort(v.begin(),v.end…
Sort a linked list using insertion sort. 题目要求:链表的插入排序,由于没有时间复杂度的要求,可以直接循环操作. /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode…
[Luogu5156] 题解 求字典序第 k 小的满足题意的集合,取反一下,就是求序列中字典序第 k 大的最长上升子序列 [51nod1376] 最长递增子序列的数量 置 \(f_{i}\)表示以权值为 i 结尾的 LIS 的长度和数量,则权值 x 从 $ f_{1} \dots f_{x-1}$ 间转移,用树状数组维护前缀最大值和数量即可$ O(nlog n)$解决 假设当前要求的序列的 LIS 长度为 t ,则求第 k 大 LIS 的一个思想就是先确定第 1 个数,再在确定第 1 个数的基础…
初看本题毫无思路,只能从特殊的 \(K = 1\) 出发. 但是直接考虑构造一组字典序最小的方案还是不好构造,可以考虑先手玩一下样例.通过自己手玩的样例可以发现,貌似没有被选出来的数在原排列中都是递增的子序列.比如说 \(1 \ 6 \ 5 \ 3 \ 4 \ 2\) 可以证明 \(2 \ 5 \ 6\) 是字典序最小的方案,那么剩下的数按照在原排列中的顺序依次写下是 \(1 \ 3 \ 4\) 是一个递增序列.可以思考一下为什么会有这样的结论出现. 不难发现不论我们怎么操作,原来序列中顺序对的…
贪心算法 次数最少的方法,即:1.每次都将0与应该放置在0位置的数字交换即可.2.如果0处在自己位置上,那么随便与一个不处在自己位置上的数交换,重复上一步即可.拿样例举例:   0 1 2 3 4 5 6 7 8 90:3 5 7 2 6 4 9 0 8 1 1:3 5 0 2 6 4 9 7 8 12:3 5 2 0 6 4 9 7 8 13:0 5 2 3 6 4 9 7 8 1 (如果0处在自己位置上,那么找一个不在自己位置上的数val与之交换)4:5 0 2 3 6 4 9 7 8 15…
这题就是让你求字典序第k小的最短乱序子序列 转换一下,其实就是字典序第k大的最长上升子序列 就统计一下以i结尾的最长上升子序列\(f[i]\),长度为i的上升子序列的开头组成的集合\(v[i]\),转移时贪心转移就行了 然而并不是很懂为什么计算\(f[i]\)时要倒着计算-- 代码: #include <bits/stdc++.h> #define N 100005 #define ll long long #define inf 1e18 using namespace std; vecto…
传送门 分析 我们发现对于没有发现的点相对位置不会发生改变 于是我们可以吧问题转化为求一个lis 于是我们字典序第k小的答案就是字典序第k大的lis 代码 #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<cctype> #include<cmath> #include<…
被概率冲昏的头脑~~~ 我们先将样例在图上画下来: 会发现,最大收益是: 看出什么了吗? 这不就是凸包吗? 跑一遍凸包就好了呀,这些点中,如果i号点是凸包上的点,那么它的ans就是自己(第二个点),不然的话,从上图来看,i的ans肯定和他相邻的两个是凸包边界的点有关(0节点和2节点),那么怎么求这个ans呢?(第x号点为横坐标为x的点) 实际上我也不知道就是个期望公式啊! l[i]记录i号点往左走第一个为凸包边界的点(如果i为1号,那么l[i]为0,特殊的,如果i为2号,那么l[i]就是本身),…