codeforces 1209/C Paint the Digits 观察
Posted oieredsion
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了codeforces 1209/C Paint the Digits 观察相关的知识,希望对你有一定的参考价值。
题意
给你一个序列
问你能否选出两个序列 然后拼接
是他们成为有序的序列 输出方案
解:
说下我的思路
开始我吧题目看错了以为求的是单调递减的。。。
这题考的是贪心加观察
后来才发现
然后我又试了lis 树状数组 都不行
最后我发现对于一个序列 最终状态一定是有序的
那么我们不妨对于这个序列首先进行双关键字排序
然后 最小的一个一定是1 然后 我们对于每一个必须为1 的标上1
注意判断重复元素
code:
//
// main.cpp
// sadf
//
// Created by ALEZ on 2019/9/15.
// Copyright ? 2019 比赛. All rights reserved.
//
#include<iostream>
#include<cstdio>
#include<stdio.h>
#include<algorithm>
using namespace std;
#define maxnn 2000000
struct node
int val,id;
ed[maxnn];
int mask[maxnn];
int tot=0;
string s;
bool cmp(node a,node b)
if(a.val==b.val)
return a.id<b.id;
return a.val<b.val;
int T,n;
int k[maxnn];
int main()
cin>>T;
while(T--)
for(int i=1;i<=n;i++)mask[i]=0,k[i]=0;
cin>>n;
tot=0;
cin>>s;
for(int i=0;i<s.size();i++)
ed[++tot].id=i+1;
ed[tot].val=s[i]-'0';
sort(ed+1,ed+1+tot,cmp);
int biao=0;
int las=ed[1].id;
k[ed[1].id]=1;
mask[ed[1].id]=1;
int fla=0;
int p=0;
for(int i=2;i<=tot;i++)
if(biao)
if(ed[i].val>ed[biao].val) break;
if(p)
if(ed[p].val==ed[i].val)p=0;
else break;
if(ed[i].id<las)
fla=1;
p=i;
biao=i;
continue;
k[ed[i].id]=1;
mask[ed[i].id]=1;
las=ed[i].id;
if(fla)
int u=1;
while(mask[ed[u].id])u++;
las=ed[u].id;
k[ed[u].id]=2;
mask[ed[u].id]=1;
for(int i=u;i<=tot;i++)
if(mask[ed[i].id])continue;
if(las>ed[i].id)continue;
k[ed[i].id]=2;
mask[ed[i].id]=1;
las=ed[i].id;
int ffla=1;
for(int i=1;i<=tot;i++)
if(!k[i])ffla=0;
if(ffla==0)
puts("-");
continue;
else
for(int i=1;i<=tot;i++)
cout<<k[i];
cout<<endl;
以上是关于codeforces 1209/C Paint the Digits 观察的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces 1244D Paint the Tree(染色+排列)
Codeforces Round #124 (Div. 1) C. Paint Tree(极角排序)
Paint it really, really dark gray CodeForces - 717E
CodeForces 1244D. Paint the Tree