제출 #1191175

#제출 시각아이디문제언어결과실행 시간메모리
1191175simona1230Teams (IOI15_teams)C++20
77 / 100
1050 ms173556 KiB
#include "teams.h" #include <bits/stdc++.h> using namespace std; const long long maxn=6*1e5+5; vector<long long> t[4*maxn]; long long n; void update(long long i,long long l,long long r,long long id,long long vl) { if(l==r) { t[i].push_back(vl); return; } long long m=(l+r)/2; if(id<=m)update(i*2,l,m,id,vl); else update(i*2+1,m+1,r,id,vl); } void trans(long long i,long long l,long long r) { if(l==r) { sort(t[i].begin(),t[i].end()); return; } long long m=(l+r)/2; trans(i*2,l,m); trans(i*2+1,m+1,r); long long i1=0,i2=0; while(i1<t[i*2].size()||i2<t[i*2+1].size()) { if(i1==t[i*2].size())t[i].push_back(t[i*2+1][i2++]); else if(i2==t[i*2+1].size()||t[i*2][i1]<t[i*2+1][i2])t[i].push_back(t[i*2][i1++]); else t[i].push_back(t[i*2+1][i2++]); } } long long query(long long i,long long l,long long r,long long ql,long long qr,long long qid) { //cout<<l<<" - "<<r<<endl; if(ql>qr)return 0; if(ql<=l&&r<=qr) { long long id=t[i].size(); long long lf=0,rt=t[i].size()-1; while(lf<=rt) { long long m=(lf+rt)/2; //cout<<"? "<<m<<" "<<lf<<" "<<rt<<endl; if(t[i][m]>=qid) { rt=m-1; id=m; } else lf=m+1; } /*for(long long j=0;j<t[i].size();j++) cout<<t[i][j]<<" "; cout<<endl; cout<<id<<" "<<qid<<" +"<<endl;*/ return t[i].size()-id; } long long m=(l+r)/2; return query(i*2,l,m,ql,min(qr,m),qid)+query(i*2+1,m+1,r,max(m+1,ql),qr,qid); } void init(int N, int A[], int B[]) { n=N; for(long long i=0;i<N;i++) update(1,1,n,A[i],B[i]); trans(1,1,n); //fprlong longf(_outputFile,"%d ", t.query(0,1,maxn,1,3,3,5)); } long long dp[500005]; int can(int M, int k[]) { sort(k,k+M); long long answer=0; stack<pair<long long,long long> > s; for(long long i=0;i<M;i++) { while(s.size()&&s.top().second==i)s.pop(); long long v1=query(1,1,n,1,k[i],k[i])-k[i]; //fprlong longf(_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; } long long j=s.top().first; dp[i]=dp[j]+query(1,1,n,k[j]+1,k[i],k[i])-k[i]; if(dp[i]>v1) { dp[i]=v1; while(s.size())s.pop(); s.push({i,M}); answer=min(answer,dp[i]); continue; } long long ans=M; long long l=i+1,r=M-1; while(l<=r) { long long m=(l+r)/2; if(dp[i]+query(1,1,n,k[i]+1,k[m],k[m])>=dp[j]+query(1,1,n,k[j]+1,k[m],k[m])) { ans=m; r=m-1; } else l=m+1; } answer=min(answer,dp[i]); s.push({i,ans}); } /*for(long long i=0;i<M;i++) { fprlong longf(_outputFile,"%d ", dp[i]); }*/ if(answer<0)return 0; return 1; } /*long long main() { cin>>n; for(long long i=1;i<=n;i++) { long long x,y; cin>>x>>y; update(1,1,10,x,y); } trans(1,1,10); cout<<"done"<<endl; long long q; cin>>q; for(long long i=1;i<=q;i++) { long long x,y,xx,yy; cin>>x>>y>>xx>>yy; cout<<query(1,1,10,x,y,xx)<<endl; } return 0; }*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...