首页 > 其他分享 >题解:[ABC379D] Home Garden

题解:[ABC379D] Home Garden

时间:2024-11-10 08:46:06浏览次数:1  
标签:10 Garden 题解 ll 元素 leq add ABC379D op

[ABC379D] Home Garden

题意:

开始有一个空集,有 \(Q\) 次操作,每次有标识数 \(op\):

  1. 若 \(op\) 为 \(1\):为集合添加一个元素 \(0\)。
  2. 若 \(op\) 为 \(2\):输入 \(T\),为集合内所有元素增加 \(T\)。
  3. 若 \(op\) 为 \(3\):输入 \(H\),删除集合内不小于 \(H\) 的元素,并输出删除元素个数。

数据范围:\(1 \leq Q \leq 2 \times 10^{5}\),\(1 \leq T,H \leq 10^{9}\)

思路:

因为题中有多元素修改操作,所以我使用线段树统计区间加来实现。

设变量 \(l\) 和 \(r\) 表示未被删除的元素集合的在线段树内的位置。

我们发现 \(1 \leq Q \leq 2 \times 10^{5}\),直接用线段树根节点表示 \(1\) 到 \(2 \times 10^{5}\) 这个区间。

  • 对于操作 \(1\):直接令 \(r\) 加一即可。
  • 对于操作 \(2\):线段树对区间 \(l\) 和 \(r\) 加 \(T\)。
  • 对于操作 \(3\):我们发现未删集合在在 \(l\) 到 \(r\) 内内单调不增,那么考虑二分找出在 \(l\) 到 \(r\) 内第一个小于 \(H\) 的元素位置,设它为 \(L\),那么答案就是 \(L-l\),输出后将 \(l\) 赋值为 \(L\) 即可更新未删集合。

代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
struct tree {
	#define ls (k<<1)
	#define rs ((k<<1)|1)
	#define mid ((l+r)>>1)
	ll add[800005];
	void push_down(ll k) {
		if(!add[k]) return;
		add[ls]+=add[k];
		add[rs]+=add[k];
		add[k]=0;
	}
	void solve(ll k, ll l, ll r, ll L, ll R, ll op) {
		if(L<=l&&r<=R) {
			add[k]+=op;
			return;
		}
		push_down(k);
		if(L<=mid) solve(ls, l, mid, L, R, op);
		if(R>mid) solve(rs, mid+1, r, L, R, op);
	}
	ll query(ll k, ll l, ll r, ll op) {
		if(l==r) return add[k];
		push_down(k);
		if(op<=mid) return query(ls, l, mid, op);
		else return query(rs, mid+1, r, op);
	}
}sg;
int main() {
	ll Q, T, H, l=1, r=0, op;
	cin >> Q;
	while(Q--) {
		cin >> op;
		if(op==1) r++;
		else if(op==2) {
			cin >> T;
			if(l<=r) sg.solve(1, 1, 200000, l, r, T); //注意判断是否是空集 
		} else if(op==3) {
			cin >> H;
			//使用二分找出l-r内第一个小于H的元素位置,若都不小于H那么l将会更新为r+1合题意 
			ll L=l, R=r, Mid;
			while(L<=R) {
				Mid=(L+R)/2;
				if(sg.query(1, 1, 200000, Mid)>=H) L=Mid+1;
				else R=Mid-1;
			}
			cout << L-l << endl;
			l=L; //更新未删集合 
		}
	}
	return 0;
}

标签:10,Garden,题解,ll,元素,leq,add,ABC379D,op
From: https://www.cnblogs.com/anins/p/18537626

