1759G-Restore the Permutation

2024-05-24 04:12
文章标签 restore permutation 1759g

本文主要是介绍1759G-Restore the Permutation,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接:Restore the Permutation

        题目要求字典序最小,因此我们贪心的考虑,假设b数组为 4 3 6,那么我们贪心的考虑得到的结果是 1 4 2 3 5 6 ,但是如果b数组是8 7 4 5 那么我们不能够是1 8 2 7 3 4 6 5,因为最后一个数明显不符合。

        因此我们从后往前枚举,寻找第一个比这个数小的数,然后删除这个数,因此我们可以采用lower_bound()函数来寻找第一个比它小的数,用vector记录除了选择的数,如果这个数被选,那么就erase。

        那么什么情况下是-1呢?当然只有从后往前枚举的时候剩余的数不能找到和它匹配的数,也就是说没有比它小的数了,那么我们可以从1到n遍历,判断枚举到i时b数组中的数枚举到的数的个数和没有在b数组的个数,再进行比较即可。

代码附上:

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e5+5;
int a[N];
int n;
int top=0;
vector<int>b;
int ans[N];
int vis[N];void solve(){cin>>n;top=0;b.clear();for(int i=0;i<=n;i++)vis[i]=0;for(int i=1;i<=n/2;i++)cin>>a[i];for(int i=1;i<=n/2;i++){if(!vis[a[i]])vis[a[i]]=1;else {cout<<-1<<"\n";return;}}	int c1=0,c2=0;for(int i=1;i<=n;i++){if(!vis[i]){b.push_back(i);c1++;}else {c2++;if(c1<c2){cout<<-1<<"\n";return;}}}sort(b.begin(),b.end());for(int i=n/2;i>=1;i--){int p=lower_bound(b.begin(),b.end(),a[i])-b.begin()-1;ans[i]=b[p];b.erase(b.begin()+p);}for(int i=1;i<=n/2;i++){cout<<ans[i]<<" "<<a[i]<<" ";}cout<<"\n";}signed main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int t;cin>>t;while(t--){solve();}return 0;
}

这篇关于1759G-Restore the Permutation的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/997332

相关文章

Android canvas save restore saveLayer的异同点

一、基础操作 drawText、drawRect、drawColor等 对于这些基础操作,相信每一个安卓开发者都能说上个一二点出来,这些就不多做介绍,api 工程师必备技能之一。 在进阶之前,先回答这个问题:    问:canvas既然大家都理解为画布,那如果先在画布上绘制了某些内容,然后再canvas.rotate旋转了画布,为什么这些已经绘制在画布上的内容不会跟随着旋转?    答:由此可

【ZOJ】3874 Permutation Graph 【FFT+CDQ分治】

传送门:【ZOJ】3874 Permutation Graph 题目分析: 容易知道一个个连通块内部的标号都是连续的,否则一定会有另一个连通块向这个连通块建边,或者这个连通块向另一个连通块建边。而且从左到右左边的连通块内最大的标号小于右边连通块内最小的标号。 然后我们可以构造dp方程: dp[n]=n!−i!∗dp[n−i] \qquad \qquad dp[n] = n! - i! *

CodeForces 404C Restore Graph

题意: n个点的图  最大度为k  已知从某个点到每个点的距离dis[i]  求  这幅图的边 思路: 告诉了距离  很容易想到dis是从距离为0的那个点开始bfs求出来的 那么复原这幅图的办法就是重新构造这棵bfs形成的树就好了 每层利用点数计算一下是不是违反了最大度k的限制 这里注意  只有dis=0的那个点可以连出k条边  其余的只有k-1条(因为它们还和父亲连着一条边)

LeetCode 31 Next Permutation

题意: 给出一串数字,求该排列的下一个排列。如果该排列为字典序最大排列,则输出字典序最小排列。 思路: 首先C++里面有求下一个排列的函数next_permutation,该函数返回0即表示当前排列字典序最大。 如果要自己动手实现,那么就考虑“如何找到比当前排列大1的排列”。 假设排列A(aaaXddd)比排列B(aaaYfff)大1,a部分为两排列相同部分,X与Y表示最靠左边不同

String Permutation

Given two strings, write a method to decide if one is a permutation of the other. Example Example 1:Input: "abcd", "bcad"Output: TrueExample 2:Input: "aac", "abc"Output: False 思路:count比较一下就可以;

自定义控件(10)---Canvas的save、restore方法的Stack思想

裁剪画布(clip系列函数) protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub super.onDraw(canvas); canvas.drawColor(Color.RED); canvas.clipRect(new Rect(100, 100, 200, 200)); ca

Leetcode142: Restore IP Addresses

Given a string containing only digits, restore it by returning all possible valid IP address combinations. For example: Given "25525511135", return ["255.255.11.135", "255.255.111.35"]. (Order do

numpy.random中的shuffle和permutation

shuffle: 沿着第一个axis打乱子数组的顺序,但是内容不变,相当于沿着第一个axis把array切成n个sub-array,然后打乱sub-array的顺序。(如果只有一维就只打乱元素) >>> arr = np.arange(9).reshape((3, 3))>>> np.random.shuffle(arr)>>> arrarray([[3, 4, 5],[6, 7, 8]

numpy.random.permutation

随机排列一个序列,返回一个排列的序列。 >>> np.random.permutation(10) array([1, 7, 4, 3, 0, 9, 2, 5, 8, 6]) >>> np.random.permutation([1, 4, 9, 12, 15]) array([15,  1,  9,  4, 12]) >>> arr = np.arange(9).reshape((3, 3))

MSRCR(Multi-Scale Retinex with Color Restore)

引言 始于Edwin Herbert Land(埃德温·赫伯特·兰德)于1971年提出的一种被称为色彩恒常的理论,并基于此理论的图像增强方法。Retinex这个词由视网膜(Retina)和大脑皮层(Cortex)合成而来.之所以这样设计,表明Land他也不清楚视觉系统的特性究竟取决于此两个生理结构中的哪一个,抑或两者都有关系。不同于传统的图像增强算法,如线性、非线性变换、图像锐化等只能增强图像