2018山东省赛 E Sequence ( 思维 )

题目链接

题意 : 给出一个排列,让你删除一个数,使得删除后整个序列的 Good 数数量最多。Good 数的定义为 若 Ai 为 Good 则存在 Aj < Ai ( j < i )

分析 : 

画画几个规律就能得出如下几个结论

① 若删除一个 Good 数,则原序列 Good 数的数量只会减一,即只会影响到这个 Good 数本身

这个也不难证明,若 Ai 是 Good 数,则存在  Aj < Ai ( j < i )

考虑当前有 Good 数 Ak 因删除 Ai 而变成非 Good 数,这个显然是不成立的

因为 Ai 是 Good 数的前提是存在 Aj 而 Aj 的存在就已经能够保证 Ak 是 Good 数了

故没有除了 Ai 以外的 Good 数因为 Ai 的删除被影响

② 如果一个数是非 Good 数,则这个数一定是从第一个数到这个数为止最小的数

③ 若删除的是一个非 Good 数,则去考虑有哪几个数因此被影响,即从 Good 变成 非 Good

删除一个非 Good 数那么影响到的只可能是其右边的数

那么考虑哪些数会因为这个数被删除就直接变成非 Good 数呢?

根据 ② 知道从头开始到这个非 Good 数,这个非 Good 数是最小的数

那么从这个非 Good 数开始向右延伸,如果右边的数是从头开始算起第二小的数

即它只比这个非 Good 数大的话,那么一旦删除这个非 Good 数,这个第二小的数必定变成非 Good

举个例子 1 4 3 2 这个排列,对于 4 其是从 1 开始算起第二小的数,如果 1 这个非 Good 数被删除

则 4 将变成非 Good ,而 3、2 同理,所以删除 1 必将影响 3 个数

那么到现在为止,算法就可以基本成型了

删除一个 Good 数原数列减少一个 Good 数

删除一个非 Good 我们可以预处理前缀最值和次大值来统计每个非 Good 的删除影响

最后选出代价最小且相同代价下最小的数即可

#include<bits/stdc++.h>
#define LL long long
#define ULL unsigned long long

#define scs(i) scanf("%s", i)
#define sci(i) scanf("%d", &i)
#define scd(i) scanf("%lf", &i)
#define scl(i) scanf("%lld", &i)
#define scIl(i) scanf("%I64d", &i)
#define scii(i, j) scanf("%d %d", &i, &j)
#define scdd(i, j) scanf("%lf %lf", &i, &j)
#define scll(i, j) scanf("%lld %lld", &i, &j)
#define scIll(i, j) scanf("%I64d %I64d", &i, &j)
#define sciii(i, j, k) scanf("%d %d %d", &i, &j, &k)
#define scddd(i, j, k) scanf("%lf %lf %lf", &i, &j, &k)
#define sclll(i, j, k) scanf("%lld %lld %lld", &i, &j, &k)
#define scIlll(i, j, k) scanf("%I64d %I64d %I64d", &i, &j, &k)

#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
#define lowbit(i) (i & (-i))
#define mem(i, j) memset(i, j, sizeof(i))

#define fir first
#define sec second
#define ins(i) insert(i)
#define pb(i) push_back(i)
#define pii pair<int, int>
#define mk(i, j) make_pair(i, j)
#define pll pair<long long, long long>
using namespace std;
const int maxn = 1e6 + 10;
const int INF = 0x3f3f3f3f;
int Min1[maxn], Min2[maxn], arr[maxn], cnt[maxn];
bool isGood[maxn];
int n, nCase;

