1. 程式人生 > >P3740 貼海報

P3740 貼海報

algorithm man source return lse LG 離散化 AC 必須

P3740 貼海報

很顯然,這個題是讓我們維護一個區間的信息

可以考慮線段樹。可是這個題,正向思維可能並不可做。

所以我們考慮逆向思維。

打個比方,你是一名保潔人員。面對已經粘在墻上的,大大小小的廣告。你想要將他們撕下來。

而且你是一個有點強迫癥的的人(溜

你總是每天快要下班時打掃,而且他們貼小廣告的順序你也都知道。而且特別強迫癥地必須按照順序,一張一張地撕下來。

有可能你撕小廣告的時候,一張小廣告已經被撕成好多條,但你還是要必須將這幾條一起撕下來。

為了消遣,你想知道你一共撕下來多少張小廣告(重疊的算一張)

就像這樣:技術分享圖片

你將最後貼的一張撕下來,變成了這樣:

技術分享圖片,這就算一次

然後需要離散化

#include<cstdio>
#include<iostream> #include<algorithm> using namespace std; const int manx=1100; int val[manx<<2],tag[manx<<2]; int data[manx<<1],tail; int base[manx<<1],k; struct node { int l,r; }; node line[manx]; void make_base() { int now=-0x7fffffff; for(int i=1;i<=tail;i++) if
(now!=data[i]) { now=data[i]; base[++k]=now; } return ; } int find(int val) { int l=1,r=k; int mid; while(l<r) { mid=(l+r)>>1; if(base[mid]<val) l=mid+1; else r=mid; } return l; } void build(int
root,int l,int r) { val[root]=base[r+1]-base[l]; tag[root]=0; if(l==r) return ; int mid=(l+r)>>1; build(root<<1,l,mid); build(root<<1|1,mid+1,r); } void push_down(int root) { if(tag[root]) { val[root<<1]=0;val[root<<1|1]=0; tag[root<<1]=1;tag[root<<1|1]=1; tag[root]=0; } return ; } void push_up(int root) { val[root]=val[root<<1]+val[root<<1|1]; return ; } int check(int root,int l,int r,int al,int ar) { if(l>ar||r<al) return 0; if(l>=al&&r<=ar) return val[root]; int mid=(l+r)>>1; push_down(root); return check(root<<1,l,mid,al,ar)+ check(root<<1|1,mid+1,r,al,ar); } void updata(int root,int l,int r,int al,int ar) { if(l>ar||r<al) return ; if(l>=al&&r<=ar) { val[root]=0; tag[root]=1; return ; } int mid=(l+r)>>1; push_down(root); updata(root<<1,l,mid,al,ar); updata(root<<1|1,mid+1,r,al,ar); push_up(root); return ; } int main() { int n,m; scanf("%d%d",&n,&m); int a,b; for(int i=1;i<=m;i++) { scanf("%d%d",&a,&b); data[++tail]=a; data[++tail]=b+1; line[i].l=a;line[i].r=b+1; } sort(data+1,data+1+tail); make_base(); build(1,1,k-1); int ans=0; for(int i=m;i>=1;i--) { int pos1=find(line[i].l),pos2=find(line[i].r); if(check(1,1,k-1,pos1,pos2-1)) ans+=1; updata(1,1,k-1,pos1,pos2-1); } printf("%d",ans); }

P3740 貼海報