1. 程式人生 > >P3740 [HAOI2014]貼海報

P3740 [HAOI2014]貼海報

void line 表示 覆蓋問題 bits 模版 長方形 light 所有

題目描述

Bytetown城市要進行市長競選,所有的選民可以暢所欲言地對競選市長的候選人發表言論。為了統一管理,城市委員會為選民準備了一個張貼海報的electoral墻。

張貼規則如下:

  1. electoral墻是一個長度為N個單位的長方形,每個單位記為一個格子;

  2. 所有張貼的海報的高度必須與electoral墻的高度一致的;

  3. 每張海報以“A B”表示,即從第A個格子到第B個格子張貼海報;

  4. 後貼的海報可以覆蓋前面已貼的海報或部分海報。

現在請你判斷,張貼完所有海報後,在electoral墻上還可以看見多少張海報。

輸入輸出格式

輸入格式:

第一行: N M 分別表示electoral墻的長度和海報個數

接下來M行: Ai Bi 表示每張海報張貼的位置

輸出格式:

輸出貼完所有海報後,在electoral墻上還可以看見的海報數。

代碼

線段樹模版題,求區間覆蓋問題,註意從後往前枚舉區間

核心在於pushup操作回溯

vis[rt]=vis[lson]&&vis[rson]

技術分享圖片
#include<bits/stdc++.h>
#define lson rt<<1
#define rson rt<<1|1
using namespace
std; const int maxn=10000000+10,maxm=1000+5; bool vis[maxn<<2]; int n,m; int l[maxm],r[maxm]; int ans=0; bool flag; inline int read() { int x=0,f=1;char ch=getchar(); while(ch>9||ch<0){if(ch==-)f=-1;ch=getchar();} while(ch<=9&&ch>=0){x=(x<<3)+(x<<1
)+ch-0;ch=getchar();} return x*f; } void pushup(int rt) { vis[rt]=vis[lson]&&vis[rson]; } void update(int L,int R,int l,int r,int rt) { if(vis[rt])return; if(L<=l&&r<=R) { vis[rt]=1; flag=1; return; } int m=(l+r)>>1; if(L<=m) update(L,R,l,m,lson); if(m<R) update(L,R,m+1,r,rson); pushup(rt); } int main() { n=read(),m=read(); for(int i=1;i<=m;i++) l[i]=read(),r[i]=read(); for(int i=m;i>=1;i--) { flag=0; update(l[i],r[i],1,n,1); if(flag)ans++; } printf("%d",ans); return 0; }
View Code

P3740 [HAOI2014]貼海報