链接:
https://www.nowcoder.com/acm/contest/93/L
来源:牛客网
链接:
https://www.nowcoder.com/acm/contest/93/L
来源:牛客网
来源:牛客网
时间限制:C/C++ 3秒,其他语言6秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
你们wyh学长小时候住在河边,因为周围的生态环境非常好,所以经常会有天鹅浮在湖面上,每只天鹅都长得不一样,它们偶尔排成一排,偶尔分散开,偶尔也会去其他河畔,wyh学长为了统计它们的个数,编了一个程序赋予它们一个“萌”值,但是这些天鹅很不听话,一会儿会从别的地方游过来一两只,一会儿又会在统计过程中游走一两只,现在请你帮他完成统计任务。
输入描述:
共有T(T<=10)组数据,每组数据第一行为两个数 N, M (N,M <= 500000),代表有N只天鹅和M次操作,接下来一行是N个数字,下面M行首先会输入一个字符串S,接着会有三类操作,如果S是“insert”,接着输入一个正整数a,代表插入一只“萌”值为a的天鹅,如果S是“delete”,接着输入一个正整数a,代表删除一只“萌”值为a的天鹅,如果S是“query”,接着输入一个正整数k,代表查询“萌”值第k大的天鹅。 萌值为[1,1000000000],并且保证一定存在第k大
输出描述:
对应每次询问,输出询问结果。
来源:牛客网
示例1
输入
1 5 4 6 4 2 9 1 query 2 insert 7 delete 6 query 2
输出
6 7
分析:当时做的时候每次query都排序了,结果就是超时……其实还是对stl函数的不熟悉,用一下函数在插入删除时就保证是有序的则在query时直接输出就行了:
vector<int>c;
c.insert(pos,elem)在pos位置插入一个值为elem的数
c.insert(pos,n,elem)在pos位置插入n个值为elem的数
c.insert(pos,beg,end)在pos位置插入在[beg,end)区间的数据
lower_bound(c.begin(),c.end(),r)返回第一个大于等于r的数的地址
upper_bound_bound(c.begin(),c.end(),r)返回第一个大于r的数的地址
ps:做的时候还犯了一个非常智障的错误,把数组降序排序了,结果肯定是错的啊……
代码如下:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<vector>
using namespace std;
int main(){
int t;
scanf("%d",&t);
while(t--){
int n,m,num;
vector<int> q;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++){
scanf("%d",&num);
q.push_back(num);
}
sort(q.begin(),q.end());
string s;
int k;
while(m--){
cin>>s>>k;
if(s[0]=='i')q.insert(lower_bound(q.begin(),q.end(),k),k);
else if(s[0]=='d'){
q.erase(find(q.begin(),q.end(),k));
}
else{
printf("%d\n",q[q.size()-k]);
}
}
}
}