제출 #623574

#제출 시각아이디문제언어결과실행 시간메모리
623574ACGN사탕 분배 (IOI21_candies)C++17
29 / 100
2367 ms798436 KiB
#include<bits/stdc++.h> using namespace std; //#define int long long #define vi vector<int> #define pii pair<int,int> #define vii vector<pii> #define pb push_back #include "candies.h" const int MAX = 1<<30; struct Node { int val,lazy,l,r,sl,sr; Node(int lb,int rb) { val=0;lazy=-1;l=-1;r=-1;sl=lb;sr=rb; } Node() { val=0;lazy=-1;l=-1;r=-1;sl=0;sr=MAX; } }; struct ilst { vector<Node> vn; int val = 0; ilst() { vn.pb(Node()); } void push(int pos) { //cout<<"p("<<pos<<") "; int lh=vn[pos].sl; int rh=vn[pos].sr; int mh=(lh+rh)/2; if ((rh==lh+1)) { if (vn[pos].lazy!=-1) vn[pos].val=vn[pos].lazy; vn[pos].lazy=-1;return; } if (vn[pos].l==-1) { vn[pos].l=vn.size(); vn.pb(Node(lh,mh)); } if (vn[pos].r==-1) { vn[pos].r=vn.size(); vn.pb(Node(mh,rh)); } if (vn[pos].lazy==-1) return; //vn[pos].val=vn[pos].lazy * (rh-lh); vn[vn[pos].l].lazy = vn[pos].lazy; vn[vn[pos].l].val = vn[pos].lazy * (mh-lh); vn[vn[pos].r].lazy = vn[pos].lazy; vn[vn[pos].r].val = vn[pos].lazy * (mh-lh); vn[pos].lazy=-1; } int sum(int x) { //cout<<"sum("<<x<<")"; int total = 0,cp=0; for (int i=29;i>=0;i--) { int dest; push(cp); if (x&(1<<i)) { dest=vn[cp].r; int lp = vn[cp].l;if (lp!=-1) { //push(lp); total+=vn[lp].val; } if (dest==-1) {return total;} } else { dest=vn[cp].l; if (dest==-1) {return total;} } cp=dest; } {return total;} } int _bs(int cp,int x) { // first t,sum(t)>=x int dest; if (vn[cp].sr==vn[cp].sl+1) return vn[cp].sr; push(cp); int v = vn[vn[cp].l].val; if (v>=x) return _bs(vn[cp].l,x); x-=v;return _bs(vn[cp].r,x); } int bs(int x) { if (vn[0].val<x) return MAX; return _bs(0,x); } void _upd(int i,int cl,int cr,int tl,int tr,int val) { if (i==-1) return; if (cr<=tl) return; if (tr<=cl) return; if ((tl<=cl)&&(cr<=tr)) { vn[i].val=val*(cr-cl); vn[i].lazy=val;return; } push(i); int mid = (cl+cr)/2; _upd(vn[i].l,cl,mid,tl,tr,val); _upd(vn[i].r,mid,cr,tl,tr,val); vn[i].val = vn[vn[i].l].val + vn[vn[i].r].val; } void upd(int l,int r,int v) { val = v; //cout<<"UPD("<<l<<","<<r<<","<<v<<")\n"; _upd(0,0,MAX,l,r,v); } }; vi distribute_candies(vi c,vi l,vi r,vi v) { int n = c.size(); ilst st; //cout<<"HI?"<<endl; for (auto e:v) { if (e>0) { st.upd(0,1,st.val+e); //cout<<"OK UPD"<<endl; int lo=0,hi=MAX; while (hi>lo+1) { int mid = (hi+lo)/2; if (st.sum(mid)>mid) lo=mid; else hi=mid; } //cout<<hi<<endl; st.upd(0,hi,1); //cout<<"OK DONE"<<endl; } else { //cout<<st.bs(-e)<<endl; st.upd(0,st.bs(-e),0); //cout<<"OK UPD DONE"<<endl; } } vi va; for (int i=0;i<c.size();i++) { va.pb(st.sum(c[i])); } return va; }

컴파일 시 표준 에러 (stderr) 메시지

candies.cpp: In member function 'int ilst::_bs(int, int)':
candies.cpp:76:13: warning: unused variable 'dest' [-Wunused-variable]
   76 |         int dest;
      |             ^~~~
candies.cpp: In function 'std::vector<int> distribute_candies(std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>)':
candies.cpp:135:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  135 |     for (int i=0;i<c.size();i++) {
      |                  ~^~~~~~~~~
candies.cpp:109:9: warning: unused variable 'n' [-Wunused-variable]
  109 |     int n = c.size();
      |         ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...