int main(void)
{
    sci(nCase);
    while(nCase--){

        mem(isGood, true);

        sci(n);
        for(int i=1; i<=n; i++) sci(arr[i]);

        int MM1 = INF, MM2 = INF;
        for(int i=1; i<=n; i++){

            if(arr[i] < MM1){
                MM2 = MM1;
                MM1 = arr[i];
            }else if(arr[i] < MM2) MM2 = arr[i];

            Min1[i] = MM1, Min2[i] = MM2;

            if(arr[i] == MM1) isGood[i] = false;
        }

        int idx;
        for(int i=1; i<=n; i++){
            if(!isGood[i]){
                idx = i;
                cnt[i] = 0;
            }else if(arr[i] == Min2[i]) cnt[idx]++;
        }

        int ans = INF;
        for(int i=1; i<=n; i++){///如果是非 Good 而且删除还没任何影响
            if(!isGood[i] && cnt[i] == 0){ ///则选出最小的这种数作为答案。
                ans = min(ans, arr[i]);
            }
        }

        if(ans == INF){
            for(int i=1; i<=n; i++){
                if(!isGood[i] && cnt[i] == 1) ans = min(ans, arr[i]);
                else if(isGood[i]) ans = min(ans, arr[i]);
            }
        }

        printf("%d\n", ans);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/Rubbishes/p/9074460.html

时间: 2024-07-31 06:41:21

2018山东省赛 E Sequence ( 思维 )的相关文章

2018山东省赛补题

题目链接 https://www.nowcoder.com/acm/contest/123/E 题解 https://www.cnblogs.com/Rubbishes/p/9074460.html #include <bits/stdc++.h> using namespace std; const int MAXN=1000005; int cnt[MAXN]; int main() { int t; while(~scanf("%d",&t)) { while

山东省赛题 NEU OJ 1444 线段树双标记

http://acm.neu.edu.cn/hustoj/problem.php?id=1444 OJ问题论坛发帖http://t.cn/zjBp4jd FAQ http://t.cn/zjHKbmN Linux问题看http://t.cn/aWnP1n 1444: Devour Magic 时间限制: 1 Sec  内存限制: 256 MB 提交: 129  解决: 21 [提交][状态][讨论版] 题目描述 In Warcraft III, Destroyer is a large flyi

第五届山东省赛总结

这次比赛在HITWH,10号我们早早的坐车来到了威海,然后随便逛了逛,吃了饭,就是热身赛. 热身赛题目比较坑爹,尤其是A题,要求区间素数个数,给的数据是10^7,我写了一个却WA了.后来得知有10^9的情况,感觉一下成了神题,我想了好久也没思路,结束后得知大于10^7的数全部当成10^7做,太坑.但这样都有人能AC,真是膜拜.B题是要交一个随机数,RP比较好,2A.C据说是概率DP,我不会也没仔细看. 之后是开幕式,完了以后我一个人回了宾馆,跟山大威海的同学吃了一顿,随后回去看了看电视就睡了.

hdu1212 Big Number &amp;第六届山东省赛Single Round Math (同余定理,大数取模)

题目链接:Big Number 题目大意:每次输入两个数,第一个是高精度,第二个数小于100000:求 a mod b 根据同余定理: (a+b)% c = (a%c+ b%c)%c (a*b)%c =  ( a%c* b%c)%c 所以 对于大数,例如 :123 可以这样分解 123 =  (1*10+2)*10 + 3: 123 % c =   (  (  (  1%c *  10%c)%c + 2%c) %c  * 10%c) + 3 %c  ) %c; 因此,我们用字符串处理这个数,通过

山东省历届省赛No.1 思维部分

Problem A:Rescue The Princess Description Several days ago, a beast caught a beautiful princess and the princess was put in prison. To rescue the princess, a prince who wanted to marry  the princess set out immediately. Yet, the beast set a maze. Onl

2018山东省省赛赛后感想

省赛已经结束一天的了,但一直犹豫着不知道写点什么,这是我第一次参加这样规模庞大的比赛,说实话内心还是非常激动外加开心的,因为我在加入ACM之前从未参加过竞赛,第一次参加这样的赛事,多少紧张些,幸亏队友的宽容和鼓励,我记得在打热身赛时,我紧张的不行,一道水题写了快一个小时,把队友急坏了,但感谢他们耐心的帮助我,没有因此责怪我,我们做的还算顺利,也有老师和学长的指导,帮助我们熟悉做题和交题的系统,还传授我们比赛的经验以及一些特殊情况的处理方法,很受用.好在有了热身赛的准备和熟悉,正式赛开始的时候,我

13年山东省赛 Boring Counting(离线树状数组or主席树+二分or划分树+二分)

转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud 2224: Boring Counting Time Limit: 3 Sec  Memory Limit: 128 MB Description In this problem you are given a number sequence P consisting of N integer and Pi is the ith element in the sequence.

第6届山东省赛总结帖

又是一年省赛时.在这次省赛之前,窝们队刚经历了换队友风波,这次终于有了一个稳定,积极,一起为共同的目标而努力的队伍.在以很快的速度换完队友之后,距省赛还有不到两个月了.于是每周四在CF的gym上自加一场练习赛,然后加上周末的周赛,每周双赛,跟新队友ly之间的配合也越来越好.我总算把剩下的不算很难的图论知识点都刷完了,+cai也刷了一大堆数据结构,ly也刷了很多数学.(于是计算几何仍然没人刷..). 这次能拿到第4名金牌的成绩,窝们自己在赛前根本没想到会拿到这个成绩.之前的目标就是金牌,根据我们了

第六届山东省赛总结贴

省赛结束快两个星期辣,原谅弱到现在才写总结,拖延症晚期路过(逃. 其实觉得自己挺幸运的,省赛前因为各种原因和FF and +才组队,然后瞬间抱上大腿,完美蜕变,成为一名辅助,走上人生巅峰. 一群不会起名字的BD,在FF偶尔听到的一首歌里我们选了呢个乐队的名字Dreamtale(梦境传说,瞬间像磕了药一样,精神抖擞.当时距离省赛还有两个月不到的时间,为了磨合也是锻炼,每周四下午都要打一场比赛,加上周六的比赛,一周双开.其实初学当一名辅助也是很坎坷的,开始周四做的是往年省赛的题目,初学辅助有的细节方