제출 #522163

#제출 시각아이디문제언어결과실행 시간메모리
522163phamhoanghiepExamination (JOI19_examination)C++14
0 / 100
387 ms24780 KiB
#include<bits/stdc++.h> using namespace std; const int maxn=2e5+5; struct qry{ int x,y,z; int id; qry (int _x, int _y, int _z, int _id): x(_x), y(_y), z(_z), id(_id) {}; }; bool cmp(qry q1, qry q2) { if(q1.x==q2.x) { if(q1.y==q2.y) { if(q1.z==q2.z) return q1.id>q2.id; return q1.z>q2.z; } return q1.y>q2.y; } return q1.x>q2.x; } vector<qry> vt; int ans[maxn]; int S[maxn]; int T[maxn]; int X[maxn]; int Y[maxn]; int Z[maxn]; vector<int> val; map<int,int> yay; int n,q; struct Binary_indexed_tree{ int bit[2000000]; int n; void init(int _n) { n=_n; for(int i=0 ; i<=n ; i++) bit[i]=0; } void upd(int pos, int val) { for(int i=pos ; i<=n ; i+=i&(-i)) bit[i]+=val; } int get_val(int pos) { int ans=0; for(int i=pos ; i>0 ; i-=i&(-i)) ans+=bit[i]; return ans; } }BIT; void cdq(int l, int r) { if(l==r) return; int mid=(l+r)/2; cdq(l,mid); cdq(mid+1,r); int sum=0; int l_it=l; int r_it=mid+1; vector<int> record; // record the queries to reverse on BIT vector<qry> tmp; // for sorting according to y while(l_it<=mid&&r_it<=r) { if(vt[l_it].y>=vt[r_it].y) { if(!vt[l_it].id) { BIT.upd(vt[l_it].z,1); sum++; record.push_back(vt[l_it].z); } tmp.push_back(vt[l_it++]); } else { if(vt[r_it].id) { ans[vt[r_it].id]+=sum-BIT.get_val(vt[r_it].z-1); } tmp.push_back(vt[r_it++]); } } while(l_it<=mid) tmp.push_back(vt[l_it++]); while(r_it<=r) { if(vt[r_it].id) ans[vt[r_it].id]+=sum-BIT.get_val(vt[r_it].z-1); tmp.push_back(vt[r_it++]); } for(int i=l ; i<=r ; i++) vt[i]=tmp[i-l]; for(int i: record) BIT.upd(i,-1); record.clear(); tmp.clear(); } signed main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); //freopen("draft.inp","r",stdin); //freopen("draft.out","w",stdout); cin>>n>>q; for(int i=1 ; i<=n ; i++) { cin>>S[i]>>T[i]; val.push_back(S[i]); val.push_back(T[i]); val.push_back(S[i]+T[i]); } for(int i=1 ; i<=q ; i++) { cin>>X[i]>>Y[i]>>Z[i]; val.push_back(X[i]); val.push_back(Y[i]); val.push_back(Z[i]); } sort(val.begin(),val.end()); int cr=0; for(int i=0 ; i<val.size() ; i++) { if(!i||val[i]!=val[i-1]) { cr++; yay[val[i]]=cr; } } BIT.init(cr+5); for(int i=1 ; i<=n ; i++) { vt.push_back(qry(yay[S[i]],yay[T[i]],yay[S[i]+T[i]],0)); } for(int i=1 ; i<=q ; i++) { vt.push_back(qry(yay[X[i]],yay[Y[i]],yay[Z[i]],i)); } sort(vt.begin(),vt.end(),&cmp); cdq(0,n+q-1); for(int i=1 ; i<=q ; i++) { cout<<ans[i]<<'\n'; } }

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

examination.cpp: In function 'int main()':
examination.cpp:100:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  100 |     for(int i=0 ; i<val.size() ; i++) {
      |                   ~^~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...