• 2015-2016 ACM-ICPC, NEERC, Southern Subregional Contest (Online Mirror, ACM-ICPC Rules, Teams Preferred)


    2015-2016 ACM-ICPC, NEERC, Southern Subregional Contest (Online Mirror, ACM-ICPC Rules, Teams Preferred)

    题目链接:http://codeforces.com/contest/589

    I题:水题签到。

    #include<bits/stdc++.h>
    #define REP(i,a,b) for(int i=a;i<=b;i++)
    #define MS0(a) memset(a,0,sizeof(a))
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    
    using namespace std;
    
    typedef long long ll;
    const int maxn=1000100;
    const int INF=(1<<29);
    
    int cnt[maxn];
    int n,k,a;
    
    int main()
    {
        //freopen("in.txt","r",stdin);
        while(cin>>n>>k){
            MS0(cnt);
            REP(i,1,n) scanf("%d",&a),cnt[a]++;
            int x=n/k,ans=0;
            REP(i,1,k){
                ans+=abs(cnt[i]-x);
            }
            cout<<ans/2<<endl;
        }
        return 0;
    }
    View Code

    J题:水题,模拟。

    #include<bits/stdc++.h>
    #define REP(i,a,b) for(int i=a;i<=b;i++)
    #define MS0(a) memset(a,0,sizeof(a))
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    
    using namespace std;
    
    typedef long long ll;
    const int maxn=30;
    const int INF=(1<<29);
    
    int dir[maxn*maxn*maxn];
    int n,m;
    bool vis[maxn][maxn][4];
    char ch[maxn][maxn];
    int sx,sy,sdir;
    int ans;
    bool vi[maxn][maxn];
    
    void Init()
    {
        dir['L']=0;
        dir['U']=1;
        dir['R']=2;
        dir['D']=3;
    }
    
    bool can(int x,int y,int d)
    {
        if(x<1||x>n||y<1||y>m) return 0;
        return ch[x][y]=='.';
    }
    
    void dfs(int x,int y,int d)
    {
        if(vis[x][y][d]) return;
        vis[x][y][d]=1;
        if(!vi[x][y]) ans++,vi[x][y]=1;
        //cout<<x<<" "<<y<<" "<<ans<<" "<<endl;
        if(d==0){
            if(can(x,y-1,d)) dfs(x,y-1,d);
            else dfs(x,y,(d+1)%4);
        }
        else if(d==1){
            if(can(x-1,y,d)) dfs(x-1,y,d);
            else dfs(x,y,(d+1)%4);
        }
        else if(d==2){
            if(can(x,y+1,d)) dfs(x,y+1,d);
            else dfs(x,y,(d+1)%4);
        }
        else{
            if(can(x+1,y,d)) dfs(x+1,y,d);
            else dfs(x,y,(d+1)%4);
        }
    }
    
    int main()
    {
        //freopen("in.txt","r",stdin);
        Init();
        while(cin>>n>>m){
            MS0(vis);
            MS0(vi);
            REP(i,1,n){
                REP(j,1,m){
                    cin>>ch[i][j];
                    if(isupper(ch[i][j])){
                        sx=i,sy=j;
                        sdir=dir[ch[i][j]];
                        ch[i][j]='.';
                    }
                }
            }
            ans=0;
            dfs(sx,sy,sdir);
            cout<<ans<<endl;
        }
        return 0;
    }
    View Code

    B题:贪心水题。

    #include<bits/stdc++.h>
    #define REP(i,a,b) for(int i=a;i<=b;i++)
    #define MS0(a) memset(a,0,sizeof(a))
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    
    using namespace std;
    
    typedef long long ll;
    const int maxn=1000100;
    const int INF=(1<<29);
    
    int n;
    struct Node
    {
        ll a,b;
    };
    Node rec[maxn];
    vector<ll> w;
    
    bool cmp1(Node A,Node B)
    {
        if(A.a<B.a) return 1;
        if(A.a==B.a) return A.b<B.b;
        return 0;
    }
    
    int sb()
    {
        int m=0;
        int sz=(int)w.size();
        for(int i=0;i<w.size();i++){
            if(w[i]*(sz-i)>=w[m]*(sz-m)) m=i;
        }
        return m;
    }
    
    int main()
    {
        //freopen("in.txt","r",stdin);
        while(cin>>n){
            w.clear();
            REP(i,1,n){
                scanf("%I64d%I64d",&rec[i].a,&rec[i].b);
                if(rec[i].a<rec[i].b) swap(rec[i].a,rec[i].b);
                w.push_back(rec[i].b);
            }
            sort(rec+1,rec+n+1,cmp1);
            sort(w.begin(),w.end());
            ll ans=0,ansx,ansy;
            REP(i,1,n){
                int p=sb();
                ll x=rec[i].a,y=w[p];
                ll cnt=(int)w.size()-p;
                if(x*y*cnt>ans){
                    ans=x*y*cnt;
                    ansx=x;ansy=y;
                }
                vector<ll>::iterator it=find(w.begin(),w.end(),rec[i].b);
                w.erase(it);
            }
            cout<<ans<<endl;
            cout<<ansx<<" "<<ansy<<endl;
        }
        return 0;
    }
    View Code

    F题:二分+贪心+线段树。二分是二分时间t。贪心是给右端点排序以确定安排的优先级,分类讨论可证明贪心的正确性。线段树是区间更新和统计可用的时间。

    #include<bits/stdc++.h>
    #define REP(i,a,b) for(int i=a;i<=b;i++)
    #define MS0(a) memset(a,0,sizeof(a))
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    
    using namespace std;
    
    typedef long long ll;
    const int maxn=100100;
    const int INF=(1<<29);
    
    int n;
    struct Node
    {
        int s,t;
        friend bool operator<(Node A,Node B)
        {
            if(A.t<B.t) return 1;
            if(A.t==B.t) return A.s<B.s;
            return 0;
        }
    };Node dish[maxn];
    struct SegTree
    {
        int l,r;
        int cnt;
        int lazy;
        int id;
    };SegTree T[maxn<<2];
    const int N=100010;
    
    void push_up(int rt)
    {
        T[rt].cnt=T[rt<<1].cnt+T[rt<<1|1].cnt;
    }
    
    void push_down(int rt)
    {
        if(T[rt].lazy){
            T[rt<<1].lazy=T[rt<<1|1].lazy=1;
            T[rt<<1].cnt=T[rt<<1|1].cnt=0;
            T[rt].lazy=0;
        }
    }
    
    void build(int l,int r,int rt)
    {
        T[rt].l=l;T[rt].r=r;
        T[rt].lazy=0;
        if(l==r){
            T[rt].cnt=1;
            T[rt].id=l;
            return;
        }
        push_down(rt);
        int m=(l+r)>>1;
        build(lson);
        build(rson);
        push_up(rt);
    }
    
    void update(int L,int R,int l,int r,int rt)
    {
        if(L<=l&&r<=R){
            T[rt].lazy=1;
            T[rt].cnt=0;
            if(l==r) T[rt].lazy=0;
            return;
        }
        push_down(rt);
        int m=(l+r)>>1;
        if(L<=m) update(L,R,lson);
        if(R>m) update(L,R,rson);
        push_up(rt);
    }
    
    int query_cnt(int L,int R,int l,int r,int rt)
    {
        if(L<=l&&r<=R) return T[rt].cnt;
        push_down(rt);
        int m=(l+r)>>1;
        int res=0;
        if(L<=m) res+=query_cnt(L,R,lson);
        if(R>m) res+=query_cnt(L,R,rson);
        return res;
    }
    
    int query_pos(int p,int l,int r)
    {
        while(l<r){
            int m=(l+r)>>1;
            int lcnt=query_cnt(l,m,1,N,1);
            if(lcnt>=p) r=m;
            else p-=lcnt,l=m+1;
        }
        return l;
    }
    
    bool check(int t)
    {
        build(1,N,1);
        REP(i,1,n){
            int L=dish[i].s,R=dish[i].t;
            int cnt=query_cnt(L,R,1,N,1);
            if(cnt<t) return 0;
            int a=query_pos(1,L,R),b=query_pos(t,L,R);
            update(a,b,1,N,1);
        }
        return 1;
    }
    
    int bin(int l,int r)
    {
        int res=0;
        while(l<r){
            int m=(l+r)>>1;
            if(check(m)) l=m+1,res=max(res,m);
            else r=m;
        }
        return res;
    }
    
    int main()
    {
       // freopen("in.txt","r",stdin);
        while(cin>>n){
            REP(i,1,n) scanf("%d%d",&dish[i].s,&dish[i].t),dish[i].s++;
            sort(dish+1,dish+n+1);
            cout<<bin(0,N)*n<<endl;
        }
        return 0;
    }
    View Code
    没有AC不了的题,只有不努力的ACMER!
  • 相关阅读:
    Why Choose Jetty?
    Jetty 的工作原理以及与 Tomcat 的比较
    Tomcat设计模式
    Servlet 工作原理解析
    Tomcat 系统架构
    spring boot 打包方式 spring boot 整合mybaits REST services
    wireshark udp 序列号 User Datagram Protocol UDP
    Maven 的聚合(多模块)和 Parent 继承
    缓存策略 半自动化就是mybaitis只支持数据库查出的数据映射到pojo类上,而实体到数据库的映射需要自己编写sql语句实现,相较于hibernate这种完全自动化的框架我更喜欢mybatis
    Mybatis解决sql中like通配符模糊匹配 构造方法覆盖 mybits 增删改
  • 原文地址:https://www.cnblogs.com/--560/p/4890362.html
Copyright © 2020-2023  润新知