bzoj4363 蒟蒻的數列

2021-08-20 01:38:20 字數 1741 閱讀 3083

description

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

題目描述

dcrusher有乙個數列,初始值均為0,他進行n次操作,每次將數列[a,b)這個區間中所有比k小的數改為k,他想知

道n次操作後數列中所有元素的和。他還要玩其他遊戲,所以這個問題留給你解決。

input

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

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

output

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

sample input

4 2 5 1

9 10 4

6 8 2

4 6 3

sample output

16 線段樹離散化 因為我們範圍是1e9 所以就算是動態加點線段樹也是超時

所以我們考慮類似掃瞄線的方法 設每個葉子節點表示乙個左閉右開的區間 然後我們先馬上離散化 然後建樹的時候題目為了方便我們所以給了個左開右閉 然後記得插入的時候右端點要-1 仔細想想x

#include

#include

#define n 44000

using namespace std;

inline char gc()

return

*s++;

}inline int

read()

while (ch<='9'&&ch>='0')

return

x*f;

}struct nodeq[n];int queue[n<<1],num,n,top,root;

struct node1tree[n<<3];

inline void build(int &x,int l,int r)

inline bool cmp(node a,node b)

int mid=tree[x].l+tree[x].r>>1;

if (l<=mid) insert1(tree[x].left,l,r,v);

if (r>mid) insert1(tree[x].right,l,r,v);

}long long query(int

x,int l,int r)else

}void print(int

x)int main()

sort(q+1,q+n+1,cmp);sort(queue+1,queue+top+1);int nn=unique(queue+1,queue+top+1)-queue-1;

//for (int i=1;i<=nn;++i) printf("%d ",queue[i]);

build(root,1,nn-1);

//for (int i=1;i<=n;++i) printf("%d

%d%d\n",q[i].x,q[i].y,q[i].z);

for (int i=1;i<=n;++i) insert1(root,lower_bound(queue+1,queue+nn+1,q[i].x)-queue,lower_bound(queue+1,queue+nn+1,q[i].y)-queue-1,q[i].z);long long ans=0;

//print(root);

for (int i=1;i1]-queue[i])*query(root,i,i);

}printf("%lld",ans);

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 然後我們對於那個序列建立分治線段樹。...

蒟蒻養成記 構造數列

題目描述 你需要求乙個n個不同數字的序列p,p i 是1 n 中的數,且滿足對於 1 i n,p p i n i 1 輸入格式 乙個數字n 1 n 10 5 輸出格式 輸出n個數字序列 p,任意輸出一組答案即可 輸入輸出樣例 input1 1output1 1input2 2output2 1inp...