1. 程式人生 > >hiho一下 第二十一週 離散化與線段樹回顧

hiho一下 第二十一週 離散化與線段樹回顧

             題意:

                      有n(<=10^5)個線段 ,每個線段[li,ri]的範圍<=10^9。現在按順序 將線段一個個放在線上,問最終能看到幾個線段(有任何一塊露出都是看到)

             題解:

                      那麼久離散10^9到10^5了...記得以前做過差不多的..這次還碰到問題了..比如:

                     3 10

                     1 4

                     1 1

                     3 4

                      直接離散化出1,3,4來做之後發現答案不對..因為對於第一個線段..存在[2,2]的區域是看得見的..但是離散化後不能體現出來了。所以這次做的處理是讀入座標時將其左界-1與右界+1也放到離散數列裡面。  

Program:

#include<iostream>
#include<stdio.h>
#include<cmath>
#include<map>
#include<string>
#include<string.h>
#include<algorithm>
#define MAXN 400005
#define oo 1000000007
#define ll long long
using namespace std;   
int P[MAXN][2],id[MAXN],T[MAXN<<2],col[MAXN<<2];
bool F[MAXN];
int find(int d,int n)
{
       int l=0,r=n+1,mid;
       while (r-l>1)
       {
               mid=l+r>>1;
               if (id[mid]<=d) l=mid;
                          else r=mid;
       }
       return l;
} 
void PushDown(int x)
{
       if (!col[x]) return;
       T[x<<1]=T[x<<1|1]=col[x];
       col[x<<1]=col[x<<1|1]=col[x];
       col[x]=0;
}
void Update(int l,int r,int L,int R,int d,int x)
{
       if (l>=L && r<=R)
       {
               T[x]=col[x]=d;
               return;
       }
       PushDown(x);
       int mid=l+r>>1;
       if (mid>=L) Update(l,mid,L,R,d,x<<1);
       if (mid<R)  Update(mid+1,r,L,R,d,x<<1|1);
}  
int Query(int l,int r,int p,int x)
{
       if (l==r) return T[x];
       PushDown(x);
       int mid=l+r>>1;
       if (mid>=p) return Query(l,mid,p,x<<1);
             else  return Query(mid+1,r,p,x<<1|1);
}
int main() 
{      
       int num,m,n,l,r,i,x,ans; 
       scanf("%d%d",&num,&m),n=0;
       for (i=1;i<=num;i++) 
          scanf("%d%d",&P[i][0],&P[i][1]),
          id[++n]=P[i][0],id[++n]=P[i][1],
          id[++n]=P[i][0]-1,id[++n]=P[i][1]+1;
       sort(id+1,id+1+n);
       memset(T,0,sizeof(T));
       memset(col,0,sizeof(col));
       for (i=1;i<=num;i++) 
          P[i][0]=find(P[i][0],n),
          P[i][1]=find(P[i][1],n);
       for (i=1;i<=num;i++) Update(1,n,P[i][0],P[i][1],i,1);  
       memset(F,false,sizeof(F)),F[0]=true,ans=0;
       for (i=1;i<=n;i++)
       {
               x=Query(1,n,i,1);
               if (!F[x]) ans++,F[x]=true;
       }
       printf("%d\n",ans);
       return 0;
}


相關推薦

hiho一下 第二 離散線段回顧

             題意:                       有n(<=10^5)個線段 ,每個線段[li,ri]的範圍<=10^9。現在按順序 將線段一個個放在線上,問最終能看到幾個線段(有任何一塊露出都是看到)              題解

hiho一下 第二 最小生成樹三·堆優化的Prim演算法

描述 回到兩個星期之前,在成功的使用Kruscal演算法解決了問題之後,小Ho產生了一個疑問,究竟這樣的演算法在稀疏圖上比Prim優化之處在哪裡呢? 提示:沒有無緣無故的優化! 輸入 每個測試點(輸入檔案)有且僅有一組測試資料。 在一組測試資料中: 第1行為2個整數N、M,表示小Hi擁有的城市數量和小H

hiho一下 第二九周(最小堆優化Prim)

AC程式碼: #include <bits/stdc++.h> using namespace std; const int maxn = 1e5 + 5; const int Mod = 1e9 + 7; const int INF = 0x

hiho一下 最近公共祖先·三 更新RMQ線上解LCA

              題意:                        裸LCA               題解:                       RMQ解LCA,其中F[]代表每個點第一次進入dfs的位置,D[]為搜尋中的高度,E[]為每個搜尋標記

hiho一下 RMQ問題再臨

相比於之前的RMQ問題,這道題增加了修改功能,鑑於資料規模比較小,可以增加一個Adjust(),用於調整min[][]的值 程式碼如下: #include <stdio.h> #include <math.h> #define MAX_N 10000

HIHO #1079 : 離散線段+離散

