Submission #626330

#TimeUsernameProblemLanguageResultExecution timeMemory
626330PoPularPlusPlusRadio Towers (IOI22_towers)C++17
23 / 100
4030 ms9144 KiB
#include "towers.h" #include <bits/stdc++.h> using namespace std; #define vf first #define vs second #define mp(x,y) make_pair(x,y) struct Seg { int siz = 1; vector<int> sums; void init(int n){ while(siz < n)siz*=2; sums.assign(siz * 2, 0LL); } void set(int i , int v , int x , int lx , int rx){ if(rx - lx ==1){ sums[x] = v; return; } int m = (lx + rx) / 2; if(i < m){ set(i , v , 2 * x + 1 , lx , m); } else { set(i , v , 2 * x + 2 , m , rx); } sums[x]=max(sums[2 * x + 1] , sums[2 * x + 2]); } void set(int x , int y){ set(x ,y , 0 , 0 , siz); } int sum(int l , int r , int x , int lx , int rx){ if(lx >= l && rx <= r){ return sums[x]; } if(lx >= r || rx <= l)return 0; int m = (lx + rx) / 2; return max(sum(l , r , 2 * x + 1 , lx , m) , sum(l , r , 2 * x + 2 , m , rx)); } int sum(int l , int r){ return sum(l , r , 0 , 0 , siz); } }; vector<int> arr; void init(int n, std::vector<int> h) { arr = h; } int max_towers(int l , int r , int d) { Seg st; int n = arr.size(); st.init(n+1); set<pair<int,int>> s; int dp[n]; int left[n]; for(int i = n - 1; i >= 0; i--){ while(s.size() && (*(s.begin())).vf <= arr[i] - d){ left[(*(s.begin())).vs] = i; s.erase(s.begin()); } s.insert(mp(arr[i] , i)); } while(s.size()){ left[(*(s.begin())).vs] = -1; s.erase(s.begin()); } set<pair<int,pair<int,int>>> s1; //for(int i = 0; i < n; i++)cout << left[i] << ' '; memset(dp,0,sizeof dp); for(int i = l; i <= r; i++){ dp[i] = 1; while(s1.size() && (*(s1.begin())).vf <= arr[i] - d){ int pos = (*(s1.begin())).vs.vs; dp[pos] = max(dp[pos] , (*(s1.begin())).vs.vf); st.set(pos , dp[pos]); s1.erase(s1.begin()); } if(i > 0)dp[i] = max(dp[i] , dp[i-1]); int cur = 1; int p = left[i]; if(p >= l){ cur += st.sum(l , p); } s1.insert(mp(arr[i] , mp(cur , i))); } while(s1.size()){ int pos = (*(s1.begin())).vs.vs; dp[pos] = max(dp[pos] , (*(s1.begin())).vs.vf); s1.erase(s1.begin()); } int ans = 0; for(int i = l; i <= r; i++)ans = max(ans , dp[i]); return ans; }
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...