結果
問題 | No.649 ここでちょっとQK! |
ユーザー | treeone |
提出日時 | 2018-02-09 23:10:51 |
言語 | C++11 (gcc 11.4.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 3,148 bytes |
コンパイル時間 | 1,952 ms |
コンパイル使用メモリ | 162,688 KB |
実行使用メモリ | 12,800 KB |
最終ジャッジ日時 | 2024-10-08 22:13:43 |
合計ジャッジ時間 | 4,666 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
5,248 KB |
testcase_01 | AC | 2 ms
5,248 KB |
testcase_02 | WA | - |
testcase_03 | AC | 297 ms
5,248 KB |
testcase_04 | WA | - |
testcase_05 | WA | - |
testcase_06 | WA | - |
testcase_07 | AC | 1 ms
5,248 KB |
testcase_08 | WA | - |
testcase_09 | AC | 1 ms
5,248 KB |
testcase_10 | AC | 1 ms
5,248 KB |
testcase_11 | AC | 2 ms
5,248 KB |
testcase_12 | WA | - |
testcase_13 | WA | - |
testcase_14 | WA | - |
testcase_15 | WA | - |
testcase_16 | WA | - |
testcase_17 | WA | - |
testcase_18 | WA | - |
testcase_19 | WA | - |
testcase_20 | WA | - |
testcase_21 | WA | - |
testcase_22 | WA | - |
testcase_23 | WA | - |
testcase_24 | WA | - |
testcase_25 | WA | - |
testcase_26 | WA | - |
testcase_27 | AC | 3 ms
5,248 KB |
testcase_28 | AC | 2 ms
5,248 KB |
testcase_29 | AC | 2 ms
5,248 KB |
testcase_30 | AC | 95 ms
7,552 KB |
testcase_31 | AC | 96 ms
7,680 KB |
testcase_32 | AC | 2 ms
5,248 KB |
testcase_33 | AC | 2 ms
5,248 KB |
testcase_34 | WA | - |
testcase_35 | AC | 2 ms
5,248 KB |
コンパイルメッセージ
main.cpp: In member function ‘AVL<T>::node* AVL<T>::rank(AVL<T>::node*, int) [with T = long long int]’: main.cpp:94:3: warning: control reaches end of non-void function [-Wreturn-type] 94 | } | ^
ソースコード
#include<bits/stdc++.h> using namespace std; using Int = long long; //BEGIN CUT HERE template<typename T> struct AVL{ struct node{ T key; int size,height; node *child[2]; node (const T &key):key(key),size(1),height(1){ child[0]=child[1]=0; } } *root; typedef node *pointer; AVL(){root=NULL;} pointer find(T key){ return find(root,key); } node *find(node *t,const T key){ if(t==NULL) return NULL; if(key==(t->key)) return t; else if(key<(t->key)) return find(t->child[0],key); else return find(t->child[1],key); } void insert(const T key){ root=insert(root,new node(key)); } node *insert(node *t,node *x){ if(t==NULL) return x; if((x->key)<=(t->key)) t->child[0]=insert(t->child[0],x); else t->child[1]=insert(t->child[1],x); t->size+=1; return balance(t); } void erase(const T key){ T t=key; if(find(t)==NULL) return; root=erase(root,key); } node *erase(node *t,const int x){ if(t==NULL) return NULL; if(x==(t->key)){ return move_down(t->child[0],t->child[1]); }else{ if(x<(t->key)) t->child[0]=erase(t->child[0],x); else t->child[1]=erase(t->child[1],x); t->size-=1; return balance(t); } } node *move_down(node *t,node *rhs){ if(t==NULL) return rhs; t->child[1]=move_down(t->child[1],rhs); return balance(t); } int sz(node *t){ if(t!=NULL) return t->size; return 0; } int ht(node *t){ if(t!=NULL) return t->height; return 0; } node *rotate(node *t,int l,int r){ node *s=t->child[r]; t->child[r]=s->child[l]; s->child[l]=balance(t); if(t!=NULL) t->size=sz(t->child[0])+sz(t->child[1])+1; if(s!=NULL) s->size=sz(s->child[0])+sz(s->child[1])+1; return balance(s); } node *balance(node *t){ for(int i=0;i<2;i++){ if(ht(t->child[!i])-ht(t->child[i])<-1){ if(ht(t->child[i]->child[!i])-ht(t->child[i]->child[i])>0) t->child[i]=rotate(t->child[i],i,!i); return rotate(t,!i,i); } } if(t!=NULL) t->height=max(ht(t->child[0]),ht(t->child[1]))+1; if(t!=NULL) t->size=sz(t->child[0])+sz(t->child[1])+1; return t; } pointer rank(int k){ return rank(root,k); } pointer rank(node *t,int k){ if(t==NULL) return NULL; int m=sz(t->child[0]); if(k<m) return rank(t->child[0],k); if(k==m) return t; if(k>m) return rank(t->child[1],k-m-1); } int index(T key){ if(find(key)==NULL) return -1; return index(root,key); } int index(node *t,T key){ if(key==(t->key)) return sz(t->child[0]); if(key<(t->key)) return index(t->child[0],key); else return sz(t)-sz(t->child[1])+index(t->child[1],key); } }; signed main(){ int q, k; cin >> q >> k; AVL<Int> avl; int sz = 0; for(int i=0;i<q;i++){ int t, x; cin >> t; if(t==1){ cin >> x; avl.insert(x); sz++; }else{ if(sz < k){ cout << -1 << endl; continue; } Int key=avl.rank(k-1)->key; cout<<key<<endl; avl.erase(key); sz--; } } return 0; }