首页 > 其他分享 >CF1070C Cloud Computing 题解

CF1070C Cloud Computing 题解

时间:2024-03-07 13:22:42浏览次数:28  
标签:Computing int 题解 tr 权值 区间 now Cloud define

分析

思路不难想,我们对于第 \(i\) 个计划的时间,可以分成 \(l\) 和 \(r+1\) 两部分。用权值线段树维护,在第 \(l\) 天的时候就将该计划的内容加入权值线段树中,直到过了该计划的时间,也就是第 \(r+1\) 天,再将这个计划的内容删除。把每一天需要修改的内容存进 vector 中,修改完查询权值线段树中前 \(k\) 个数的值即可。

比较难想的是查询。如果当前区间中的 CPU 数量不超过 \(k\),则表示这个区间能够凑出的 CPU 数量是无法达到 \(k\) 的。为了使答案尽量趋近于 \(k\),这个区间的贡献就是区间的代价和。如果区间中 CPU 数量比 \(k\) 大,则优先考虑左子区间,右子区间只需要补上左区间差的那些数量。这里要特判一下边界,在左右端点相同且数量大于 \(k\) 的时候,直接返回 \(k \times val\)。\(val\) 是这个点的点权,也就是端点下标。

复杂度是 \(O((n+m) \log V)\) 的,\(V\) 是值域。

代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
#define x first
#define y second
#define re register
#define il inline

const int N=1e6+10;
int n,k,m,ans;
struct node{
	int l,r,cnt,val;
}tr[N<<2];
vector<PII> add[N];

il void up(int now){
	tr[now].cnt=tr[now<<1].cnt+tr[now<<1|1].cnt;
	tr[now].val=tr[now<<1].val+tr[now<<1|1].val;
	return ;
}
il void build(int now,int l,int r){
	tr[now].l=l,tr[now].r=r;
	if(l!=r){
		int mid=l+r>>1;
		build(now<<1,l,mid),build(now<<1|1,mid+1,r);
	}
	return ;
}
il void insert(int now,int k,int c){
	if(tr[now].l==tr[now].r) tr[now].cnt+=c,tr[now].val+=k*c;
	else{
		int mid=tr[now].l+tr[now].r>>1;
		if(k<=mid) insert(now<<1,k,c);
		else insert(now<<1|1,k,c);
		up(now);
	}
	return ;
}
il int query(int u,int k){
	if(tr[u].cnt<=k) return tr[u].val;
	else{
		if(tr[u].l==tr[u].r) return k*tr[u].l;
		if(tr[u<<1].cnt>=k) return query(u<<1,k);
		else return tr[u<<1].val+query(u<<1|1,k-tr[u<<1].cnt); 
	}
}

il void solve(){
	cin>>n>>k>>m;
	build(1,1,N-9);
	for(re int i=1,l,r,c,p;i<=m;++i)
		cin>>l>>r>>c>>p,
		add[l].push_back({c,p}),add[r+1].push_back({-c,p});
	for(re int i=1;i<=n;++i){
		for(auto j:add[i]) insert(1,j.y,j.x);
		ans+=query(1,k);
	}
	cout<<ans;
	return ;
}

signed main(){
	solve();
	return 0;
}

标签:Computing,int,题解,tr,权值,区间,now,Cloud,define
From: https://www.cnblogs.com/harmisyz/p/18058683

