算法整理 & 复习:珂朵莉树

珂朵莉树详解


珂朵莉树


#include <set>
#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
#define IT set<node> :: iterator
#define ilL itl->L
#define ilR itl->R
#define ilw itl->w

struct node{
	int L,R;
	mutable int w;
	node(int l, int r=-1, int v=0) : L(l),R(r),w(v) {}
	bool operator< (const node &a) const { return L < a.L; }
};

set <node> s;

IT split(int pos){
	IT mid = s.lower_bound(node(pos));
	if(mid!=s.end() && pos==mid->L) return mid;
	mid--;
	int l = mid->L, r = mid->R, w = mid->w;
	s.erase(mid);
	s.insert(node(l,pos-1,w));
	return s.insert(node(pos,r,w)).first;
}

void change(int l , int r, int w){
	IT itl = split(l), itr = split(r+1);
	s.erase(itl,itr);
	s.insert(node(l,r,w));
}

void add(int l, int r, int k){
	IT itl = split(l), itr = split(r+1);
	for(;itl!=itr;++itl) ilw += k;
}

int Rank(int l, int r, int k){
	vector <pair<int,int> > rk;	rk.clear();
	IT itl = split(l), itr = split(r+1);
	for(;itl!=itr;itl++)
		rk.push_back(pair<int,int>(ilw,ilR-ilL+1));
	sort(rk.begin(),rk.end());
	vector<pair<int,int> >::iterator it = rk.begin();
	for(;it!=rk.end();it++){
		k -= it->second;
		if(k <= 0)	return it->first;
	}
}

int sum(int l, int r, int k){
	IT itl = split(l), itr = split(r+1);
	int Sum = 0;
	for(;itl!=itr;++itl)
		Sum += (ilR-ilL+1)*itw;
	return Sum;
}

珂朵莉是世界上最幸福的女孩。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SP FA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值