http://codeforces.com/contest/253/problem/E

对优先级进行二分  每次给一个优先级就模拟一下看是否合格 不合格就二分调整

需要注意的地方 所给T的范围会超 int (就是这点敲代码时忽略了 wa 了很久 细节呀)  还有就是优先级没有重的情况

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<stack>
#include<set>
#include<map>
#include<queue>
#include<algorithm>
#define LL long long
using namespace std;
const int N=50005;
struct node
{
    LL t,s,p;
    int I;
    bool operator <(node x)const
    {
        return p<x.p;
    }
}mem[N];
priority_queue<node>qt;
int K;
LL ans[N];
set<LL>st;
bool cmp(node x,node y)
{
    return x.t<y.t;
}
LL run(int p,int n)
{
    mem[K].p=p;
    int k=mem[K].I;
    int l=0;
    LL tnow=0;
    while(!qt.empty()||l<n)
    {
        if(l<n&&qt.empty())
        {qt.push(mem[l]);tnow=mem[l].t;++l;}
        while(l<n)
        {
            if(mem[l].t==tnow)
            {qt.push(mem[l]);++l;}
            else
            break;
        }
        node tmp=qt.top();
        qt.pop();
        while(l<n)
        {
            if(mem[l].t-tnow<tmp.s&&mem[l].p<tmp.p)
            {qt.push(mem[l]);++l;}
            else
            break;
        }
        if(l==n||mem[l].t-tnow>=tmp.s)
        {
            tnow+=tmp.s;
            tmp.s=0;
        }else
        {
            tmp.s-=(mem[l].t-tnow);
            tnow=mem[l].t;
        }
        if(tmp.s==0)
        {
            ans[tmp.I]=tnow;
        }else
        {
            qt.push(tmp);
        }
    }
    return ans[k];
}
int main()
{
    //freopen("data.in","r",stdin);
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        st.clear();
        for(int i=0;i<n;++i)
        {
            cin>>mem[i].t>>mem[i].s>>mem[i].p;
            mem[i].I=i;
            st.insert(mem[i].p);
        }
        LL T;
        cin>>T;
        sort(mem,mem+n,cmp);
        for(int i=0;i<n;++i)
        if(mem[i].p==-1)
        K=i;
        LL l=1,r=1e9,mid;
        while(st.find(l)!=st.end())
        ++l;
        while(st.find(r)!=st.end())
        --r;
        while(l<=r)
        {
            mid=(l+r)>>1;
            while(st.find(mid)!=st.end())
            ++mid;
            LL t=run(mid,n);
            if(t==T)
            break;
            if(t<T)
            r=mid-1;
            else
            l=mid+1;
            if(st.find(l)!=st.end())
            ++l;
            while(st.find(r)!=st.end())
            --r;
        }
        cout<<mem[K].p<<endl;
        for(int i=0;i<n;++i)
        cout<<ans[i]<<" ";
        printf("\n");
    }
    return 0;
}

  

 

 

posted on 2012-12-11 19:28  夜->  阅读(193)  评论(0编辑  收藏  举报