[abc] AtCoder Beginner Contest 241 D

前言

传送门 :

思路

由于 2 e 5 2e5 2e5的数据量范围在 1 e 18 1e18 1e18之内,考虑对于每次查询使用二分进行优化

但是二分的前提是有序, s o r t sort sort显然会 t t t,如果使用 v e c t o r vector vector其插入时间为 o ( n ) o(n) on

因此需要使用到 m u l t i s e t multiset multiset,它可以在 l o g n logn logn的级别插入一个数,并且保证有序,同

时序列还允许出现重复的数

当然除此之外还有要注意的是 :

i t = m u l . l o w e r _ b o u n d it = mul.lower\_bound it=mul.lower_bound
i t = l o w e r _ b o u n d ( m u l . b e g i n − e n d ) it = lower\_bound(mul.begin -end) it=lower_bound(mul.beginend)

使用下者也会导致 t l e tle tle,因为下者的时间复杂度是 n 2 l o g n n^2logn n2logn

具体看代码

Mycode

void solve()
{
	multiset<ll> mul;
	int n;cin>>n;
	while(n -- ){
		char op[2];cin>>op;
		ll k,x;
		
		if(*op == '1'){
			cin>>x;
			mul.insert(x);
		}else if(*op == '2'){
			cin>>x>>k;
			
			auto it = mul.upper_bound(x);
			while(k && it!=mul.begin()){
				k -- ;
				it -- ;
				
			}
			if(k){
				cout<<-1<<endl;
			}else{
				cout<<*it<<endl;
			}
		}else if(*op  == '3'){
			cin>>x>>k;
			auto it = mul.lower_bound(x);
			while(k && it!=mul.end()){
				k -- ;
				it++;
			}
			
			if(k){
				cout<<-1<<endl;
			}else{
				it--;
				cout<<*it<<endl;
			}
		}
	}	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值