Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdio>
- #include <vector>
- #include <string>
- #include <cstring>
- #include <algorithm>
- using namespace std;
- #ifdef LOCAL
- #define eprintf(...) fprintf(stderr, __VA_ARGS__)
- #else
- #define eprintf(...) 42
- #endif
- const int maxt = 1e7 + 1e6;
- const int N = (int)1e5 + 100;
- int ga[2][N];
- long long gans[2][2 * N];
- long long inf = 1e18;
- long long dOnPrefix[2 * N];
- int inQ[maxt];
- int st[maxt];
- long long sumSt[maxt];
- int sizeSt;
- int getA(int a[], int idx)
- {
- if (idx >= N) return 0;
- return a[idx];
- }
- int getGA(int type, int idx)
- {
- if (idx >= N) return 0;
- return ga[type][idx];
- }
- void addSt(int x)
- {
- st[sizeSt] = x;
- sumSt[sizeSt] = x;
- if (sizeSt != 0)
- sumSt[sizeSt] += sumSt[sizeSt - 1];
- sizeSt++;
- if (sizeSt >= maxt)
- throw 42;
- }
- void takeSt(int cnt)
- {
- sizeSt -= cnt;
- }
- long long costSt(int cnt)
- {
- return sumSt[sizeSt - 1] - sumSt[sizeSt - cnt - 1];
- }
- void solve(int n1, int n2, int a[], long long ans[] )
- {
- memset(dOnPrefix, 0, sizeof dOnPrefix);
- memset(inQ, 0, sizeof inQ);
- long long d = 0;
- int inq = 0;
- int mt = maxt / n2;
- for (int i = 0; i < N; i++)
- {
- dOnPrefix[i] = d;
- inQ[i] = inq;
- inq += a[i];
- d -= a[i] * 1LL * i;
- int x = min(inq, n1);
- d += x * 1LL * i;
- inq -= x;
- }
- long long sd = 0;
- sizeSt = 0;
- fprintf(stderr, "%d\n", mt * n2);
- for (int i = mt - 1; i >= 0; i--)
- {
- for (int j = 0; j < n2; j++)
- {
- addSt(i);
- }
- sd += costSt(getA(a, i) );
- sd -= i * 1LL * getA(a, i);
- takeSt(getA(a,i) );
- if (i < N)
- {
- ans[i] = sd + dOnPrefix[i] + costSt(inQ[i] );
- }
- }
- eprintf("inq: ");
- for (int i = 0; i < 10; i++)
- eprintf("%d ", inQ[i] );
- eprintf("\ndst: ");
- for (int i = 0; i < 10; i++)
- eprintf("%lld ", dOnPrefix[i] );
- eprintf("\n----------------------\n");
- }
- int main()
- {
- freopen("lanes.in", "r", stdin);
- #ifndef LOCAL
- freopen("lanes.out", "w", stdout);
- #endif
- int n1, n2, m, r;
- scanf("%d%d%d%d", &n1, &n2, &m, &r);
- for (int i = 0; i < m; i++)
- scanf("%d%d", &ga[0][i], &ga[1][i] );
- solve(n1 + 1, n1, ga[0], gans[0] );
- solve(n2, n2 + 1, ga[1], gans[1] );
- for (int t = 0; t < 2; t++)
- {
- for (int i = 0; i < 2 * m; i++)
- {
- eprintf("%lld ", gans[t][i] );
- }
- eprintf("\n");
- }
- long long answer = inf;
- int pos = -1;
- for (int i = 0; i < m; i++)
- {
- long long cur = gans[0][i] + gans[1][i + r];
- eprintf("%d : %lld %lld\n", i, gans[0][i], gans[1][i + r] );
- if (cur < answer)
- {
- answer = cur;
- pos = i;
- }
- }
- printf("%d\n", pos + 1);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement