Submission #389724

#TimeUsernameProblemLanguageResultExecution timeMemory
389724mehrdad_sohrabiAliens (IOI16_aliens)C++14
100 / 100
392 ms26848 KiB
// Black lives matter #include <bits/stdc++.h> #include "aliens.h" /// 500 485 462 A4 using namespace std; typedef long long int ll; typedef complex<double> point; typedef long double ld; #define pb push_back #define pii pair < ll , ll > #define F first #define S second //#define endl '\n' #define int long long #define sync ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0) #pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math") #define kill(x) return cout<<x<<'\n', 0; const int N=1e6+10,M=1e6+100,inf=(ll)1e15; ll dp[N]; ll T[N]; ll MX[N]; ll A[M]; vector <pii> B; /* void solve(ll l,ll r,ll L,ll R,ll k){ if (r<l) return; ll mid=(r+l)/2; ll id=0,mx=inf; for (int i=L;i<=min(R,mid);i++){ ll z=0; if (i>1){ if (B[i-1].F<B[i-2].S){ z=(B[i-2].S-B[i-1].F)*((B[i-2].S-B[i-1].F)); } } ll x=dp[i-1][(k-1)%2]+(B[mid-1].S-B[i-1].F)*(B[mid-1].S-B[i-1].F)-z; if (mx>x){ mx=x; id=i; } } dp[mid][k%2]=mx; // cout << l << " " << r << " " << mid << " " << k << " " << mx << endl; solve(l,mid-1,L,id,k); solve(mid+1,r,id,R,k); } */ vector <pair <int,pair <pii,int> > > line; ll intersect(pii x,pii y){ if (x.F==y.F){ cout << 1/0; if (x.S<=y.S) return -inf; else return inf; } return (y.S-x.S)/(x.F-y.F)+((y.S-x.S)%(x.F-y.F)>=0); } ll Z[N]; void add(pair <pii,int> X){ pii x=X.F; while(line.size()){ pii y=line.back().S.F; ll z=intersect(x,y); if (z<=line.back().F){ line.pop_back(); } else{ line.pb({z,{x,X.S}}); return ; } } line.pb({-inf,X}); } pii get(ll x){ auto t=lower_bound(line.begin(),line.end(),pair <int,pair <pii,int> > ({x,{{inf,inf},inf}}))-line.begin(); t--; pii p=line[t].S.F; return {x*p.F+p.S,line[t].S.S}; } ll t; void solve(ll mid){ line.clear(); for (int i=1;i<=t;i++){ dp[i]=(B[i-1].S-B[0].F)*(B[i-1].S-B[0].F)+mid; } memset(T,0,sizeof T); MX[1]=1; T[1]=1; for (int j=2;j<=t;j++){ MX[j]=1; ll ww=dp[j]; T[j]=1; ll z=0; if (B[j-1].F<B[j-2].S){ z=(B[j-2].S-B[j-1].F)*((B[j-2].S-B[j-1].F)); } Z[j-1]=z; add({{2*B[j-1].F,-(dp[j-1]-z+B[j-1].F*B[j-1].F+mid)},T[j-1]}); pii p=get(B[j-1].S); ll x=-p.F+B[j-1].S*B[j-1].S; if (x<dp[j]){ dp[j]=x; T[j]=p.S+1; } /* ll mx=ww,q=1; for (int f=1;f<j;f++){ if (dp[f]+(B[j-1].S-B[f].F)*(B[j-1].S-B[f].F)-Z[f]+mid==mx){ mx=dp[f]+(B[j-1].S-B[f].F)*(B[j-1].S-B[f].F)-Z[f]+mid; q=min(q,T[f]+1); MX[j]=max(MX[j],MX[f]+1); } if (dp[f]+(B[j-1].S-B[f].F)*(B[j-1].S-B[f].F)-Z[f]+mid<mx){ mx=dp[f]+(B[j-1].S-B[f].F)*(B[j-1].S-B[f].F)-Z[f]+mid; q=T[f]+1; MX[j]=MX[f]+1; } } if (mx!=dp[j]) cout << 1/0; dp[j]=mx; //if (mx!=dp[j] || q<T[j]) cout << mx << " " << dp[j] << " " << q << " " << T[j] << endl; T[j]=q; */ } } long long take_photos(int32_t n, int32_t m, int32_t k, std::vector<int32_t> r, std::vector<int32_t> c){ for (int i=0;i<M;i++) A[i]=i; for (int i=0;i<n;i++){ ll x=r[i],y=c[i]; A[max(x,y)]=min(A[max(x,y)],min(x,y)-1); } for (int i=0;i<m;i++){ if (A[i]<i){ while(B.size() && B.back().F>=A[i]) B.pop_back(); B.pb({A[i],i}); } } // for (auto u : B){ // cout << u.F << " " << u.S << endl; //} t=B.size(); ll l=-1,rr=(ll)1e13; ll ans=inf; while(rr-l>1){ ll mid=(rr+l)/2; solve(mid); if (T[t]<=k){ rr=mid; } else l=mid; } solve(rr); ans=dp[t]-k*rr; // cout << rr << " " << dp[t] << " " << T[t] << " " << MX[t] << endl; return ans; } /* int32_t main() { int n, m, k; assert(3 == scanf("%d %d %d", &n, &m, &k)); std::vector<int32_t> r(n), c(n); for (int i = 0; i < n; i++) { assert(2 == scanf("%d %d", &r[i], &c[i])); } long long ans = take_photos(n, m, k, r, c); printf("%lld\n", ans); return 0; } */ /* 5 7 2 0 3 4 4 4 6 4 5 4 6 */ //take_photos(5, 7, 2, [0, 4, 4, 4, 4], [3, 4, 6, 5, 6])

Compilation message (stderr)

aliens.cpp: In function 'll intersect(std::pair<long long int, long long int>, std::pair<long long int, long long int>)':
aliens.cpp:52:18: warning: division by zero [-Wdiv-by-zero]
   52 |         cout << 1/0;
      |                 ~^~
aliens.cpp: In function 'void solve(ll)':
aliens.cpp:91:16: warning: unused variable 'ww' [-Wunused-variable]
   91 |             ll ww=dp[j];
      |                ^~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...