1. 程式人生 > 其它 >abc 241 D.Sequence Query

abc 241 D.Sequence Query

Sequence Query

題意:

插入元素,查詢不小於x的第k個元素和查詢不大於x的第k個元素

思路:

使用multiset來寫,排序複雜度為nlogn

注意這裡的upper和lower,也可以直接用se.lower_bound()來表示或者upper_bound()來表示,迭代器用auto

upper時找到大於x的第一個元素座標為it,然後範圍是[ it-k,it-1 ],所以這裡it先--

所以第一種情況我們需要限制 **it **的範圍

而lower_bound找到的是大於等於x的第一個元素,查詢區間範圍是[ it,it+k]所以it++可以留在後手,而迴圈的i其實不影響 都用[ 0,k)

#include<bits/stdc++.h>
using namespace std;
typedef multiset<long long > IntSet;
IntSet se;
signed main()
{
	int q;
	cin>>q;
	long long n,x,k;
	for(int i=1;i<=q;i++)
	{
		cin>>n>>x;
		if(n==1)
		{
			se.insert(x);
		}
		else if(n==2)
		{
			cin>>k;
			int cnt=0;
			auto it = se.upper_bound(x);
			if(it==se.begin())	//這裡一定要千萬注意!!!先限制範圍
			{
				cout<<-1<<endl;
				continue;
			} 
			for(int i=0;i<k;i++)
			{
				it--;		//先手
				if(it==se.begin()&&i!=k-1)
				{
					cout<<-1<<endl;
					break;
				}
				else if(i==k-1)
				{
					cout<<*it<<endl;
					break;
				}
			}
		}
		else if(n==3)
		{
			cin>>k;
			auto it = se.lower_bound(x);
			for(int i=0;i<=k-1;i++)
			{	
				if(it==se.end())
				{
					cout<<-1<<endl;
					break;
				}
				else if(i==k-1)
				{
					cout<<*it<<endl;
				}
				it++;				//後手
			}
		}
	}
}