首页 > 其他分享 >[IOI2019]排列鞋子

[IOI2019]排列鞋子

时间:2022-12-14 20:46:21浏览次数:52  
标签:IOI2019 排列 return int len 1000001 鞋子 include

$[IOI2019]$排列鞋子 链接:https://www.luogu.com.cn/problem/P5749 题目描述: 将一个序列$A$交换到满足对于任意的$i(1<=i<=n/2)$满足 $a_{i}=-a_{i\times 2}$且$a_{i}<0$,求至少要交换多少次。 题解:交换多少次就等价于交换得到的排列的逆序对数量,我们可以从这构造一个这样的排列入手。 引理$1$:每一组$a_{i}$相同的左脚鞋与右脚鞋匹配时,从小到大依次匹配最优。 证明:对于每一组匹配$(i,j)$,其贡献为剩余的满足$[k<=i]$的与满足$[k<=j]$的和。因为我们每一次一定是贪心的选取两个贡献最少的,所以每一次要求出满足 $[k<=i]+[k<=j]$的最小$(i,j)$。考虑反证:假设我们选取$a_{i}$相同的不依次匹配的数对$(i,j)$更优,令$a_{i}$依次匹配时$i$匹配了$t$,则$t<=j$。那么$[k<=i]+[k<=t]<=[k<=i]+[k<=j]$,则答案此时便的更劣了,矛盾,则该假设不成立。 引理$2$:按照引理$1$匹配之后,令$b_{i}$表示左脚鞋$i$匹配的数,则以$min(a_{i},a_{b_{i}})$按顺序排列更优。 证明:~~不会,打表吧~~。 根据上述引理:我们可以将逆序对最小的排列求出,树状数组求该排列的逆序对即可。 ``` #include #include #include #include using namespace std; struct node { int l,r; bool operator < (const node &t)const { return min(l,r)<min(t.l,t.r); }="" };="" node="" t[1000001];="" vector<int="">s[1000001]; int n,a[1000001],len,d[2000001]; long long c[1000001],S,ans; int lowbit(int x) { return x&(-x); } void add(int x,int y) { for (;x<=n;x+=lowbit(x)) c[x]+=y; return; } long long sum(int x) { S=0; for (;x>=1;x-=lowbit(x)) S+=c[x]; return S; } int main() { cin>>n; n*=2; for (int i=1;i<=n;++i) { cin>>a[i]; if (a[i]<0) s[-a[i]].push_back(i); } for (int i=n;i>=1;--i) { if (a[i]>0) { t[++len].l=s[a[i]][s[a[i]].size()-1]; s[a[i]].pop_back(); t[len].r=i; } } sort(t+1,t+n/2+1); for (int i=1;i<=n/2;++i) { d[i*2-1]=t[i].l; d[i*2]=t[i].r; } for (int i=1;i<=n;++i) { ans+=sum(n+1-d[i]); add(n+1-d[i],1); } cout<

标签:IOI2019,排列,return,int,len,1000001,鞋子,include
From: https://www.cnblogs.com/zhouhuanyi/p/16983466.html

相关文章

  • [ZJOI2010]排列计数
    $[ZJOI2010]$排列计数链接:https://www.luogu.com.cn/problem/P2606题面:求满足$p_{i}>p_{i/2}(∀i∈[2,n])$的排列个数。题解:考虑将限制转化成一棵树,如果我们将$i......
  • 力扣-31-下一个排列
    很明显,对于一个排列而言,最后一个位置是动不了的那么就从倒数第二个位置开始用递归一点点分析错了几次之后终于自己写出来了(叉腰骄傲)voidnextPermutation(vector<int>&......
  • 剑指offer84:包含重复元素集合的全排列
    题目:给定一个可包含重复数字的整数集合nums,按任意顺序返回它所有不重复的全排列。1.输入:nums=[1,1,2]输出:[[1,1,2],[1,2,1],[2,1,1]]2.输入:nums=[1,2,3]输出......
  • 剑指offer面试题38. 字符串的排列(回溯)
    ​​面试题38.字符串的排列​​难度中等48输入一个字符串,打印出该字符串中字符的所有排列。 你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。 示例:输入:s=......
  • 拼多多 2020校招 多多的排列函数(找规律 构造)
    数列{An} 为N的一种排列。例如N=3,可能的排列共6种:123456​​1,2,3​​​​1,3,2​​​​2,1,3​​​​2,3,1​​​​3,1,2​​​​3,2,1​​定义函数F: 其中......
  • Python各个列表交叉进行排列组合
    示例v_list=[["1.mp4","2.mp4"],["3.mp4"],["6.mp4","7.mp4"],[],[]]我想把这个列表里面的各个列表,重新排列组合但是我不知道列表里套了几个列表,套的列表里有......
  • 31. 下一个排列
     31. 下一个排列题目描述:本题是给你一个整数数组,返回该数组的下一个线性顺序排列。举个例子:给你一个[1,2,3]的数组,他的线性排列顺序从小到大依次为[1,3,2],[2,1,......
  • 字符串的全排列算法讲解
    一、字符串的排列用C++写一个函数,如Foo(constchar*str),打印出str的全排列,如abc的全排列:abc,acb,bca,dac,cab,cba一、全排列的递归实现为方便起见,用123......
  • 回溯算法_全排列_元素重复_字典去重法
    '示例1:'输入:nums=[1,1,2]'输出:[[1,1,2],[1,2,1],[2,1,1]]'示例2:'输入:nums=[1,2,3]'输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]Pub......
  • 随机生成的文字,在背景图随机排列
    前言偶然间看到有人咨询怎么做随机生成的文字,在背景图随机排列的思路,然后我刚好也忙完了,于是就简单的做了一个dom,给需要的人参考下。<!DOCTYPEhtml><htmllang="e......