首页 > 其他分享 >CF1768C 题解

CF1768C 题解

时间:2023-01-19 09:44:05浏览次数:50  
标签:Search int 题解 CF1768C cnt maxn

考虑构造。

首先第一轮构造我们把第一次出现的数放到 \(p\) 里面,第二次出现的放到 \(q\) 里面。如果有数第三次出现呢?那么显然无解。

那么现在 \(p\) 和 \(q\) 中都填了一些数,但是因为题目要求,所以填后面某个位置的数时要比这个位置已经填的数小所以把排列中没有的数存起来,按照从小到大的顺序填入即可,填的时候优先填入另一个排列对应位置较小的位置即可。显然,这是一种贪心的构造。

那么注意好代码实现就好,不要像我调了半个小时

#include<bits/stdc++.h>
//#define int long long
//#define lowbit(x) (x&-(x))
using namespace std;
const int maxn = 2e5+10;
int t;
int a[maxn],cnt[maxn];
int p[maxn],q[maxn];
int Search[maxn][2];
void work(){
	int n;
	int flag=0;
	stack<int> op;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		Search[i][0]=Search[i][1]=p[i]=q[i]=cnt[i]=0;
	}
	for(int i=1;i<=n;i++){	
		if(cnt[a[i]]==2){
			cout<<"NO\n";
			return ;
		}	
		if(cnt[a[i]]==0){
			p[i]=a[i];
			Search[a[i]][0]=i;
		}
		else{
			flag=1;
			q[i]=a[i];
			Search[a[i]][1]=i;
		}
		cnt[a[i]]++;
	}
	if(flag==0){
		cout<<"YES\n";
		for(int i=1;i<=n;i++){
			cout<<a[i]<<' ';
		}
		cout<<'\n';
		for(int i=1;i<=n;i++){
			cout<<a[i]<<' ';
		}
		cout<<'\n';
		return ;
	}
	for(int i=1;i<=n;i++) cnt[i]=0;
	for(int i=1;i<=n;i++){
		cnt[p[i]]++;
	}
	for(int i=n;i>=1;i--){
		if(cnt[i]==0){
			op.push(i);
		}
	}
	for(int i=1;i<=n;i++){
		if(p[Search[i][1]]==0){
			p[Search[i][1]]=op.top();
			op.pop();
		}
	}
	for(int i=1;i<=n;i++){
		cnt[i]=0;
	}
	for(int i=1;i<=n;i++){
		cnt[q[i]]++;
	}
	for(int i=1;i<=n;i++){
		if(cnt[i]==0)
			op.push(i);
	}
	for(int i=1;i<=n;i++){
		if(q[Search[i][0]]==0){
			q[Search[i][0]]=op.top();
			op.pop();
		}
	}
	for(int i=1;i<=n;i++){
		if(max(p[i],q[i])!=a[i]){
			cout<<"NO\n";
			return ;
		}
	}
	cout<<"YES\n";
	for(int i=1;i<=n;i++){
		cout<<p[i]<<' ';
	}
	cout<<'\n';
	for(int i=1;i<=n;i++){
		cout<<q[i]<<' ';
	}
	cout<<'\n';
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t;
cin>>t;
while(t--){
	work();
}

return 0;
}

标签:Search,int,题解,CF1768C,cnt,maxn
From: https://www.cnblogs.com/chifan-duck/p/17061079.html

相关文章

  • 题解 P2480 [SDOI2010]古代猪文
    题意求\[g^{\sum\limits_{d|n}C_n^d}\bmod999911659\]\(n,g\le10^9\)一道非常好的数论题,用到了基本所有的基础数论知识。需要使用到的数论知识欧拉定理......
  • DBeaver展示大数据表卡死问题解决
    现象:当打开大表,比如大小达到几百M,并且获取所有行时,程序会卡死,无响应,只能强制关闭原因:DBeaver是基于java开发的,非常容易的可以想到是JVM内存设置过小导致溢出解......
  • ABC285GH题解
    ABC285GH题解G可以把\(2\)的覆盖视作一对匹配,显然在网格图上是二分图。那么对于\(?\)的处理,是可以匹配也可以不匹配,\(2\)是必须匹配。所以做上下界网络流即可,复杂......
  • 题解目录
    数据结构与算法这是我的一些算法题解与算法思考。按板块不断更新,希望对你有帮助。题目来自各大主流平台,有leetcode,有洛谷,有Acwing等。现在主力更新动态规划基础系列中,适......
  • P4012 题解
    前言题目传送门!更好的阅读体验?网络流\(24\)题:最大费用最大流。思路首先我们只看每一个点。是典型的方格取数问题,可以考虑费用流。对于一个相邻的、可以走到的点\(......
  • P3549 [POI2013]MUL-Multidrink 题解--zhengjun
    其他题解都是大码量的直接构造,来一发dp的题解。思路很明确,直接dp,然后输出路径即可。考虑先把\(1\ton\)的路径找出来,记为\(a_i(1\lei\lem)\)。那么肯定存在一种......
  • 【题解】P4482 [BJWC2018]Border 的四种求法
    思路SAM+树剖。好仙的题啊,做了一天。令\(\operatorname{lcs}(i,j)\)表示长度为\(i,j\)的前缀的最长公共后缀长度,则题目中的border可以等价转化成:求最大且满足......
  • Atcoder ABC 285 题解
    E-WorkorRest题意​ 一周有\(n\)天,给出一个长度为\(n\)的数组\(A\)。你可以决定一周中的休息日与工作日的分布,请问如何选择能够使总贡献最大。​ 如何计算贡献......
  • 【题解】P4768 [NOI2018] 归程(树上倍增,Kruskal 重构树,dijkstra)
    【题解】P4768[NOI2018]归程作为一道NOI的D1T1,放在现在或许难度不够(?),但可能在Kruskal重构树还未普及的当时,还是相对来说比较难的一道题吧。写篇题解记录一下。题......
  • P5020 [NOIP2018 提高组] 货币系统 题解
    注意:此题题解写的较为简略。P5020[NOIP2018提高组]货币系统转化为完全背包即可。#include<iostream>#include<cstring>#include<algorithm>usingnamespaces......