演算法提高 校門外的樹
時間限制: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 都種有 棵樹。由於 路上有 些區域要 來建地鐵。這些區域 它們在數軸上的起始點和終 點表示。已 知任 區域...