제출 #108521

#제출 시각아이디문제언어결과실행 시간메모리
108521rajarshi_basuAliens (IOI16_aliens)C++14
컴파일 에러
0 ms0 KiB
#include <iostream> #include <vector> #include <set> #include <iomanip> #include <algorithm> #include <functional> #include <stdio.h> #include <cmath> #include <queue> //#include <string> //#include <map> //#include <complex> //#include <chrono> //#include <random> //#include <stack> //#include <set> //#include <fstream> #define FOR(i,n) for(int i = 0;i < n; i++) #define FORE(i,a,b) for(int i = a; i <= b ; i++) #define ss second #define ff first #define ll long long int #define ii pair<ll,ll> #define il pair<int,ll> #define li pair<ll,int> #define x ff #define y ss #define lii pair<ll,pair<int,int> > #define piil pair<int ,pair<int,int> > #define iii pair<pair<int,int>,int> #define pll pair<ll,ll> #define vi vector<int> #define pb push_back #define mp make_pair #include "aliens.h" using namespace std; const ll INF = 1e18; vector<ii> all; vector<ii> reduceList(vector<ii> v){ sort(v.begin(), v.end()); vector<ii> res; ll mx = 0; for(auto e:v){ if(res.empty())res.pb(e); else if(res.back().ff < e.ff){ if(e.ss > mx)res.pb(e); }else{ res.back() = e; } mx = max(mx,e.ss); } return res; } vector<ii> createRanges(vi r,vi c,int n){ vector<ii> all; FOR(i,n)all.pb({min(r[i],c[i]),max(r[i],c[i])}); return all; } ll C1[50*1000+1]; void prec(){ C1[0] = 0; FORE(i,1,(int)all.size()-1){ C1[i] = max((ll)0,all[i-1].ss - all[i].ff+1); C1[i] *= C1[i]; } } ll cost(int t,int i){ i--; //cout << "afsf " << i << " " << all.size() << endl; ll t1 = all[i].ss - all[t].ff + 1; t1*=t1; ll t2 = C1[t]; //cout << t1 << " " << t2 << endl; //cout << t1-t2 << endl; return t1 - t2; } struct Node{ int left; int right; pll p; Node(){ left = -1; right = -1; p = {1e9,1e9}; } void init(){ left = -1; right = -1; p = {1e9,1e9}; } }; Node B[500*100*100]; int PTR = 0; inline int get(){ //cout << PTR << endl; B[PTR].init(); //cout << "wow" << endl; return PTR++; } class Segtree{ int n; int head; inline void expand(int& nd){ //cout << nd << endl; } inline ll eval(pll p,ll x){ return p.ff*x+ p.ss; } inline double intersect(pll p1,pll p2){ return (p1.ss-p2.ss)*1.0/(p2.ff-p1.ff); } void update(int& node,int ss,int se,pll ln){ if(node == -1)node = get(); if(ss == se){ if(eval(ln,ss) < eval(B[node].p,ss)){ B[node].p = ln; } return; } ll v1 = eval(ln,ss); ll v2 = eval(ln,se); ll v3 = eval(B[node].p,ss); ll v4 = eval(B[node].p,se); if(v1 <= v3 and v2 <= v4){ B[node].p = ln; return; }else if(v3 <= v1 and v4 <= v2){ return; } int mid = (ss+se)/2; update(B[node].left,ss,mid,ln); update(B[node].right,mid+1,se,ln); } ll query(int node,int ss,int se,int i){ if(node == -1) return INF; if(i > se or i < ss)return INF; if(ss == se){ return eval(B[node].p,i); } int mid = (ss+se)/2; return min(min(eval(B[node].p,i),query(B[node].left,ss,mid,i)),query(B[node].right,mid+1,se,i)); } public : Segtree(){ PTR = 0; head = get(); // cout << head << endl; } inline void init(){ PTR = 0; head = get(); } inline void addLine(ll m,ll c){ update(head,0,1e6+1,{m,c}); } inline ll query(ll x){ return query(head,0,1e6+1,x); } }; class SqrtSegtree{ deque<pll> cht; deque<pll> buffer; vector<pll> all; #define ld long double inline ld intersect(pll p1,pll p2){ return ((ld)(p1.ss-p2.ss)*1.0)/(p2.ff-p1.ff); } inline ll eval(pll p1,ll x){ return p1.ff*x+p1.ss; } inline void update(){ if(buffer.size() > 1){ //reverse(cht.begin(), cht.end()); //for(auto e:cht)buffer.push_front(e); //cht.clear(); for(auto e:buffer){ while(cht.size() > 1 and intersect(cht[(int)cht.size()-2],e) > intersect(cht.back(),e)) cht.pop_back(); cht.push_back(e); } buffer.clear(); } } ll binsrch(ll x){ int lo = 0;int hi = (int)cht.size()-1; ll best = INF; while(hi >= lo){ if(hi-lo < 5){ FORE(i,lo,hi) best = min(best,eval(cht[i],x)); break; } int mid = (lo+hi)/2; ll val1 = eval(cht[mid],x); ll val2 = eval(cht[mid+1],x); ll val3 = eval(cht[mid-1],x); best = min(best,min(val1,min(val2,val3))); if(val1 < val2 and val1 < val3){ break; }else if(val1 >= val2){ lo = mid+1; }else if(val1 >= val3){ hi = mid-1; } } return best; } public : inline void addLine(ll m,ll c){ buffer.pb({m,c}); all.pb({m,c}); update(); } inline ll query(ll x){ ll best = binsrch(x); for(auto e:buffer) { best = min(best, eval(e,x)); } return best; } inline void init(){ buffer.clear(); cht.clear(); } }; ll dp[2][50*1000+1]; int opt[2][50*1000+1]; ll E[50*1000+1]; //int opt[50*1000+1][2]; //Segtree ds[50*1000+1]; void computeDp(int k){ // cout << "e" << endl; int n = all.size(); k = min(n,k); FOR(i,n+1)dp[0][i] = INF; dp[0][0] = 0; // cout << "j" << endl; vector<pll> lns; vector<ll> add; //cout << "d" << endl; FOR(i,n){ add.pb(all[i].ss*all[i].ss + 1 + 2*all[i].ss); } FOR(i,n)E[i] = all[i].ff*all[i].ff - 2*all[i].ff; //cout << "e" << endl; SqrtSegtree ds; FOR(j,k+1){ if(j == 0)continue; dp[1][0] = 0; //cout << " e" << endl; ds.init(); //cout << "d" << endl; for(int i = 1;i <= n;i++){ ds.addLine((-2*all[t-1].ff),(dp[0][t-1] - C1[t-1] + E[t-1])); ll mn = ds.query(all[i-1].ss); dp[1][i] = mn + add[i-1]; } FOR(i,n)dp[0][i] = dp[1][i]; } } void computeDp2(int k){ int n = all.size(); k = min(n,k); FOR(i,n+1)dp[0][i] = INF; dp[0][0] = 0; FOR(j,k+1){ if(j == 0)continue; dp[1][0] = 0; for(int i = n;i>=1;i--){ ll opti = dp[0][0]+cost(0,i); int ind = 1; FORE(t,max(opt[0][i],2),(i==n?n:opt[1][i+1])){ if(opti > dp[0][t-1] + cost(t-1,i)){ opti = dp[0][t-1] + cost(t-1,i); ind = t; } } opt[1][i] = ind; dp[1][i] = opti; } FOR(i,n)dp[0][i] = dp[1][i],opt[0][i]= opt[1][i]; } } ll take_photos(int n,int m,int k,vi r,vi c){ all = reduceList(createRanges(r,c,n)); prec(); if(k > 101)computeDp2(k);else //for(auto e:all)cout << e.ff<< ";"<<e.ss << endl; computeDp(k);/* FOR(i,min((int)all.size(),k)+1){ FOR(j,all.size()+1){ cout << dp[i][j] << " "; };cout << endl;}*/ return dp[1][all.size()]; //return 0; } /* int main(){ //int a[2] = {2,4,4,4,4}; //int b[2] = {3,5,6,5,6}; vi a; vi b; a.pb(1);a.pb(4); b.pb(6);b.pb(7); cout << take_photos(2,7,2,a,b) << endl; return 0; } */

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

aliens.cpp: In function 'void computeDp(int)':
aliens.cpp:292:32: error: 't' was not declared in this scope
             ds.addLine((-2*all[t-1].ff),(dp[0][t-1] - C1[t-1] + E[t-1]));
                                ^