OvO http://codeforces.com/contest/954/problem/G

  二分答案,

  对于每个二分的答案值 ANS,判断这个答案是否可行。

  记 s 数组为题目中描述的 a 数组

  以下为初始化:

    首先建一个 pre 数组, pre[i] 表示 s 数组中第 个元素到第 i 个元素的和

    然后建一个 p 数组,其中 p[i] 代表能射到第 i 个区域的弓箭手数量, p[i] 显然可以由 pre 计算得到

  以下是对于二分的每个答案值 ANS,判断这个值是否可行的做法:

    创建一个 d 数组, d[i] = p[i] - p[i-1],

    从左到右枚举 d 数组,用变量 now 累加得到当前区域的坚固程度(即能有多少弓箭手能射到这个块)

    枚举的过程中,如果出现 now 比 ANS 值小的话,则得到这个差值, 记这个差值为 tmp ,那么显然要在 i+r 的地方放 tmp 个弓兵,那么要做如下操作

      1. now+=tmp (则当前节点的坚固程度+tmp)

      2.d[i+2*r+1)]-=tmp (区域 [i,i+2*r] 的坚固程度均加 tmp,等价的就是 1,2 这两个操作)

      3.记总的可用弓兵消耗为为 cst ,则 cst+=tmp

    如果 cst>k 显然不行,否则可行。

  注意数据范围,容易中间爆 long long 之类的,用线段树时间大概不够(吧)

  

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cstdio> using namespace std; typedef long long ll; const ll M=11e5+44;
const ll INF=4e18+44; ll n,r;
ll s[M];
ll k;
ll p[M],pre[M],d[M]; bool check(ll spl)
{
ll cst=0,now=0,tmp;
for(ll i=1;i<=n;i++)
d[i]=p[i]-p[i-1];
for(ll i=1;i<=n;i++)
if((now+=d[i])<spl)
{
tmp=spl-now;
if((cst+=tmp)>k) return false;
d[i]+=tmp,now+=tmp,d[min(n+1,i+2*r+1)]-=tmp;
}
return true;
} ll solve()
{
ll ret;
ll li,ri,mid;
li=0,ri=INF;
while(li<ri-1)
{
mid=((li+ri)>>1);
if(check(mid)) li=mid;
else ri=mid;
}
return ret=li;
} int main()
{
ll li,ri;
scanf("%I64d%I64d%I64d",&n,&r,&k);
for(ll i=1;i<=n;i++)
scanf("%I64d",&s[i]);
memset(pre,0,sizeof(pre));
memset(p,0,sizeof(p));
for(ll i=1;i<=n;i++)
pre[i]=pre[i-1]+s[i];
for(ll i=1;i<=n;i++)
{
li=i-r,ri=i+r;
if(li<1) li=1;
if(ri>n) ri=n;
p[i]=pre[ri]-pre[li-1];
}
printf("%I64d\n",solve());
return 0;
}

  

      

Educational Codeforces Round 40 (Rated for Div. 2) 954G G. Castle Defense的更多相关文章

  1. Educational Codeforces Round 40 (Rated for Div. 2) Solution

    从这里开始 小结 题目列表 Problem A Diagonal Walking Problem B String Typing Problem C Matrix Walk Problem D Fig ...

  2. Educational Codeforces Round 40 (Rated for Div. 2)

    A. Diagonal Walking time limit per test 1 second memory limit per test 256 megabytes input standard ...

  3. Educational Codeforces Round 60 (Rated for Div. 2) - C. Magic Ship

    Problem   Educational Codeforces Round 60 (Rated for Div. 2) - C. Magic Ship Time Limit: 2000 mSec P ...

  4. Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems(动态规划+矩阵快速幂)

    Problem   Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems Time Limit: 3000 mSec P ...

  5. Educational Codeforces Round 43 (Rated for Div. 2)

    Educational Codeforces Round 43 (Rated for Div. 2) https://codeforces.com/contest/976 A #include< ...

  6. Educational Codeforces Round 35 (Rated for Div. 2)

    Educational Codeforces Round 35 (Rated for Div. 2) https://codeforces.com/contest/911 A 模拟 #include& ...

  7. Codeforces Educational Codeforces Round 44 (Rated for Div. 2) F. Isomorphic Strings

    Codeforces Educational Codeforces Round 44 (Rated for Div. 2) F. Isomorphic Strings 题目连接: http://cod ...

  8. Codeforces Educational Codeforces Round 44 (Rated for Div. 2) E. Pencils and Boxes

    Codeforces Educational Codeforces Round 44 (Rated for Div. 2) E. Pencils and Boxes 题目连接: http://code ...

  9. Educational Codeforces Round 63 (Rated for Div. 2) 题解

    Educational Codeforces Round 63 (Rated for Div. 2)题解 题目链接 A. Reverse a Substring 给出一个字符串,现在可以对这个字符串进 ...

随机推荐

  1. 学习Elasticsearch原理笔记

    Elasticsearch是一个分布式可拓展的实时搜索和分析引擎 分布式实时文件存储,并将每一个字段都编入索引,使其可以被搜索 实时分析的分布式搜索引擎 可以拓展到上百台服务器,处理PB级别的结构化或 ...

  2. 脉脉的一道网红Java面试题

    题目如下: public class Test { public static void main(String[] args) { int a = 10; int b = 10; // 需要在met ...

  3. 【学习笔记】RMQ-Range Minimum/Maximum Query (区间最小/最大值)

    RMQ是一类询问区间最小/最大值的问题. 这类问题一般分成两类:静态区间(无修改),动态区间(带修改). 对于动态区间查询最大/最小,我们显然可以用线段树来解决…… 那么对于静态区间查询最大/最小的问 ...

  4. python-django-天天生鲜项目

    1 需求分析 github源码:https://www.github.com/wangyingchuang/dailyfresh 1.1  用户模块 1) 注册页 l  注册时校验用户名是否已被注册. ...

  5. WUSTOJ 1232: 矩阵乘法(C)

    1232: 矩阵乘法 Time Limit: 1 Sec Memory Limit: 128 MB 64bit IO Format: %lld Description 小明明正在学习线性代数,老师布置 ...

  6. 03 HttpServletRequest_HttpServletResponse

    HttpServletRequest:一次来自客户端的请求的相关信息 请求行 request.getMethod() 获取http请求方式 request.getRequestURI() 获取统一资源 ...

  7. IDEA如何本机调试springboot应用打的jar包

    背景: 我用命名行 执行 java -jar  ***.jar发现 springboot启动时抛出错误,因此想debug进去看看究竟为什么出错. 1  在命令行执行 java -jar -Xdebug ...

  8. kong命令(四)upstream

    介绍 upstream 就是一个虚拟的服务.可用于配置多个target目标服务时实现负载均衡的效果. 注意:service的host指的就是upstream的name. 同时upstream提供了一个 ...

  9. 用jq动态给导航菜单添加active

    点击后页面跳转到了新的链接,找到所有的li下的a标签,对其链接地址进行判断,如果和当前浏览器的地址一致,就认为是当前应该激活的菜单,添加active类,否则就取消. <ul class=&quo ...

  10. linux shell数值比较和字符串比较

    说明: 1. 把字符串当成整型进行比较,由于abcd等字符对不上0123当程序尝试去转成二进制时无法完成转换,所以用于数值比较的运算不能用于字符串比较:但是把整型当成字符串进行比较,0123这些数值完 ...