• HDU5493 Queue(线段树)


    先对高度进行排序

    之后模拟插入的方法,因为我们要求比自己高的人在前面或者后面有k个

    那么如果当给定的k大于n-i那么说明非法,因为只有n-i个空位剩余,做不到要求。

    那么接下来我们考虑是前面有k个还是后面有k个,因为我们是按高度来做的,所以对k和n-i-k取个min,使得前面的空位尽可能少,这就是答案

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    typedef pair<int,int> pll;
    const int N=1e5+10;
    struct seg{
        int x,y;
    }s[N];
    struct node{
        int l,r;
        int mx;
    }tr[N<<2];
    int ans[N];
    bool cmp(seg a,seg b){
        return a.x<b.x;
    }
    void pushup(int u){
        tr[u].mx=tr[u<<1].mx+tr[u<<1|1].mx;
    }
    void build(int u,int l,int r){
        if(l==r){
            tr[u]={l,r,1};
        }
        else{
            tr[u]={l,r};
            int mid=l+r>>1;
            build(u<<1,l,mid);
            build(u<<1|1,mid+1,r);
            pushup(u);
        }
    }
    void modify(int u,int x,int d){
        if(tr[u].l==tr[u].r){
            tr[u].mx=0;
            ans[tr[u].l]=d;
            return ;
        }
        int mid=tr[u].l+tr[u].r>>1;
        if(tr[u<<1].mx>x){
            modify(u<<1,x,d);
        }
        else{
            modify(u<<1|1,x-tr[u<<1].mx,d);
        }
        pushup(u);
    }
    int main(){
        ios::sync_with_stdio(false);
        int t;
        cin>>t;
        int cnt=0;
        while(t--){
            cnt++;
            int n;
            cin>>n;
            int i;
            build(1,1,n);
            for(i=1;i<=n;i++){
                cin>>s[i].x>>s[i].y;
            }
            sort(s+1,s+1+n,cmp);
            int flag=0;
            for(i=1;i<=n;i++){
                if(n-i<s[i].y){
                    flag=1;
                    break;
                }
                int k=s[i].y;
                k=min(k,n-i-k);
                modify(1,k,s[i].x);
            }
            cout<<"Case #"<<cnt<<": ";
            if(flag){
                cout<<"impossible"<<endl;
                continue;
            }
            for(i=1;i<=n;i++){
                if(i==1)
                    cout<<ans[i];
                else
                    cout<<" "<<ans[i];
            }
            cout<<endl;
        }
        return 0;
    }
    View Code
    没有人不辛苦,只有人不喊疼
  • 相关阅读:
    MySQL 处理重复数据
    MySQL 序列使用
    MySQL 元数据
    MySQL 临时表和复制表
    MySQL 索引
    MySQL ALTER命令-修改数据表名或者修改数据表字段
    MySQL 事务
    MySQL 正则表达式
    MySQL NULL 值处理
    MySQL 排序
  • 原文地址:https://www.cnblogs.com/ctyakwf/p/14493522.html
Copyright © 2020-2023  润新知