codeforce #631 div2

A. Dreamoon and Ranking Collection

给定一个序列,和一个\(x\)\(x\)可以代替任意的值,求最大的\(v\)满足\(1\sim v\)的值全部可以出现
从1 开始枚举就可以,当前值没有,只要\(x\)有剩余就补充。

Code

#include <bits/stdc++.h>
using namespace std;
int a[110];
void solve(){
	unordered_map<int,bool>p;
	int n,x;
	cin>>n>>x;
	for(int i=0;i<n;i++){
		int x;
		cin>>x;
		p[x]=1;
	}
	int ans=0;
	for(int i=1;i<=10000;i++){
		if(!x && !p[i]) break;
		if(!p[i] && x) x--;
		ans=i;
	}
	cout<<ans<<endl;
}
int main(){
	int t;
	cin>>t;
	while(t--){
		solve();
	}
}

B. Dreamoon Likes Permutations

给定一个长为n的序列,求可能的划分使的左右两边都是从1开始的排列,输出可能的划分数量,和具体划分左右的长度
前缀和判断不可行,存在数据使得刚好等于等差数列的和但不是排列
保证了输入的数字 \(\leq n-1\),当左右区间内部都没有重复的数字且最大值等于各自的区间长度的时候为合法的一组解

Code

#include <bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int a[N];
int mxl[N];
int mxr[N];
void solve(){
	memset(mxl,0,sizeof mxl);
	memset(mxr,0,sizeof mxr);
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	set<int>s;
	int l=0,r=0;
	for(int i=1;i<=n;i++){
		if(s.find(a[i])==s.end())
			s.insert(a[i]);
		else {
			l=i-1;
			break;
		}
	}
	s.clear();
	for(int i=n;i>=1;i--){
		if(s.find(a[i])==s.end())
			s.insert(a[i]);
		else {
			r=i+1;
			break;
		}
	}
	vector<int>ans;
	for(int i=1;i<=n;i++) mxl[i]=max(mxl[i-1],a[i]);
	for(int i=n;i>=1;i--) mxr[i]=max(mxr[i+1],a[i]);
	for(int i=1;i<n;i++){
		if(i<=l && i+1>=r && mxl[i]==i && mxr[i+1] == n-i)
			ans.push_back(i);
	}
	if(ans.size()){
		cout<<ans.size()<<endl;
		for(auto i:ans)
			cout<<i<<' '<<n-i<<endl;
	}
	else puts("0");
}
int main(){
	int t;
	cin>>t;
	while(t--){
		solve();
	}
	return 0;
}

C. Dreamoon Likes Coloring

给定待染色的区间长度\(n\)\(m\)个染色长度序列 \(l\) ,每个 \(l_{i}\) 必须完全染色区间\(n\)长度为 \(l_{i}\) 的一段,
并且所有染色后,\(m\)种颜色都必须存在序列中,整个\(n\)都被染色。
判断整个所有的总和如果\(<n\)那不管怎么染色都不会将整个染色。
因为每个颜色必须存在,所以最极端的情况是每个 \(L_{i}\) 都从当前点开始,否则前面某种颜色就会被覆盖
如果\(L_{i}+i-1>n\)存在,即当前长度在序列无法满足。
初始化,\(L_{i}\)都从\(i\)开始染色,这是满足了不重复的情况重复覆盖最多的情况。
因为后染色的会将先染色的覆盖,所以从后往前开始染色,覆盖后的长度不会取消前面的时候染色。
如果覆盖就break即可。

Code

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+10;
int l[N],p[N];
int main(){
	int n,m;
	cin>>n>>m;
	ll sum=0;
	for(int i=1;i<=m;i++){
		cin>>l[i];
		if(l[i]+i-1>n) {
			puts("-1");
			return 0;
		}
		sum+=l[i];
	}
	if(sum<n){
		puts("-1");
		return 0;
	}
	for(int i=1;i<=m;i++) p[i]=i;
	int t=n;
	for(int i=m;i>=1;i--){
		if(t-l[i]>i-1) {
			p[i]=t-l[i]+1;
			t-=l[i];
		}
		else break;
	}
	for(int i=1;i<=m;i++)
		cout<<p[i]<<' ';
}
posted @ 2020-05-19 23:35  Hyx'  阅读(136)  评论(0编辑  收藏  举报