Submission #1140198

#TimeUsernameProblemLanguageResultExecution timeMemory
1140198liangjeremyRabbit Carrot (LMIO19_triusis)C++20
0 / 100
1096 ms840 KiB
#include<bits/stdc++.h> #include<random> using namespace std; using db=double; using ll=long long; using sll=__int128;//super long long using lb=long double;//lb is slow //numbers for hashing: b(19260817),mod(998244353) // freopen("lasers.in", "r", stdin); // freopen("lasers.out", "w", stdout); class BinaryIndexedTree{ private: vector<int>bit; public: BinaryIndexedTree(int n){ bit.resize(n+1); } void update(int index, int delta){ while(bit.size()>index){ bit[index]=min(bit[index],delta); index+=index&-index; } } int query(int index){ int mx=1e9; while(index>0){ mx=min(mx,bit[index]); index-=index&-index; } return mx; } }; int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n,m; cin>>n>>m; vector<int>a(n+1); map<int,vector<int>>mp; for(int i=1; i<=n; i++){ cin>>a[i]; a[i]-=i*m; mp[a[i]].push_back(i); } mp[a[0]].push_back(0); vector<int>b(n+1); int count=n+1; for(auto x:mp){ count--; for(auto y:x.second){ b[y]=count; } } BinaryIndexedTree BIT(n+1); vector<int>dp(n+1); int start=1; while(a[start]-m>a[start-1] && start<=n){ a[start]=a[start-1]; start++; } for(int i=start; i<=n; i++){ dp[i]=i-1+BIT.query(b[i]); BIT.update(b[i],dp[i]-i); } cout<<dp[n]+start-1<<'\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...