首页 > 其他分享 >P9588 (ds思想)

P9588 (ds思想)

时间:2024-02-27 10:25:51浏览次数:25  
标签:思想 sum P9588 cin tot long 操作 ds op

难度2

还是比较巧妙的。

看到这种操作题,思路基本就是考虑用合适的数据结构去求解每一个操作。在遇到一些比较难搞的操作时可以考虑转换。对于一些删除的操作一定要小心,除非很简单,否则大概率是转换

看到操作一,因为这个数据范围想到只用存一个x就可以了

看到操作二,是删除,等等

看到操作三,考虑二分再加加减减

看到操作四,考虑线段树


以下看了题解

再看操作二,其实不用删除,记录当前队列的头尾即可(一个窗口),记录下删除的数 \(tot\) ,操作三就是求第\(tot+x\)个数,比较好维护

#include<bits/stdc++.h>
#define endl "\n"
using namespace std;
long long c,T,n=2e5,op,x,q[200005],sum[200005],l=0,r=0,tot=0;
long long d[800005];
void push_up(long long p){
	d[p]=max(d[p<<1],d[p<<1|1]);
}
void update(long long l,long long r,long long p,long long ad,long long s){
	if(l==s&&r==s){
		d[p]=ad;
		return;
	}
	long long mid=(l+r)>>1;
	if(s<=mid) update(l,mid,p<<1,ad,s);
	if(s>mid) update(mid+1,r,p<<1|1,ad,s);
	push_up(p);
}
long long getmax(long long l,long long r,long long p,long long s,long long t){
	if(l>=s&&r<=t){
		return d[p];
	}
	long long mid=(l+r)>>1,ans=0;
	if(s<=mid) ans=max(ans,getmax(l,mid,p<<1,s,t));
	if(t>mid) ans=max(ans,getmax(mid+1,r,p<<1|1,s,t));
	return ans;
}
int main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); 
	cin>>c>>T;
	l=1;
	while(T--){
		cin>>op;
		if(op==1){
			cin>>x;
			r++;
			q[r]=x;
			sum[r]=sum[r-1]+x;
			update(1,n,1,x,r);
		}else if(op==2){
			cin>>x;
			long long ans=0;
			tot+=x;
			bool flag=false;
			for(long long i=l;i<=r;i++){
				if(sum[i]>tot){
					l=i;
					flag=true;
					break;
				}
			}
			if(flag==false) l=r+1;
		}else if(op==3){
			cin>>x;
			//tot+x;
			long long gg=lower_bound(sum+1,sum+r+1,tot+x)-sum;
			cout<<q[gg]-(sum[gg]-tot-x)<<endl;
		}else{
			cout<<getmax(1,n,1,l,r)<<endl;
		}
		//cout<<l<<"-"<<r<<endl;
	}
	
	return 0;
}

标签:思想,sum,P9588,cin,tot,long,操作,ds,op
From: https://www.cnblogs.com/wuhupai/p/18036302

相关文章

  • A DATETIME or TIMESTAMP value can include a trailing fractional seconds part in
    MySQL::MySQL8.0ReferenceManual::13.2.2TheDATE,DATETIME,andTIMESTAMPTypeshttps://dev.mysql.com/doc/refman/8.0/en/datetime.html13.2.2 TheDATE,DATETIME,andTIMESTAMPTypesThe DATE, DATETIME,and TIMESTAMP typesarerelated.Thisse......
  • CF482B (拆位思想+实现)
    难度:2看到位运算想到拆位。因为是与所以对于\([l,r]\)区间内在二进制下,如果它是1则\([l,r]\)区间都是1,如果是0则\([l,r]\)区间内至少有1个0。因为是区间所以不难想到用线段树处理,而线段树维护的就是区间内1的个数。考虑如何处理。首先对于q拆位,1就为区间赋值,操作......
  • P3157 (cdq分治思想)
    难度2eeeeeeeee比较有意思的一道题目。一开始看到删除,有一个很经典的trick,就是将删除变成插入,倒序处理。然后发现不会做了。然后巨佬lyc说可以用cdq分治,将时间变为第三个关键字,这样也就不用倒序处理了。考虑求出删除某个数后对逆序对个数产生的贡献,在加入了时间戳之后i,j为逆序对......
  • P3939 (ds实现)
    难度2比较好的题目,加强了对主席树的理解。就我个人而言,我目前可以用三种方法切掉此题。1.平衡树对于每个颜色建平衡树,维护颜色对应的下标,询问时直接split输出size即可2.stl(vector)insert,erase,lower_bound,upper_bound,一顿搞实现上面平衡树的所有功能,就问你牛不牛3.主席......
  • CF776D(并查集思想)
    难度1em还是一道比较套路的题目。观察发现,如果当\(r_{i}=1\)时他的两把钥匙状态是相同的,当\(r_{i}=0\)时他的两把钥匙状态是不同的,对于这种相同不同的问题可以考虑并差集,状态一样就一样的并在一起,否则就把不一样的并在一起所以以后看见这些问题(a=b+k,a=!b,a=b)都可以用带权并查......
  • ABC283E (dp思想)
    难度1这题看到一点思路也没有,但是看到最小操作数想到二分,dp和贪心,二分答案的check显然不会,贪心不会。发现对于一行,前面的\(i-2\)是不会影响的,这一行也不会影响后面的\(i+2\)行,所以是dp。考虑如何设计状态因为\(i-1\)和\(i+1\)行都会影响,所以设计出来一个dp[i][0/1][0/1][0/1]的东......
  • P10156(dp思想)
    难度2也是比较有意思的一道题。首先发现每个小团体独立,所以对于每个小团体分开直接暴力dp,dp[i][j]表示当前小团体做到第i人,走了j人,然后O(n)转移,加上部分分喜提50pts。为什么要O(n)转移呢,因为我要枚举匹配的两个人然后算贡献。但是对于这种带绝对值的贡献,我们一般都要把绝对值拆掉......
  • CF1928C (数学思想)
    难度3其实是有点虚高的,可能是我这种数学题做的少了。在考试时式子都写出来了,但不知道怎么处理。然后注意一下细节就可以了。懒懒懒。对于xy=k(k为常数)可以直接枚举k的因子,然后看一下限制条件即可。#include<bits/stdc++.h>usingnamespacestd;longlongT,n,x,tot=0;unorde......
  • P6805 (树上最小路径覆盖思想)
    难度3比较有意思的一道题。首先看到题目是求树上最小路径覆盖,自然想到由叶子入手去分析,所以当子树内有偶数个叶子节点时,那么就有两个叶子向上匹配,否则只有一个叶子向上匹配。这个东西可以用树剖维护,线段树维护的是子树内有多少个偶的,相当于一个区间反转一类的东西。细节不算多,但......
  • P4666 [BalticOI 2011 Day1] Growing Trees题解(平衡树思想)
    自己第一道不看题解写出来的紫题,庆祝一下(没初始化种子导致调了30min)这是一个fhq-treap的题解思路来源:首先看题目,因为是序列上的问题,不难想到是一道数据结构题。首先看到操作C:对于这种操作,我们可以用平衡树解决,具体方法是,将树split成\(<min,min\lex\lemax,>max\)这......