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;
    }
}

原文地址:https://www.cnblogs.com/OIEREDSION/p/11525354.html

时间: 2024-11-10 13:33:42

codeforces 1209/C Paint the Digits 观察的相关文章

[codeforces 509]C. Sums of Digits

试题描述 Vasya had a strictly increasing sequence of positive integers a1, ..., an. Vasya used it to build a new sequence b1, ..., bn, where bi is the sum of digits of ai's decimal representation. Then sequence ai got lost and all that remained is sequen

【CodeForces 915 C】Permute Digits(思维+模拟)

You are given two positive integer numbers a and b. Permute (change order) of the digits of a to construct maximal number not exceeding b. No number in input and/or output can start with the digit 0. It is allowed to leave a as it is. Input The first

Codeforces - 346A - Alice and Bob - 简单数论

http://codeforces.com/problemset/problem/346/A 观察了一下,猜测和他们的最大公因数有关,除以最大公因数前后结果是不会变的. 那么怎么证明一定是有n轮呢?我猜就是因为现在至少有几个是互质的,所以总是可以构造出1?具体怎么证明呢?还是看看别人的思路吧-- 首先最终停止的状态一定是一个等差数列,这个是毫无疑问的.设首项为d,那么肯定停止于d,2d,3d,...,n,那么很显然d就是他们的最大公因数啊--对哦?! #include<bits/stdc++.h

Codeforces Round #584 - Dasha Code Championship - Elimination Round (rated, open for everyone, Div. 1 + Div. 2)

怎么老是垫底啊. 不高兴. 似乎 A 掉一道题总比别人慢一些. A. Paint the Numbers 贪心,从小到大枚举,如果没有被涂色,就新增一个颜色把自己和倍数都涂上. #include<bits/stdc++.h> #define fec(i, x, y) (int i = head[x], y = g[i].to; i; i = g[i].ne, y = g[i].to) #define dbg(...) fprintf(stderr, __VA_ARGS__) #define F

codeforces #584 ABCD

A. Paint the Numbers Description Solution 水题 B. Koala and Lights Description Solution 模拟到1e4. C. Paint the Digits Description 给出一个序列,将序列每个值染色为1或2. 问能否给出一种染色序列使得12序列为排序后的序列. Solution 原序列排一遍序比较. 扫两遍,第一次染色1,第二次染色2. 判断染色序列是否完整覆盖原序列. 1 #include <algorithm

[Android] PorterDuff使用实例----实现新浪微博图片下载效果

先上效果图,如demo_sinaweibo.gif 由效果图,下半部分是简单的效果叠加,上半部分是新浪微博加载图片显示进度的效果,显示进度的半透明区域只与根据背景图的非透明区域叠加,背景图的透明区域仍为透明.为实现此要求,联想到APIDemos中的com.example.android.apis.graphics.Xfermodes,可以自定义组件在组件的绘制过程中设置PorterDuff.Mode即可实现.另效果图中显示当下载进度超过50%时,重新设置了背景图. 本次自定义组件选择继承Imag

css属性的选择对动画性能的影响

现在手机的占比越来越高,各种酷炫页面层出不穷,这些特效都离不开css动画.说到css动画,主流的情况也就无非这两大类:位移和形变.而我们在写一个动画特效的过程中,如何去提升它的性能呢?当然首先我们需要去了解一下基本的概念,比如浏览器渲染的工作原理等,这些我也在读了几位大牛写的相关文章后才有了一定的了解,这边我也不细说了,有兴趣的同学可以去了解一下.本次的目的简单粗暴地讲,其实就是我们应该使用什么css属性去进行动画的绘制时,能够有效的提高浏览器在渲染和绘制过程中的性能. 快速进入主题,大家先来看

codeforces 509C Sums of Digits

codeforces 509C Sums of Digits 题意: 给出n个数字各位的加和bi,求一个严格递增的数列.要求最后一个数字最小. 如: 3 2 1 -> 3 11 100 限制: 1 <= n <= 300; 1 <= bi <=300 思路: 贪心,要求最后一个数字最小,只要保证一路过来的数字都尽量小就行. 令d=b[i]-b[i-1], 如果d>0,则从最低位填起,尽量把低位填到9 如果d<=0,则先从低位开始进位,使得d>0,然后就可以转

Paint it really, really dark gray CodeForces - 717E

Paint it really, really dark gray CodeForces - 717E 题意 有一棵树 每个结点是粉色或黑色 每经过一个结点 就改变他的颜色 从1开始遍历 打印出一条路径 让所有结点都变成黑色 思路就是 每到达一个结点 就改变它的颜色 打印这个结点 然后看它的叶子结点 如果没有叶子结点 自然就返回了 有叶子结点的话 那么递归遍历 把子树里面的颜色都变成黑 返回的时候 如果该叶子节点是粉色 就可以再一次访问该叶子节点 再返回 其实这是很浪费时间的 但是题目说只要打印