Skip to content

Commit 3197267

Browse files
authored
Merge pull request rachitiitr#6 from rachitkewl/master
Added Sliding Window
2 parents 9d8b3af + c998ae6 commit 3197267

File tree

1 file changed

+82
-0
lines changed

1 file changed

+82
-0
lines changed

Miscellanious/sliding_window.cpp

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
//sliding window maximum
2+
//https://people.cs.uct.ac.za/~ksmith/articles/sliding_window_minimum.html
3+
//http://codeforces.com/problemset/problem/372/C
4+
#include <bits/stdc++.h>
5+
using namespace std;
6+
#define gc getchar_unlocked
7+
#define fo(i,n) for(i=0;i<n;i++)
8+
#define Fo(i,k,n) for(i=k;k<n?i<n:i>n;k<n?i+=1:i-=1)
9+
#define ll long long
10+
#define si(x) scanf("%d",&x)
11+
#define sl(x) scanf("%lld",&x)
12+
#define ss(s) scanf("%s",s)
13+
#define pi(x) printf("%d\n",x)
14+
#define pl(x) printf("%lld\n",x)
15+
#define ps(s) printf("%s\n",s)
16+
#define pb push_back
17+
#define mp make_pair
18+
#define F first
19+
#define S second
20+
#define all(x) x.begin(), x.end()
21+
#define clr(x) memset(x, 0, sizeof(x))
22+
#define sortall(x) sort(all(x))
23+
#define tr(it, a) for(auto it = a.begin(); it != a.end(); it++)
24+
#define PI 3.1415926535897932384626
25+
typedef pair<int, int> pii;
26+
typedef pair<ll, ll> pll;
27+
typedef vector<int> vi;
28+
typedef vector<ll> vll;
29+
typedef vector<pii> vpii;
30+
typedef vector<pll> vpll;
31+
typedef vector<vi> vvi;
32+
typedef vector<vll> vvl;
33+
const int mod = 1000000007;
34+
const int N = 3e5;
35+
vi g[N];
36+
ll a[N], b[N], t[N];
37+
ll dp[3][N];
38+
int main()
39+
{
40+
ios_base::sync_with_stdio(false);
41+
cin.tie(NULL);
42+
int i,n,k,j,m,d;
43+
cin>>n>>m>>d;
44+
fo(i, m) cin>>a[i]>>b[i]>>t[i];
45+
int cur = 1, pre = 0;
46+
Fo(i, 1, n+1)
47+
dp[cur][i] = b[m-1]-abs(a[m-1]-i);
48+
swap(cur, pre);
49+
Fo(i, m-2, -1){
50+
deque<pll> window;
51+
ll dt = t[i+1]-t[i];
52+
dt *= d;
53+
k = min(n-1LL, dt);
54+
//moving from right to left
55+
//initially install [n-k+1, n]
56+
//j-k to j+k
57+
Fo(j, n, n-k){
58+
while(!window.empty() and window.back().F <= dp[pre][j])
59+
window.pop_back();
60+
window.pb({dp[pre][j], j});
61+
}
62+
Fo(j, n, 0){
63+
64+
int x = j-k;
65+
//add j-k to window
66+
if (x>0) {
67+
while(!window.empty() and window.back().F <= dp[pre][x])
68+
window.pop_back();
69+
window.pb({dp[pre][x], x});
70+
}
71+
//remove elements at pos > j+k
72+
while(!window.empty() and window.front().S > j+k) window.pop_front();
73+
dp[cur][j] = b[i]-abs(a[i]-j) + window.front().F;
74+
}
75+
swap(cur, pre);
76+
}
77+
ll ans = -1e17;
78+
Fo(i, 1, n+1) ans = max(ans, dp[pre][i]);
79+
cout<<ans<<endl;
80+
return 0;
81+
}
82+

0 commit comments

Comments
 (0)