#include<bits/stdc++.h> using namespace std; #define cl(a,b) memset(a,b,sizeof(a)) #define LL long long #define pb push_back #define gcd __gcd #defi

專案1 二叉構造演算法(2)

問題描述及程式碼: /* copyright (t) 2016,煙臺大學計算機學院 *All rights reserved. *檔名稱:00.cpp *作者:白曉娟 *完成日期:2016年11月17日 *版本號;v1.0 *問題描述:由先序序列和中序

HDU1542-Atlantis【離散&線段&掃描線】個人認為很全面的詳解

不同 橫線 高度 scanf style mage 上大 hdu 排序 剛上大一的時候見過這種題,感覺好牛逼哇,這都能算 如今已經不打了,不過適當寫寫題保持思維活躍度還是不錯的,又碰到這種題了,想把它弄出來 說實話,智商不夠,看了很多解析,花了4、5個小時才弄明白 網上好多

POJ_3470 Walls 【離散+掃描線+線段

順序 update 都是 n) math ras {} spl r+ 一、題面 POJ3470 二、分析 POJ感覺是真的老了。 這題需要一些預備知識:掃描線,離散化,線段樹。線段樹是解題的關鍵,因為這裏充分利用了線段樹區間修改的高效性,再加上一個單點查詢。 為什

hihor學習日記:hiho一下 第六

http://hihocoder.com/contest/hiho61/problem/1 題意分析 給定一個字串s,以及對該字串s的 m 個操作。 字串s包含n個字元,下標為1…n。字元由’A’到’Z’構成,字元增加1表示該字元變為後續字元,比如’A’增加1是’B’,‘C’增加1是

hihor 學習日記:hiho一下 第五 (尤拉圖)

http://hihocoder.com/contest/hiho51/problem/1 思路: 可以把輪盤的轉換成成一張圖,圖由 2

hiho一下第二#1014 : Trie

Trie樹即為字首樹,通過它可以找到字首相同的字串。 class Trie { private: int count; //用於計數 Trie *next[26]; public: Trie() :count(1) {

hihocoder--hiho一下第二周(Trie

英文 -h 字符 modal data- clas 接下來 小寫 nbsp 時間限制:10000ms 單點時限:1000ms 內存限制:256MB 描述 小Hi和小Ho是一對好朋友,出生在信息化社會的他們對編程產生了莫大的興趣,他們約定好互相幫助,在編程

第二次ScrumMeeting會議

情況 src issue 會議 部分 切換模式 輔助 完成 images 第二十一次Scrum Meeting 時間:2017/12/11 地點:SPR咖啡館 人員:王子銘 遊心 解小銳 王辰昱 李金奇 楊森 陳鑫 趙曉宇 照片: 目前工作進展 名字 今日 明天的工

Python初學者第二天 函數(4)-內置函數

獲取幫助 整除 集合 進制 bubuko min exec oct color 21day 內置函數: 1、abs()絕對值函數 2、dict()創建一個字典 3、help()獲取幫助信息 4、min()從一個列表中取出最小的數 5、max()從一個列表中取出最大

python全棧開發基礎【第二篇】互斥鎖以及進程之間的三種通信方式(IPC)以及生產者個消費者模型

ipc 例子 清空 ase 多個進程 art 並且 star als 一、互斥鎖 進程之間數據隔離,但是共享一套文件系統,因而可以通過文件來實現進程直接的通信,但問題是必須自己加鎖處理。 註意:加鎖的目的是為了保證多個進程修改同一塊數據時,同一時間只能有一個修改,即串行的修

Django 【第二篇】中介模型以及優化查詢以及CBV模式

很多 () ... cti lin form 導致 自動創建 簡單 一、中介模型:多對多添加的時候用到中介模型 自己創建的第三張表就屬於是中介模型 class Article(models.Model): ‘‘‘ 文章表 ‘‘‘ ti

flask第二篇——練習題

視圖 函數 content edi values == 一個 debug tin 自定義url轉化器 實現一個自定義的URL轉換器,這個轉換器需要滿足的是獲取從多少到多少的url,例如,你輸入的地址是http://127.0.0.1:8000/1-5/,那麽頁面返回[1

學習筆記第二節課

作業yum更換國內源 有時候自帶的yum源,不好用,因為自帶的裏面的網址資源是國外的。從國內下載很慢。 想辦法更改國內的源。 實驗: 先把dvd給刪除了, 然後把之前刪除的給cp回來。 然後刪除 CentOS-Base.repo 改一個CentOS7-Base-163.repo 新的需要去下載,寫入下載

第二課 yum 更換國內源及下載rpm包、源碼包的安裝

20180419一、yum更換國內源 1、下截: wget http://mirrors.163.com/.help/CentOS7-Base-163.repo 或者用curl -O 命令下載,然後刪除/etc/yum.repos.d/CentOS-Base.repo這個文件或更名。把CentOS7-Base