相关文章

  • AT_dwacon5th_prelims_c k-DMC 题解
    分析先考虑\(k=n\)的情况。对于\(s_j=M\)的时候,其能够匹配的\(s_i=D\)的数量很显然是\(i\lej-1\)的时候的数量,求前缀和就能得到。而对于\(s_j=C\)的时候,能够完整匹配的就是\(i\lej-1\)的时候所有\(s_i=M\)能够匹配的数量之和,再套个前缀和就行了。复杂度是\(O......
  • CF1899G Unusual Entertainment 题解
    分析一眼树上启发式合并。定义\(x_i\)为节点\(i\)在序列\(p\)中的下标。则问题转化为:对于每组\(l,r,k\),询问以\(k\)为根的子树中是否有一个以上的节点,满足\(l\lex_j\ler\)。使用set存以\(i\)为根的子树中\(x_j\)的有序排列。则对于每个\(k=i\)的询问,去合......
  • AT_abc328_f [ABC328F] Good Set Query 题解
    分析考虑并查集。对于\(a_i,b_i,d_i\),若\(a_i,b_i\)在之前的满足要求的操作中,\(a_i,b_i\)不在同一个集合里,则在之前\(X_{a_i},X_{b_i}\)的相对差值是可以任意改变的。令\(k=X_{a_i}-X_{b_i}\),则我们需要将\(a_i\)所在集合中所有元素的值增加\(d_i-k\)。然后将\(a_i,b......
  • CF1895D XOR Construction 题解
    分析对于异或,有性质\(a\oplusb=c,a\oplusc=b,a\oplusa=0\)。则对于\(a_i\oplusa_{i+1}\),其表示的结果就是\(b_{i}\oplusb_{i+2}\)。做一个前缀异或和,就能够得到\(b_1\)与\(b_2,b_3,\dots,b_n\)的异或结果。考虑枚举\(b_1\),因为在有解的情况下\(b_1\op......
  • CF1896D 题解
    Solution令\(l,r\)能使\(\sum\limits_{i=l}^{r}a_i=S\)。考虑先令\(l=1\),那么如果存在\(\sum\limits_{i=1}^{r}=S\),即输出YES。如果没有,则一定有\(\sum\limits_{i=1}^{r}=S-1\),且\(a_{r+1}=2\)。考虑对\(l,r\)进行调整:将\(l\)向左移,\(r\)向右移。可以发现当\(......
  • AT_abc222_f [ABC222F] Expensive Expense 题解
    分析没脑子的题目。一眼换根DP。定义\(\mathit{f}_{i}\)表示\(i\)到\(i\)为根子树中某一个节点的距离最大值;\(\mathit{g}_{i}\)表示\(i\)经过其父节点到某个节点的距离最大值。那答案就是\(\max(\mathit{f}_i,\mathit{g}_i)\)。考虑转移。\(\mathit{f}_i\)的转移很......
  • CF1223F Stack Exterminable Arrays 题解
    分析接着这个说。现在我们需要优化\(\mathit{nxt}_{i}\)。重新定义一下,\(\mathit{nxt}_{i,j}\)表示在后\(i\)个数中,\(j\)第一次出现的位置,且\([i+1,\mathit{nxt}_{i+1,a_i}-1]\)是一个合法串。这玩意很像一个DP,所以完全可以按照DP的转移思路转移:\(\mathit{nxt}_{i,j}=......
  • CF514D R2D2 and Droid Army 题解
    分析乱搞题。考虑将区间\([l,r]\)中所有人干掉的代价。设\(cnt_{i}=\max\limits_{j=l}^{r}a_{j,i}\),则代价为:\(\sum\limits_{i=1}^{m}cnt_i\)。很显然,只有在\(\sum\limits_{i=1}^{m}cnt_i\lek\)是,我们才能将这些人全部干掉。考虑枚举右端点\(r\),与每个\(r\)对应的最......
  • P4863 题解
    Solution为了方便,我们定义\(f_n=\sum_{i=1}^{n}\sum_{j=i}^{n}\lfloor\frac{i}{j}\rfloor\times(-1)^j\)。于是答案即为\(f_b-f_{a-1}\)。观察到如果我们直接计算这个式子而不做丝毫变形的话时间复杂度是\(O(n^2)\)的。考虑把先枚举\(j\),计算\(j\)的贡献。此时就有......
  • CF1066E Binary Numbers AND Sum 题解
    分析因为\(a\)是一直没有改变的,移动的只有\(b\),所以从\(a\)的每一位的贡献入手。对于\(a\)中的从低到高第\(i\)位,其对应的十进制值是\(a_{n-i+1}\times2^{i-1}\)。注意到\(b\)是每次右移一位的,所以在\(b\)中能与\(a_{n-i+1}\)匹配的都是在下标区间\([1,m-i+1]......