相关文章

  • 题解:AT_abc379_e [ABC379E] E - Sum of All Substrings
    很水的一道题。我们先把题目上各地的数字看成一个序列,然后考虑计算该序列分别会对答案的每一位产生多少贡献。具体的,我们从后往前考虑答案的每一位。通过简单推演可知,设你当前考虑到答案的第\(i\)个数字,那么原序列对这一位的贡献为\(\sum_{j=1}^{n-i+1}a_j\timesj\)。这个......
  • 题解:AT_abc379_d [ABC379D] Home Garden
    难度严格小于C题。你考虑每盆花被种植的时间一定单调不降,这启示我们去用二分。具体的,我们用一个数组\(a\)表示当前所有的花的种植时间,并记录一个当前时间\(t\)。对于每个1操作都在数组后面加上个元素\(t\),对于\(2\)操作让\(t\leftarrowt+T\)。对于操作3,能够摘取的......
  • Toyota Programming Contest 2024#11(AtCoder Beginner Contest 379)题解
    总体情况A-Cyclic题意给你一个三位整数\(N\),其中每个数字都是介于\(1\)和\(9\)之间的整数。设\(a\),\(b\),\(c\)分别是\(N\)的百位、十位和个位数。打印一个按此顺序排列\(b\),\(c\),\(a\)所组成的整数,以及一个按此顺序排列\(c\),\(a\),\(b\)所组成......
  • 2024.11.9组队训练题解记录
    Teleportation鲍勃最近访问了一个奇怪的传送系统。该系统包含\(n\)个房间,编号为\(0\)到\(n-1\)。每个房间都安装了一个传送设备。每个传送设备都有一个看起来像钟表表面的仪表板,上面有一个指针,显示数字\(0\)到\(n-1\),按顺时针顺序排列。最初,第\(i\)个房间的传送设备上......
  • P4156 论战捆竹竿 题解
    论战捆竹竿题意:给定字符串\(s\),计数"串\(t\)的长度"可能的种数有多少种,使得\(t\)能被\(s\)作为印章印出来,且\(|t|\lew\)。\(n=|s|\le5\times10^5\),\(n\lew\le10^{18}\)。第一步:求出\(s\)的周期\(\{a_1\sima_m\}\),包含\(n\)(\(a_m=n\))。转化为求\(\suma_ib......
  • 题解:P11248 [GESP202409 七级] 矩阵移动
    笑点解析:这个人所在城市考试当天刮台风了,没考,免费送了一次12月的考试。设计这么一个东西:\(dp_{i,j}\)表示到格子\((i,j)\)的最大分数。本来还好,但现在的问题是,如果这个格子是‘?’,我哪儿知道到底可不可以变啊?万一变得太多了,那,那不就废了!万一少了,那我分不就没了?所以我们......
  • agc032 A~E 题解
    a倒推,每次删掉最后一个b[i]=i的即可b一开始发现可以构造完全二分图,使两边和同为S,这样每个点的和=对面二分图点的和=S,然后n=6和为奇数进一步发现可以直接分成A组组内和为B的组,然后组之间连边,此时S=(A-1)B,有AB=n(n+1)/2当n为奇数时取A=(n+1)/2,B=n,n单独一组其他大匹配小;n为偶数......
  • NOIP集训 P11071 「QMSOI R1」 Distorted Fate 题解
    题解:P11071「QMSOIR1」DistortedFate给定一个长度为\(n\)的数组\(A\),你需要完成以下\(q\)次操作。1.1lrx将\(A_i(l\lei\ler)\)异或上\(x\)。2.2lr求:\[(\sum_{i=l}^r\bigcup_{j=l}^iA_j)\bmod2^{30}\]其中\(\bigcup\)表示按位或。Input第一行输入......
  • [COCI2022-2023#5] Slastičarnica 题解
    前言题目链接:洛谷。题意简述一个长为\(n\)的序列\(\{a_n\}\)和\(q\)次操作,第\(i\)次操作中,你可以删除序列长为\(d_i\)的前缀或后缀,并需要保证删除的所有数\(\geqs_i\)。每次操作前,你可以选择任意长度的前缀或后缀,并将其删除,也可以不操作。请问,在你不能进行下一次操......
  • CodeforceTon Round 4 div1 + div2 题解
    题解A-EDreamissofar~A.BeautifulSequence检查每一位对应的数字是否小于等于位置,如果可以说明这个数字可以移动到对应位置上,遍历即可#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;voidsolve(){ intn; cin>>n; vector<int>a......