国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

【POJ 2528】Mayor's posters

2019-11-11 07:55:37
字體:
供稿:網(wǎng)友

POJ2528

題意

給定n張海報,每張海報的范圍從a[i]到b[i],依次覆蓋,后添加的海報會覆蓋掉原來位置的海報,求最后能夠看到幾張海報。多組數(shù)據(jù)。

樣例輸入

1 5 1 4 2 6 8 10 3 4 7 10

樣例輸出

4


sol

首先離散化,然后用線段樹維護。注意題目里的起點和終點是線段,但是線段樹的操作是點,所以離散的時候要加入一些數(shù)。舉個例子來解釋一下:

[1,5]和[6,10]將[1,10]完全覆蓋 [1,4]和[6,10]不能將[1,10]完全覆蓋 在離散狀態(tài)下[1,4]和[6,10]是完全覆蓋的

這個時候如果在4和6之間加入一個數(shù)5,就可以解決問題了。

for (i = 1;i <= n; i++) { scanf("%d%d",&lp[i],&rp[i]); pt[++k] = lp[i]; pt[++k] = rp[i]; }sort(pt+1,pt+k+1); k = 0;for (i = 1;i <= n * 2; i++)if (pt[i] != pt[i-1]) pt[++k] = pt[i]; //排序去重 for (i = k;i >= 2; i--)if (pt[i] - pt[i-1] != 1) pt[++k] = pt[i-1] + 1; //插入數(shù)字 sort(pt+1,pt+k+1);

接下來就是每次對線段樹進行覆蓋操作。

#include<cmath>#include<cstdio>#include<vector>#include<cstring>#include<iomanip>#include<stdlib.h>#include<iostream>#include<algorithm>#define ll long long#define inf 1000000000#define mod 1000000007#define N 120000using namespace std;int T,n,k,i,res;int lp[N],rp[N],pt[N*3],col[N<<4];bool hash[N];void pushdown(int rt) //下傳標記 { if (col[rt] != -1) {col[rt<<1] = col[rt<<1|1] = col[rt];col[rt] = -1;}}void update(int L,int R,int c,int l,int r,int rt){ if (L <= l && r <= R) {col[rt] = c; return;} //區(qū)間覆蓋 pushdown(rt); //下傳標記 int mid = (l + r) >> 1; if (L <= mid) update(L,R,c,l,mid,rt << 1); if (mid < R) update(L,R,c,mid+1,r,rt << 1 | 1);}void query(int l,int r,int rt){ if (col[rt] != -1) //區(qū)間覆蓋情況 { if (hash[col[rt]] == false) res++; hash[col[rt]] = true; return; } if (l == r) return; int mid = (l + r) >> 1; query(l,mid,rt << 1); query(mid+1,r,rt << 1 | 1);}int search(int x) //二分搜索 { int l = 1,r = k; while (l <= r) { int mid = (l + r) >> 1; if (x == pt[mid]) return mid; if (x < pt[mid]) r = mid - 1; else l = mid + 1; } return -1;}int main(){ cin>>T; while (T--) { cin>>n; k = 0; for (i = 1;i <= n; i++) { scanf("%d%d",&lp[i],&rp[i]); pt[++k] = lp[i]; pt[++k] = rp[i]; } sort(pt+1,pt+k+1); k = 0; for (i = 1;i <= n * 2; i++) if (pt[i] != pt[i-1]) pt[++k] = pt[i]; //排序去重 for (i = k;i >= 2; i--) if (pt[i] - pt[i-1] != 1) pt[++k] = pt[i-1] + 1; //插入數(shù)字 sort(pt+1,pt+k+1); memset(col,-1,sizeof(col)); for (i = 1;i <= n; i++) { int l = search(lp[i]); int r = search(rp[i]); //二分搜索位置 update(l,r,i,1,k,1); } res = 0; memset(hash,false,sizeof(hash)); query(1,k,1); cout<<res<<endl; } return 0;}
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 大渡口区| 夏津县| 汤原县| 德保县| 文水县| 会东县| 申扎县| 历史| 恩平市| 昌黎县| 阳信县| 内江市| 东光县| 镇雄县| 梨树县| 雷州市| 汉川市| 江口县| 温宿县| 阳城县| 高雄县| 张北县| 贵州省| 方城县| 天门市| 嘉禾县| 体育| 汨罗市| 怀宁县| 阳原县| 林口县| 梧州市| 民丰县| 沧源| 射阳县| 平乐县| 武安市| 遵义县| 呼和浩特市| 巫山县| 奉贤区|