CF 496E Distributing Parts

來源:互聯網
上載者:User

標籤:style   blog   ar   io   color   sp   for   on   div   

通過這題我才知道lower_bound(set),和set::lower_bound完全他媽不一樣。。前者O(n)後者O(logn),去他媽的。。。。

思路:

  另要被覆蓋的線段為a[i],覆蓋它的先端為b[i]

  對要被覆蓋的線段的左端點及a[i].lef進行離散化,然後從小到大掃描過去,如果b[i].lef<=掃描線的值就把<b[i].rig,i>加入set,如果b[i].rig<掃描線的值就從set裡面刪除<b[i].rig,i>,然後就處理詢問了,從set裡面找到離a[i].rig最近的即可。

#include <cstdio>#include <cstring>#include <set>#include <algorithm>using namespace std;#define N 100000struct Node{    int lef,rig,val,laber;} a[N+20],b[N+20];int c[N+20],ans[N+20];bool vist[N+20];set<pair<int,int> > heap;bool cmp1(const Node &x,const Node &y){    return x.lef<y.lef||(x.lef==y.lef&&x.rig<y.rig);}int main(){    //freopen("input","r",stdin);    int n;    scanf("%d",&n);    int cnt = 0;    for (int i=0; i<n; i++)    {        scanf("%d%d",&a[i].lef,&a[i].rig);        a[i].laber = i;        c[cnt++] = a[i].lef;    }    int m;    scanf("%d",&m);    for (int i=0; i<m; i++)    {        scanf("%d%d%d",&b[i].lef,&b[i].rig,&b[i].val);        b[i].laber = i;    }    sort(a,a+n,cmp1);    sort(b,b+m,cmp1);    sort(c,c+n);    int len = unique(c,c+n) - c;    int bl = 0, br = 0;    int k = 0;    for (int i=0; i<len&&k<n; i++)    {        while (b[bl].lef<=c[i]&&bl<m)        {            heap.insert(pair<int,int>(b[bl].rig,bl));            bl++;        }        while (b[br].rig<c[i]&&br<m)        {            if (!vist[br]) heap.erase(pair<int,int>(b[br].rig,br));            br++;        }        while (a[k].lef==c[i]&&k<n)        {            if (heap.empty())            {                printf("NO\n");                return 0;            }            set<pair<int,int> >::iterator it = heap.lower_bound(pair<int,int>(a[k].rig,-1));            if (it==heap.end())            {                printf("NO\n");                return 0;            }            pair<int,int> j = *it;            ans[a[k].laber] = b[j.second].laber;            b[j.second].val--;            //printf("%d %d\n",j.second,b[j.second].val);            if (b[j.second].val==0)            {                heap.erase(it);                vist[j.second] = true;            }            k++;        }    }    printf("YES\n");    for (int i=0; i<n; i++) printf("%d ",ans[i]+1);    printf("\n");    return 0;}

 

CF 496E Distributing Parts

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.