zoukankan      html  css  js  c++  java
  • 决斗[雅礼集训 2017 Day10]

    SOL:我们可以证明,设Sum[x]代表1到X编号的矮人被sum[x]个精灵挑为对手,则Sum[x]-x min的位置和其后一个是没有任何关系的(没有精灵会从这个矮人走向下一个矮人)。

    那么我们就把其拆成了单链。贪心就好。

    #pragma GCC optimize("O2")
    #include<bits/stdc++.h>
    #define sight(c) ('0'<=c&&c<='9')
    #define N 500031
    #define eho(x) for(int j=head[x];j;j=net[j])
    inline void read(int &x){
        static char c;
        for (c=getchar();!sight(c);c=getchar());
        for (x=0;sight(c);c=getchar())x=x*10+c-48;
    }
    using namespace std;
    void write(int x) {if (x<10) {putchar('0'+x);return;} write(x/10); putchar('0'+x%10);}
    inline void writeln(int x) {if (x<0) putchar('-'),x*=-1; write(x); putchar('
    ');}
    int a[N],c[N],d[N],g[N],n,t,ans,mn,head[N],net[N],fall[N],tot,sum,k;
    inline void add(int x,int y) {fall[++tot]=y; net[tot]=head[x];head[x]=tot;}
    bool b[N];
    set<int> S;
    set<int> ::iterator it;
    int main () {
    //  freopen("b.in","r",stdin);
        read(n); mn=1e9;
        for (int i=1;i<=n;i++) read(a[i]),g[a[i]]++,add(a[i],i);
        for (int i=1;i<=n;i++) read(c[i]);
        for (int i=1;i<=n;i++) read(d[i]);
        for (int i=1;i<=n;i++) { sum=sum+g[i]; 
          if (mn>sum-i) mn=sum-i,k=i;
        }
        for (int i=1;i<=n;i++) {
            if (++k>n) k=1;
            eho(k) 
             S.insert(d[fall[j]]);
            it=S.upper_bound(c[k]);
            if (it==S.end()) S.erase(*S.begin());
            else ans++,S.erase(*it);
        }
        writeln(ans);
    }
  • 相关阅读:
    仿苹果原生头部动画
    cookie VS sessionstorge VS localstorge
    require实现单页应用程序(SPA)
    物体position:absolute后设置left:50%发生的有趣小事
    C/JS_实现选择排序
    C/JS_实现冒泡排序
    C_求质数
    C/JS_二分法查找
    JS_高程6.面向对象的程序设计(2)创建对象_3 构造函数存在的问题
    CSS_常见布局
  • 原文地址:https://www.cnblogs.com/rrsb/p/8215157.html
Copyright © 2011-2022 走看看