https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=30&page=show_problem&problem=2727
题意:
给出一个01串,问平均值最大,且长度至少为L的区间端点。
大白上的题,写了之后发现是论文题...见周源《浅谈数形结合思想在信息学竞赛中的应用》
/* Footprints In The Blood Soaked Snow */ #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef double DB; const int maxn = 100005, maxq = maxn; int n, L, sum[maxn], q[maxq]; char str[maxn]; inline int y(int a, int b) { return sum[a] - sum[b]; } inline int x(int a, int b) { return a - b; } int main() { int T; scanf("%d", &T); while(T--) { scanf("%d%d%s", &n, &L, str + 1); for(int i = 1; i <= n; i++) sum[i] = sum[i - 1] + (str[i] == '1'); int h = 0, t = -1, ansl = 0, ansr = L; DB ans = sum[L] /(DB) L; for(int i = L; i <= n; i++) { int u = i - L; for(; h < t && y(u, q[t]) * x(u, q[t - 1]) <= y(u, q[t - 1]) * x(u, q[t]); t--); q[++t] = u; for(; h < t && y(i, q[h]) * x(i, q[h + 1]) <= y(i, q[h + 1]) * x(i, q[h]); h++); DB res = y(i, q[h]) /(DB) x(i, q[h]); if(res > ans) { ans = res; ansl = q[h]; ansr = i; } else if(res == ans && ansr - ansl > i - q[h]) { ansl = q[h]; ansr = i; } } printf("%d %d\n", ansl + 1, ansr); } return 0; }