JZOJ 5396. 【NOIP2017提高A组模拟10.6】Blocks
2017-10-06 21:48
691 查看
Description
Input
Output
Sample Input
10 51 7 9 9 5 9 3 4 5 8
5 7 20 9 1
Sample Output
10 6 0 2 10Data Constraint
Solution
主要思路:单调队列× 2 。因为操作次数不限,因此若一段区间平均值超过 K ,即为一组合法解。
将 Ai 减去 K ,用 sum 记录前缀和,区间变成和 ≥0 即为合法。
Fi 表示右端点为 i 的合法区间中最小的左端点。则:
Fi=Min(j)(1≤j≤i 且 sum[i]−sum[j−1]≥0)
显然如果存在 k<j 而且 sum[k]<sum[j] ,则 j 为无用决策。
单调栈维护决策即可。
每次计算 Fi 时二分答案。
时间复杂度:O(M∗N∗logN) 。
想过?
这种复杂度应该 TLE。
事实上,我们并不需要求出所有的 Fi ,而只需要最大的 i−Fi 。
显然如果有 i<k 且 sum[i]≤sum[k] ,那么 i−Fi 事实上也没有用。
剩下的询问中,sum 具有单调性。
这样就可以使用两个指针完美解决了。
时间复杂度:O(M∗N) 。
我当然不会告诉你 sum 要开 longlong 。
Code
#include<cstdio> using namespace std; const int N=1e6+2; int a ,q ; long long sum ; inline int read() { int X=0,w=1; char ch=0; while(ch<'0' || ch>'9') {if(ch=='-') w=-1;ch=getchar();} while(ch>='0' && ch<='9') X=(X<<3)+(X<<1)+ch-'0',ch=getchar(); return X*w; } int main() { int n=read(),m=read(); for(int i=1;i<=n;i++) a[i]=read(); while(m--) { int k=read(),ans=0; for(int i=q[0]=1;i<=n;i++) { sum[i]=sum[i-1]+a[i]-k; if(sum[i]<sum[q[q[0]]]) q[++q[0]]=i; } for(int i=n;i;i--) { while(q[0] && sum[q[q[0]]]<=sum[i]) q[0]--; if(i-q[q[0]+1]>ans) ans=i-q[q[0]+1]; } printf("%d ",ans); } return 0; }
相关文章推荐
- [JZOJ5396]【NOIP2017提高A组模拟10.6】Blocks
- [JZOJ5395]【NOIP2017提高A组模拟10.6】Count
- JZOJ5397. 【NOIP2017提高A组模拟10.6】Biology
- 【JZOJ 5395】【NOIP2017提高A组模拟10.6】Count
- JZOJ 5397. 【NOIP2017提高A组模拟10.6】Biology
- JZOJ 5395. 【NOIP2017提高A组模拟10.6】Count
- JZOJ 5395. 【NOIP2017提高A组模拟10.6】Count
- 【jzoj5247】【NOIP2017提高A组模拟8.10】【计算几何】【二分答案】
- JZOJ 4919. 【NOIP2017提高组模拟12.10】神炎皇
- [JZOJ5390]【NOIP2017提高A组模拟9.26】逗气
- jzoj5394 【NOIP2017提高A组模拟10.5】Ping
- JZOJ5394. 【NOIP2017提高A组模拟10.5】Ping 树上差分 树状数组
- JZOJ 5400. 【NOIP2017提高A组模拟10.7】Repulsed
- JZOJ 5347. 【NOIP2017提高A组模拟9.5】遥远的金字塔
- JZOJ5354. 【NOIP2017提高A组模拟9.9】导弹拦截
- JZOJ 5185. 【NOIP2017提高组模拟6.30】tty's sequence
- JZOJ 5354. 【NOIP2017提高A组模拟9.9】导弹拦截
- JZOJ 100030. 【NOIP2017提高A组模拟7.8】为了爱情
- 【jzoj5248】【NOIP2017提高A组模拟8.10】【花花的聚会】【动态规划】【可持久化线段树】
- 【JZOJ 5249】【NOIP2017提高A组模拟8.10】文本编辑器