結果
問題 | No.151 セグメントフィッシング |
ユーザー | latte0119 |
提出日時 | 2015-10-26 21:22:27 |
言語 | C++11 (gcc 11.4.0) |
結果 |
AC
|
実行時間 | 168 ms / 5,000 ms |
コード長 | 2,468 bytes |
コンパイル時間 | 2,032 ms |
コンパイル使用メモリ | 175,880 KB |
実行使用メモリ | 8,192 KB |
最終ジャッジ日時 | 2024-09-13 11:41:05 |
合計ジャッジ時間 | 4,479 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
6,812 KB |
testcase_01 | AC | 2 ms
6,940 KB |
testcase_02 | AC | 1 ms
6,940 KB |
testcase_03 | AC | 2 ms
6,940 KB |
testcase_04 | AC | 2 ms
6,944 KB |
testcase_05 | AC | 2 ms
6,940 KB |
testcase_06 | AC | 2 ms
6,944 KB |
testcase_07 | AC | 2 ms
6,940 KB |
testcase_08 | AC | 28 ms
6,944 KB |
testcase_09 | AC | 29 ms
6,940 KB |
testcase_10 | AC | 29 ms
6,944 KB |
testcase_11 | AC | 28 ms
6,944 KB |
testcase_12 | AC | 131 ms
7,808 KB |
testcase_13 | AC | 132 ms
7,680 KB |
testcase_14 | AC | 132 ms
7,808 KB |
testcase_15 | AC | 132 ms
7,808 KB |
testcase_16 | AC | 132 ms
7,680 KB |
testcase_17 | AC | 68 ms
8,192 KB |
testcase_18 | AC | 96 ms
8,192 KB |
testcase_19 | AC | 168 ms
7,296 KB |
testcase_20 | AC | 167 ms
7,296 KB |
testcase_21 | AC | 109 ms
8,192 KB |
testcase_22 | AC | 109 ms
8,192 KB |
testcase_23 | AC | 62 ms
6,940 KB |
ソースコード
#include<bits/stdc++.h> using namespace std; #define int long long struct RBST{ struct node{ node *lch,*rch; int val,sum,cnt; node(int val):val(val),sum(val),cnt(1),lch(NULL),rch(NULL){} }; node *root; RBST():root(NULL){} inline int count(node *t){return t?t->cnt:0;} inline int sum(node *t){return t?t->sum:0;} node *update(node *t){ if(!t)return t; t->cnt=count(t->lch)+count(t->rch)+1; t->sum=sum(t->lch)+sum(t->rch)+t->val; return t; } node *merge(node *a,node *b){ if(!a)return b; if(!b)return a; if(rand()%(count(a)+count(b))<count(a)){ a->rch=merge(a->rch,b); return update(a); } else{ b->lch=merge(a,b->lch); return update(b); } } pair<node *,node *>split(node *t,int k){ if(!t)return make_pair(t,t); if(k<=count(t->lch)){ pair<node *,node *>s=split(t->lch,k); t->lch=s.second; return make_pair(s.first,update(t)); } else{ pair<node *,node *>s=split(t->rch,k-count(t->lch)-1); t->rch=s.first; return make_pair(update(t),s.second); } } void insert(int k,int x){ pair<node *,node *>s=split(root,k); root=merge(merge(s.first,new node(x)),s.second); } int erase(int k){ pair<node *,node *>s1,s2; int ret; s1=split(root,k); s2=split(s1.second,1); ret=s2.first->val; root=merge(s1.first,s2.second); return ret; } int sum(int l,int r){ pair<node *,node *>s1,s2; int ret; s1=split(root,l); s2=split(s1.second,r-l); ret=s2.first->sum; root=merge(merge(s1.first,s2.first),s2.second); return ret; } }; int N,Q; RBST L,R; signed main(){ cin>>N>>Q; for(int i=0;i<N;i++){ L.insert(i,0); R.insert(i,0); } while(Q--){ char type; int x,y; cin>>type>>x>>y; if(type=='L'){ int val=L.erase(x); L.insert(x,val+y); } else if(type=='R'){ int val=R.erase(x); R.insert(x,val+y); } else{ cout<<L.sum(x,y)+R.sum(x,y)<<endl; } int l=L.erase(0); int r=R.erase(N-1); L.insert(N-1,r); R.insert(0,l); } return 0; }