Educational Codeforces Round 40 (Rated for Div. 2) 954G G. Castle Defense
题
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的更多相关文章
- Educational Codeforces Round 40 (Rated for Div. 2) Solution
从这里开始 小结 题目列表 Problem A Diagonal Walking Problem B String Typing Problem C Matrix Walk Problem D Fig ...
- 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 ...
- 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 ...
- 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 ...
- Educational Codeforces Round 43 (Rated for Div. 2)
Educational Codeforces Round 43 (Rated for Div. 2) https://codeforces.com/contest/976 A #include< ...
- Educational Codeforces Round 35 (Rated for Div. 2)
Educational Codeforces Round 35 (Rated for Div. 2) https://codeforces.com/contest/911 A 模拟 #include& ...
- 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 ...
- 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 ...
- Educational Codeforces Round 63 (Rated for Div. 2) 题解
Educational Codeforces Round 63 (Rated for Div. 2)题解 题目链接 A. Reverse a Substring 给出一个字符串,现在可以对这个字符串进 ...
随机推荐
- WUSTOJ 1279: Wallace and His Pet(Java)
1279: Wallace and His Pet 题目 给出一句话(英文),单词总数不超过1000,每个单词不超过10个字符,一句话只有一个唯一的字符"."(句点).将这句话 ...
- chrome中显示DNS_PROBE_FINISHED_NO_INTERNET无法上网,但是IE可以上
以管理员方式运行cmd,执行如下命令 ipconfig /release ipconfig /all ipconfig /flushdns ipconfig /renew netsh int ip s ...
- pandas数据结构之基础运算笔记
import pandas as pd import numpy as np s = pd.Series([1,3,5,6,8],index=list('acefh')) s.index # 读取行索 ...
- DMA存储器到外设代码讲解
实验目的: bsp_dma_mtp.h #ifndef __BSP_DMA_MTP_H #define __BSP_DMA_MTP_H #include "stm32f10x.h" ...
- SAS学习笔记31 SAS随机分组方法及实现
随机分组方法包括: 简单随机化(simple randomization) 区组随机化(block randomization) 分层随机化(stratified randomization) 分层区 ...
- uboot 与 代码重定位
ref: https://blog.csdn.net/dhauwd/article/details/78566668 https://blog.csdn.net/yueqian_scut/articl ...
- (错误)启动ActiveMQ报错:Transport Connector could not be registered in JMX: java.io.IOException: Failed to bind to server socket: stomp://0.0.0.0:61613?
一.错误报告 很明显,端口被占用 二.解决方法 1. 在cmd中输入 netstat -ano 查看61613端口被占用情况,如果有其他进程使用,则使用 taskkill /f /pid 进程PID ...
- (二十二)SpringBoot之使用Druid连接池以及SQL监控和spring监控
一.引入maven依赖 <dependencies> <dependency> <groupId>org.springframework.boot</grou ...
- 一、eureka服务端自动配置
所有文章 https://www.cnblogs.com/lay2017/p/11908715.html 正文 @EnableEurekaServer开关 eureka是一个c/s架构的服务治理框架, ...
- VUE CLI3 less 全局变量引用
方法一 1.添加依赖 style-resources-loader 2.vue.config.js中添加 module.exports = { pluginOptions: { 'style-reso ...