链接: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
线段树 略坑
需要先读入之后, 由于输入范围很大, 需要离散化处理。
然后线段树,区间处理就可以。
具体参照代码
复杂度: m*log(n)
1 #include<iostream> 2 using namespace std; 3 #include<cstdio> 4 #include<cstring> 5 #include<map> 6 #include<algorithm> 7 #include<cstdlib> 8 const int MAXN = 1510000; 9 typedef long long LL; 10 template<class T> 11 class tree{ 12 public: 13 int ws; 14 T a[MAXN]; 15 int l[MAXN],r[MAXN]; 16 int b[MAXN]; 17 void creat(int k,int ll,int rr){ 18 l[k]=ll;r[k]=rr; 19 if(ll>=rr){ 20 b[k]=0; 21 a[k]=0; 22 return; 23 } 24 int mid=(ll+rr)/2; 25 creat(k*2,ll,mid); 26 creat(k*2+1,mid+1,rr); 27 a[k]=a[k*2]+a[k*2+1]; 28 b[k]=b[k*2]+b[k*2+1]; 29 } 30 void change(int k,int ll,int rr,int t){ 31 if(ll>r[k]||rr<l[k]) return; 32 if(ll<=l[k]&&rr>=r[k]){ 33 if(a[k]==0&&t==1) 34 b[k]+=1; 35 else if(a[k]==1&&t==-1) 36 b[k]-=1; 37 a[k]+=t; 38 return; 39 } 40 change(k*2,ll,rr,t); 41 change(k*2+1,ll,rr,t); 42 a[k]=a[k*2]+a[k*2+1]; 43 b[k]=b[k*2]+b[k*2+1]; 44 } 45 int Query(int k,int t){ 46 if(l[k]==r[k]) 47 return l[k]; 48 int gs = b[k*2+1]; 49 if(t<=gs) 50 return Query(k*2+1,t); 51 else 52 return Query(k*2,t-gs); 53 } 54 }; 55 template<class T> 56 class Disperse{ 57 public: 58 map<T,int>* maps; 59 int* trans_array; 60 int init_num; 61 int max_num; 62 T *a; 63 int* yz; 64 void Creat(const T b[],int n,int init_n=0){ 65 a=new T[n]; 66 yz=new int[n]; 67 memcpy(a,b,sizeof(T)*n); 68 maps=new map<T,int>(); 69 maps->clear(); 70 sort(a,a+n); 71 max_num=init_n-1; 72 init_num=init_n; 73 for(int i=0;i<n;++i){ 74 if(i!=0&&a[i]==a[i-1]) 75 continue; 76 (*maps)[a[i]]=++max_num; 77 yz[max_num] = a[i]; 78 } 79 } 80 81 int get(const T& p){ 82 return (*maps)[p]; 83 } 84 }; 85 tree<int> t; 86 Disperse<int> dis; 87 int lb[600000],lord[600000]; 88 int aa[1200000]; 89 int ys[600000]; 90 int main(){ 91 int Z; 92 scanf("%d",&Z); 93 while(Z--){ 94 int n,m; 95 scanf("%d%d",&n,&m); 96 t.creat(1,0,501000); 97 int anum = 0; 98 for(int i=0;i<n;i++){ 99 int a; 100 scanf("%d",&a); 101 ys[i] = a; 102 aa[anum++]=a; 103 } 104 char s[30]; 105 for(int i=0;i<m;i++){ 106 int ord; 107 scanf("%s%d",s,&ord); 108 if(s[0]=='i') 109 lb[i]=0; 110 else if(s[0]=='d') 111 lb[i]=1; 112 else if(s[0]=='q') 113 lb[i]=2; 114 lord[i]=ord; 115 if(s[0]=='i'||s[0]=='q') 116 aa[anum++]=ord; 117 } 118 dis.Creat(aa,anum,0); 119 for(int i=0;i<n;i++){ 120 int ord = dis.get(ys[i]); 121 t.change(1,ord,ord,1); 122 } 123 for(int i=0;i<m;i++){ 124 int ord; 125 if(lb[i]==0){ 126 ord = dis.get(lord[i]); 127 t.change(1,ord,ord,1); 128 } 129 else if(lb[i]==1){ 130 ord = dis.get(lord[i]); 131 t.change(1,ord,ord,-1); 132 } 133 else if(lb[i]==2){ 134 ord = lord[i]; 135 printf("%d\n",dis.yz[t.Query(1,ord)]); 136 } 137 } 138 } 139 return 0; 140 }