結果
| 問題 | No.649 ここでちょっとQK! |
| コンテスト | |
| ユーザー |
akakimidori
|
| 提出日時 | 2018-09-10 01:34:03 |
| 言語 | C90 (gcc 12.3.0) |
| 結果 |
AC
|
| 実行時間 | 80 ms / 3,000 ms |
| コード長 | 2,556 bytes |
| 記録 | |
| コンパイル時間 | 872 ms |
| コンパイル使用メモリ | 22,016 KB |
| 実行使用メモリ | 6,272 KB |
| 最終ジャッジ日時 | 2024-12-25 15:00:17 |
| 合計ジャッジ時間 | 4,527 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 32 |
コンパイルメッセージ
main.c: In function ‘run’:
main.c:100:3: warning: ignoring return value of ‘scanf’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
100 | scanf("%d%d",&q,&k);
| ^~~~~~~~~~~~~~~~~~~
main.c:105:5: warning: ignoring return value of ‘scanf’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
105 | scanf("%d",&c);
| ^~~~~~~~~~~~~~
main.c:108:7: warning: ignoring return value of ‘scanf’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
108 | scanf("%lld",&v);
| ^~~~~~~~~~~~~~~~
ソースコード
#include<stdio.h>
#include<stdlib.h>
typedef long long int int64;
typedef int64 node;
typedef struct pairingHeapNode{
node val;
struct pairingHeapNode *next;
struct pairingHeapNode *child;
} heapNode;
typedef struct pairingHeap{
heapNode *root;
int heapSize;
heapNode *freeList;
int (*cmp)(const node *,const node *);
} heap;
heapNode* newHeapNode(heap *h,node *v){
heapNode *res=h->freeList;
h->freeList=h->freeList->next;
res->val=*v;
res->next=NULL;
res->child=NULL;
return res;
}
void freeHeapNode(heap *h,heapNode *r){
r->next=h->freeList;
h->freeList=r;
return;
}
heap* newHeap(int maxSize,int (*cmp)(const node *,const node *)){
heap *res=(heap *)malloc(sizeof(heap));
res->root=NULL;
res->heapSize=0;
res->freeList=(heapNode *)malloc(sizeof(heapNode)*maxSize);
int i;
for(i=0;i+1<maxSize;i++) res->freeList[i].next=res->freeList+i+1;
res->freeList[maxSize-1].next=NULL;
res->cmp=cmp;
return res;
}
heapNode* merge(heapNode *a,heapNode *b,int (*cmp)(const node *a,const node *b)){
if(a==NULL) return b;
if(b==NULL) return a;
if(cmp(&a->val,&b->val)){
b->next=a->child;
a->child=b;
return a;
} else {
a->next=b->child;
b->child=a;
return b;
}
}
void push(heap *h,node *v){
heapNode *p=newHeapNode(h,v);
h->heapSize++;
h->root=merge(h->root,p,h->cmp);
return;
}
void pop(heap *h,node *v){
*v=h->root->val;
heapNode *lst=h->root->child;
int (*cmp)(const node *a,const node *b)=h->cmp;
freeHeapNode(h,h->root);
h->heapSize--;
heapNode *r=NULL;
while(lst!=NULL && lst->next!=NULL){
heapNode *a=lst;
heapNode *b=lst->next;
heapNode *next=lst->next->next;
a->next=b->next=NULL;
r=merge(r,merge(a,b,cmp),cmp);
lst=next;
}
if(lst!=NULL){
r=merge(r,lst,cmp);
}
h->root=r;
return;
}
int cmpMin(const node *a,const node *b){
return *a<=*b;
}
int cmpMax(const node *a,const node *b){
return !cmpMin(a,b);
}
void run(void){
int q,k;
scanf("%d%d",&q,&k);
heap *maxHeap=newHeap(k+1,cmpMax);
heap *minHeap=newHeap(q-k,cmpMin);
while(q--){
int c;
scanf("%d",&c);
if(c==1){
int64 v;
scanf("%lld",&v);
push(maxHeap,&v);
if(maxHeap->heapSize>k){
pop(maxHeap,&v);
push(minHeap,&v);
}
} else if(maxHeap->heapSize<k){
printf("-1\n");
} else {
int64 v;
pop(maxHeap,&v);
printf("%lld\n",v);
if(minHeap->heapSize>0){
pop(minHeap,&v);
push(maxHeap,&v);
}
}
}
return;
}
int main(void){
run();
return 0;
}
akakimidori