Submission #234275

#TimeUsernameProblemLanguageResultExecution timeMemory
234275anubhavdharMountains (IOI17_mountains)C++14
20 / 100
186 ms384 KiB
#include<bits/stdc++.h> #include "mountains.h" #define ll long long int #define pb push_back #define mp make_pair #define FOR(i,n) for(i=0;i<(n);++i) #define FORe(i,n) for(i=1;i<=(n);++i) #define FORr(i,a,b) for(i=(a);i<(b);++i) #define FORrev(i,n) for(i=(n);i>=0;--i) #define F0R(i,n) for(int i=0;i<(n);++i) #define F0Re(i,n) for(int i=1;i<=(n);++i) #define F0Rr(i,a,b) for(ll i=(a);i<(b);++i) #define F0Rrev(i,n) for(int i=(n);i>=0;--i) #define ii pair<ll,ll> #define vi vector<ll> #define vii vector<ii> #define ff first #define ss second #define cd complex<double> #define vcd vector<cd> #define ldd long double #define dbgLine cout<<"Line : "<<__LINE__<<'\n' #define all(x) (x).begin(),(x).end() using namespace std; /* const short int __PRECISION = 10; const ll MOD = 1e9+7; const ll INF = 1e17 + 1101; const ll LOGN = 17; const ll MAXN = 2e5+5; const ll ROOTN = 320; const ldd PI = acos(-1); const ldd EPS = 1e-7; */ #define INF 100000000000000000 inline bool xr(bool a, bool b) { return ((a && (!b)) || (b && (!a))); } ii mx(ii slope1, ii slope2) { return ((xr( slope1.ff * slope2.ss > slope2.ff * slope1.ss , slope1.ss * slope2.ss < 0)) ? slope1 : slope2); } /* int maximum_deevs(vector<int> y) { int N = y.size(); pair<int, int> A[N]; ii maxSlope[N][N]; F0R(i, N) F0R(j, N) maxSlope[i][j] = mp(-INF,1); F0R(i, N) F0Rr(j, i+1, N) { maxSlope[i][j] = mx(maxSlope[i][j-1], mp(y[j] - y[i], j - i)); // cout<<"maxSlope["<<i<<"]["<<j<<"] = "<<maxSlope[i][j].ff<<'/'<<maxSlope[i][j].ss<<'\n'; } F0R(i, N) A[i] = mp(y[i], i); sort(A, A + N); vector<int> Answer; F0R(i, N) { bool ok = true; // cout<<A[i].ff<<","<<A[i].ss<<'\n'; for(int j : Answer) { int a = min(A[i].ss, j), b = max(A[i].ss, j); if(mx(maxSlope[a][b],mp((ll)y[b] - y[a], (ll)b - a)) == mp((ll)y[b] - y[a], (ll)b - a)) { ok = false; break; } } if(ok) Answer.pb(A[i].ss); // else // cout<<"no\n"; } // cout<<Answer.size()<<'\n'; // for(int i : Answer) // cout<<y[i]<<' '<<i<<'\n'; return Answer.size(); }*/ int maximum_deevs(vector<int> y) { int N = y.size(); // pair<int, int> A[N]; ii maxSlope[N][N]; F0R(i, N) F0R(j, N) maxSlope[i][j] = mp(-INF,1); F0R(i, N) F0Rr(j, i+1, N) { maxSlope[i][j] = mx(maxSlope[i][j-1], mp(y[j] - y[i], j - i)); // cout<<"maxSlope["<<i<<"]["<<j<<"] = "<<maxSlope[i][j].ff<<'/'<<maxSlope[i][j].ss<<'\n'; } pair<int, int> ans = mp(-1, -1); F0R(mask, (1<<N)) { vector<int> tmp; bool ok = true; F0R(i, N) if(mask&(1<<i)) tmp.pb(i); for(int i : tmp) { for(int j : tmp) { if(i == j) continue; int a = min(i, j), b = max(i, j); if(mx(maxSlope[a][b],mp((ll)y[b] - y[a], (ll)b - a)) == mp((ll)y[b] - y[a], (ll)b - a)) { // cout<<(bitset<6>(mask).to_string())<<" not ok due to indices "<<a<<" and "<<b<<'\n'; ok = false; break; } } if(!ok) break; } if(ok) ans = max(ans, mp(__builtin_popcount(mask), mask)); } // cout<<"found "<<(bitset<6>(ans.ss).to_string())<<'\n'; return ans.ff; } /* int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int N; vector<int> y; cin>>N; F0R(i, N) { int j; cin>>j; y.pb(j); } cout<<maximum_deevs(y)<<' '<<maximum_deevs_brute(y); int a = 0, b = 0; int r = 3, cnt=0; while(a == b) { N = rand()%r; if(N == 0) N = r; y.clear(); y.resize(N); for(int& x : y) x = rand()%100000; a = maximum_deevs(y); b = maximum_deevs_brute(y); cout<<++cnt<<'\n'; } cout<<"Input : "<<N<<'\n'; for(int x : y) cout<<x<<' '; cout<<'\n'<<a<<' '<<b; return 0; } 5 26924 19072 6270 5829 26777 1 2 4 5686 6021 11662 14721 1 2 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...