P3740 [HAOI2014]貼海報
阿新 • • 發佈:2019-02-20
void line 表示 覆蓋問題 bits 模版 長方形 light 所有
題目描述
Bytetown城市要進行市長競選,所有的選民可以暢所欲言地對競選市長的候選人發表言論。為了統一管理,城市委員會為選民準備了一個張貼海報的electoral墻。
張貼規則如下:
-
electoral墻是一個長度為N個單位的長方形,每個單位記為一個格子;
-
所有張貼的海報的高度必須與electoral墻的高度一致的;
-
每張海報以“A B”表示,即從第A個格子到第B個格子張貼海報;
-
後貼的海報可以覆蓋前面已貼的海報或部分海報。
現在請你判斷,張貼完所有海報後,在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 namespaceView Codestd; 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; }
P3740 [HAOI2014]貼海報