bzoj4636 蒟蒻的數列 離散化 線段樹

2022-05-20 17:59:23 字數 1428 閱讀 6442

題目描述

蒟蒻dcrusher不僅喜歡玩撲克,還喜歡研究數列

題目描述

dcrusher有乙個數列,初始值均為0,他進行n次操作,每次將數列[a,b)這個區間中所有比k小的數改為k,他想知道n次操作後數列中所有元素的和。他還要玩其他遊戲,所以這個問題留給你解決。

輸入第一行乙個整數n,然後有n行,每行三個正整數a、b、k。

n<=40000 , a、b、k<=10^9

輸出乙個數,數列中所有元素的和

樣例輸入

42 5 1

9 10 4

6 8 2

4 6 3

樣例輸出

16題解

離散化+線段樹

很容易想到先將操作按照k值從小到大排序,然後按照這個順序修改,就不用考慮大於等於k的數。

題目中給的是[a,b)的點,可以轉化成a到b的線段,便於離散化。

離散化後線段樹區間修改即可,注意這是維護線段的線段樹,和維護點權的線段樹略有區別。

#include #include #include #define n 40010

#define lson l , mid , x << 1

#define rson mid , r , x << 1 | 1

using namespace std;

typedef long long ll;

struct pos

a[n << 1];

struct seg

q[n];

int v[n << 1] , top , tag[n << 3];

ll sum[n << 3];

bool cmp1(pos a , pos b)

bool cmp2(seg a , seg b)

void pushup(int x)

void pushdown(int l , int r , int x)

}void update(int b , int e , int k , int l , int r , int x)

pushdown(l , r , x);

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

if(b < mid) update(b , e , k , lson);

if(e > mid) update(b , e , k , rson);

pushup(x);

}int main()

sort(q + 1 , q + n + 1 , cmp2);

for(i = 1 ; i <= n ; i ++ ) update(q[i].lp , q[i].rp , q[i].k , 1 , top , 1);

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

return 0;

}

BZOJ 4636 蒟蒻的數列

bzoj 4636 蒟蒻的數列 線段樹 動態開點 蒟蒻dcrusher不僅喜歡玩撲克,還喜歡研究數列 題目描述 dcrusher有乙個數列,初始值均為0,他進行n次操作,每次將數列 a,b 這個區間中所有比k小的數改為k,他想知 道n次操作後數列中所有元素的和。他還要玩其他遊戲,所以這個問題留給你解...

bzoj4636 蒟蒻的數列 線段樹

蒟蒻的數列 bzoj 4636 題目大意 給定乙個序列,初始均為0。n次操作 每次講一段區間中小於k的數都變成k。操作的最後詢問全域性和。注釋 1 le n le 4 cdot 10 4 想法 那個操作就是乙個不好好說話的操作,說白了就是對區間的每乙個數取max 然後我們對於那個序列建立分治線段樹。...

bzoj4363 蒟蒻的數列

description 蒟蒻dcrusher不僅喜歡玩撲克,還喜歡研究數列 題目描述 dcrusher有乙個數列,初始值均為0,他進行n次操作,每次將數列 a,b 這個區間中所有比k小的數改為k,他想知 道n次操作後數列中所有元素的和。他還要玩其他遊戲,所以這個問題留給你解決。input 第一行乙個...