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...