藍橋杯 校外的樹 線段樹

2021-07-02 03:03:51 字數 1388 閱讀 6568

演算法提高 校門外的樹  

時間限制:1.0s   記憶體限制:256.0mb

問題描述

某校大門外長度為l的馬路上有一排樹,每兩棵相鄰的樹之間的間隔都是1公尺。我們可以把馬路看成乙個數軸,馬路的一端在數軸0的位置,另一端在l的位置;數軸上的每個整數點,即0,1,2,……,l,都種有一棵樹。

由於馬路上有一些區域要用來建地鐵。這些區域用它們在數軸上的起始點和終止點表示。已知任一區域的起始點和終止點的座標都是整數,區域之間可能有重合的部分。現在要把這些區域中的樹(包括區域端點處的兩棵樹)移走。你的任務是計算將這些樹都移走後,馬路上還有多少棵樹。

輸入格式

輸入的第一行有兩個整數l(1 <= l <= 10000)和 m(1 <= m <= 100),l代表馬路的長度,m代表區域的數目,l和m之間用乙個空格隔開。接下來的m行每行包含兩個不同的整數,用乙個空格隔開,表示乙個區域的起始點和終止點的座標。

輸出格式

輸出包括一行,這一行只包含乙個整數,表示馬路上剩餘的樹的數目。

樣例輸入

500 3

150 300

100 200

470 471

樣例輸出

298資料規模和約定

對於20%的資料,區域之間沒有重合的部分;

對於其它的資料,區域之間有重合的部分;

#include #include #define n 10010

#define lson l,mid,rt<<1

#define rson mid+1,r,rt<<1|1

using namespace std;

int n, m;

int sum[n << 2];

bool lazy[n << 2];

void up(int rt)

}void build(int l, int r, int rt)

int mid = (l + r) >> 1;

build(lson);

build(rson);

sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];

}void update(int l, int r, int l, int r, int rt)

up(rt);

int mid = (l + r) >> 1;

if (l <= mid)

update(l, r, lson);

if (r > mid)

update(l, r, rson);

sum[rt] = sum[rt<<1] + sum[rt<<1|1];

}int main()

printf("%d\n", sum[1]);

return 0;

}

2018 08 18 線段樹(線段樹)

線段樹 描述請你維護乙個線段樹 支援一下操作 a x l r 區間 and x o x l r區間 or x x x l r 區間 xor x s l r 區間求和 輸入乙個數 t表示資料組數 乙個數n表示初始序列長 m表示查詢 隨後n個整數 接下來m次詢問 如上 輸出所以s次詢問的答案 樣例輸入 ...

3306 樹 線段樹

3306 樹 首先dfs整顆樹將樹轉換線性結構,前兩個操作比較簡單,然後主要是對於操作三,有三種情況 1.x rt,那麼我們直接求出整顆樹中的最小值就是答案 2.x在原樹中為rt的祖先節點,那麼我們首先求出從x到rt路徑上的x的第乙個節點y,那麼答案就是除了以y為根的子樹的其他所有節點的最小值 3....

藍橋 校 外的樹(區間處理)

問題描述 某校 外 度為 l的 路上有 排樹,每兩棵相鄰的樹之間的間隔都是1 我們可以把 路看 成 個數軸,路的 端在數軸0 的位置,另 端在l 的位置 數 軸上的每個整數點,即0,1,2,l 都種有 棵樹。由於 路上有 些區域要 來建地鐵。這些區域 它們在數軸上的起始點和終 點表示。已 知任 區域...