제출 #1191157

#제출 시각아이디문제언어결과실행 시간메모리
1191157simona1230Teams (IOI15_teams)C++20
21 / 100
19 ms5648 KiB
#include "teams.h" #include <bits/stdc++.h> using namespace std; int n; //static FILE *_inputFile, *_outputFile; struct ft { int a[5001]; ft(){} int query(int i) { int ans=0; for(;i>=0;i=(i&(i+1))-1) ans+=a[i]; return ans; } int query2(int l,int r) { if(l==-1)return query(r); return query(r)-query(l-1); } void update(int i) { for(;i<n;i=i|(i+1)) a[i]++; } }; struct node2 { ft x; int l,r; node2(){} node2(ft _x,int _l,int _r) { x=_x; l=_l; r=_r; } }; ft h; struct s2d { vector<node2> t={{h,-1,-1}}; s2d(){} void add_l(int i) { if(t[i].l!=-1)return; t[i].l=t.size(); t.push_back({h,-1,-1}); } void add_r(int i) { if(t[i].r!=-1)return; t[i].r=t.size(); t.push_back({h,-1,-1}); } void update(int i,int l,int r,int i1,int i2) { t[i].x.update(i2-1); if(l==r) return; int m=(l+r)/2; if(i1<=m) { add_l(i); update(t[i].l,l,m,i1,i2); } else { add_r(i); update(t[i].r,m+1,r,i1,i2); } } int query(int i,int l,int r,int l1,int r1,int l2,int r2) { if(i==-1||l1>r1)return 0; if(l1<=l&&r<=r1)return t[i].x.query2(l2-1,r2-1); int m=(l+r)/2; return query(t[i].l,l,m,l1,min(r1,m),l2,r2)+query(t[i].r,m+1,r,max(m+1,l1),r1,l2,r2); } }; s2d t; void init(int N, int A[], int B[]) { t.t={{h,-1,-1}}; n=N; for(int i=0;i<N;i++) t.update(0,1,n,A[i],B[i]); //fprintf(_outputFile,"%d ", t.query(0,1,maxn,1,3,3,5)); } int dp[500001]; int can(int M, int k[]) { sort(k,k+M); int answer=0; stack<pair<int,int> > s; for(int i=0;i<M;i++) { while(s.size()&&s.top().second==i)s.pop(); int v1=t.query(0,1,n,1,k[i],k[i],n)-k[i]; //fprintf(_outputFile,"%d ", v1); if(s.size()==0/*||dp[s.top().first]>=v1*/) { dp[i]=v1; s.push({i,M}); answer=min(answer,dp[i]); continue; } int j=s.top().first; dp[i]=dp[j]+t.query(0,1,n,k[j]+1,k[i],k[i],n)-k[i]; if(dp[i]>v1) { dp[i]=v1; while(s.size())s.pop(); s.push({i,M}); answer=min(answer,dp[i]); continue; } int ans=M; int l=i+1,r=M-1; while(l<=r) { int m=(l+r)/2; if(dp[i]+t.query(0,1,n,k[i]+1,k[m],k[m],n)>=dp[j]+t.query(0,1,n,k[j]+1,k[m],k[m],n)) { ans=m; r=m-1; } else l=m+1; } answer=min(answer,dp[i]); s.push({i,ans}); } /*for(int i=0;i<M;i++) { fprintf(_outputFile,"%d ", dp[i]); }*/ if(answer<0)return 0; return 1; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...