結果
| 問題 |
No.511 落ちゲー 〜手作業のぬくもり〜
|
| コンテスト | |
| ユーザー |
akakimidori
|
| 提出日時 | 2018-12-05 19:11:43 |
| 言語 | C (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 78 ms / 4,000 ms |
| コード長 | 1,898 bytes |
| コンパイル時間 | 175 ms |
| コンパイル使用メモリ | 31,232 KB |
| 実行使用メモリ | 6,824 KB |
| 最終ジャッジ日時 | 2024-11-24 12:42:49 |
| 合計ジャッジ時間 | 1,629 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 5 |
| other | AC * 32 |
ソースコード
#include<stdio.h>
#include<stdlib.h>
typedef long long int int64;
typedef struct RMQandRAQ{
int64 *add;
int64 *max;
int size,bit;
} segTree;
segTree* newRMQandRAQ(const int n){
int k=0;
while((1<<k)<n) k++;
int size=1<<k;
segTree *s=(segTree *)malloc(sizeof(segTree));
s->add=(int64 *)calloc(2*size,sizeof(int64));
s->max=(int64 *)calloc(2*size,sizeof(int64));
s->size=size;
s->bit=k;
return s;
}
inline int64 max(int64 a,int64 b){
return a>b?a:b;
}
inline int64 calcMax(segTree *s,int k){
return s->add[k]+s->max[k];
}
void propagate(segTree *s,int k){
if(s->add[k]==0) return;
s->add[2*k ]+=s->add[k];
s->add[2*k+1]+=s->add[k];
s->add[k]=0;
s->max[k]=max(calcMax(s,2*k),calcMax(s,2*k+1));
return;
}
void add(segTree *s,int l,int r,int64 v){
l+=s->size;
r+=s->size-1;
for(int i=s->bit;i>0;i--){
propagate(s,l>>i);
propagate(s,r>>i);
}
for(int x=l,y=r+1;x<y;x>>=1,y>>=1){
if(x&1) s->add[x++]+=v;
if(y&1) s->add[--y]+=v;
}
l>>=1;
r>>=1;
while(l>=1){
s->max[l]=max(calcMax(s,2*l),calcMax(s,2*l+1));
s->max[r]=max(calcMax(s,2*r),calcMax(s,2*r+1));
l>>=1;
r>>=1;
}
}
int search_sub(segTree *s,int k,int l,int r,int64 h){
if(calcMax(s,k)<h) return 0;
if(k>=s->size){
add(s,k-s->size,k-s->size+1,-1000000000000000000LL);
return 1;
}
propagate(s,k);
int m=(l+r)/2;
int res=search_sub(s,2*k,l,m,h)+search_sub(s,2*k+1,m,r,h);
return res;
}
int search(segTree *s,int64 h){
return search_sub(s,1,0,s->size,h);
}
void run(void){
int n,w;
int64 h;
scanf("%d%d%lld",&n,&w,&h);
segTree *s=newRMQandRAQ(w);
int cnt[2]={0,0};
int i;
for(i=0;i<n && cnt[0]+cnt[1]<w;i++){
int a,b,x;
scanf("%d%d%d",&a,&b,&x);
add(s,x-1,x-1+a,b);
cnt[i&1]+=search(s,h);
}
printf("%s\n",cnt[0]==cnt[1]?"DRAW":cnt[0]>cnt[1]?"A":"B");
}
int main(void){
run();
return 0;
}
akakimidori