結果
| 問題 | No.649 ここでちょっとQK! |
| コンテスト | |
| ユーザー |
akakimidori
|
| 提出日時 | 2018-10-08 01:54:31 |
| 言語 | C (gcc 13.3.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 3,686 bytes |
| 記録 | |
| コンパイル時間 | 185 ms |
| コンパイル使用メモリ | 31,616 KB |
| 実行使用メモリ | 13,648 KB |
| 最終ジャッジ日時 | 2024-10-12 14:26:18 |
| 合計ジャッジ時間 | 5,355 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | -- * 4 |
| other | AC * 4 TLE * 1 -- * 27 |
ソースコード
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct WeightBalancedTreeNode{
void *val;
int size;
struct WeightBalancedTreeNode *left;
struct WeightBalancedTreeNode *right;
} WBTNode;
typedef struct WeightBalancedTreeHead{
WBTNode *root;
size_t valSize;
int (*cmp)(const void *,const void *);
} WBTree;
WBTNode* newWBTNode(const void *v,const size_t size){
WBTNode *res=(WBTNode *)malloc(sizeof(WBTNode));
res->val=malloc(size);
memcpy(res->val,v,size);
res->size=1;
res->left=NULL;
res->right=NULL;
return res;
}
int getSize(const WBTNode *t){
return t==NULL?0:t->size;
}
void freeWBTNode(WBTNode *t){
free(t->val);
free(t);
return;
}
WBTree* newWBTree(const size_t size,int (*cmp)(const void *,const void *)){
WBTree *res=(WBTree *)malloc(sizeof(WBTree));
res->root=NULL;
res->valSize=size;
res->cmp=cmp;
return res;
}
void update(WBTNode *t){
if(t==NULL) return;
t->size=1+getSize(t->left)+getSize(t->right);
return;
}
WBTNode* leftRotate(WBTNode *v){
WBTNode *u=v->right;
v->right=u->left;
u->left=v;
update(v);
update(u);
return u;
}
WBTNode* rightRotate(WBTNode *u){
WBTNode *v=u->left;
u->left=v->right;
v->right=u;
update(u);
update(v);
return v;
}
WBTNode* balance(WBTNode *t){
if(t==NULL) return NULL;
const double a=(double)1/3;
int w=getSize(t)+1;
int l=getSize(t->left)+1;
int r=getSize(t->right)+1;
if(l<a*w){
if(getSize(t->right->right)+1<a*r) t->right=rightRotate(t->right);
t=leftRotate(t);
} else if(l<a*w){
if(getSize(t->left->left)+1<a*l) t->left=leftRotate(t->left);
t=rightRotate(t);
}
return t;
}
WBTNode* insert_func(WBTNode *r,const void *v,WBTree *t){
if(r==NULL) return newWBTNode(v,t->valSize);
if(t->cmp(r->val,v)>=0){
r->left=insert_func(r->left,v,t);
} else {
r->right=insert_func(r->right,v,t);
}
update(r);
return balance(r);
}
void insert(WBTree *t,const void *v){
t->root=insert_func(t->root,v,t);
return;
}
WBTNode* erase_func_max(WBTNode *r,WBTNode **max){
if(r->right==NULL){
*max=r;
return r->left;
}
r->right=erase_func_max(r->right,max);
update(r);
return balance(r);
}
WBTNode* erase_func(WBTNode *r,const void *v,WBTree *t){
if(r==NULL) return NULL;
int c=t->cmp(r->val,v);
if(c==0){
WBTNode *f=r;
if(r->left==NULL){
r=r->right;
} else if(r->right==NULL){
r=r->left;
} else {
WBTNode *max;
r->left=erase_func_max(r->left,&max);
max->left=r->left;
max->right=r->right;
r=max;
}
freeWBTNode(f);
} else if(c>0){
r->left=erase_func(r->left,v,t);
} else {
r->right=erase_func(r->right,v,t);
}
update(r);
return balance(r);
}
void erase(WBTree *t,const void *v){
t->root=erase_func(t->root,v,t);
}
void search(WBTree *t,int k,void *res){
if(k<1 || getSize(t->root)<k) return;
WBTNode *r=t->root;
while(1){
if(getSize(r->left)<k){
k-=getSize(r->left);
if(k==1){
memcpy(res,r->val,t->valSize);
return;
}
k--;
r=r->right;
} else {
r=r->left;
}
}
}
typedef long long int int64;
int cmp(const void *a,const void *b){
int64 p=*(int64 *)a;
int64 q=*(int64 *)b;
return p==q?0:p<q?-1:1;
}
void run(void){
int q,k;
scanf("%d%d",&q,&k);
WBTree *t=newWBTree(sizeof(int64),cmp);
for(int i=0;i<q;i++){
int c;
scanf("%d",&c);
if(c==1){
int64 v;
scanf("%lld",&v);
insert(t,&v);
} else if(getSize(t->root)<k){
printf("-1\n");
} else {
int64 v;
search(t,k,&v);
printf("%lld\n",v);
erase(t,&v);
}
}
}
int main(void){
run();
return 0;
}
akakimidori