DLUTOJ -1234: Zeratul与塔防游戏(二分+线段树+贪心)

本文介绍了一种利用树状数组和二分法解决区间更新问题的算法。通过维护一个长度为m的树状数组,先进行n次区间修改,再使用二分法寻找最优解。算法采用了类似Manacher算法的贪心策略,通过更新当前最右端点来实现区间优化,是一道典型的最大化最小值问题。

题解

维护长为m的树状数组,先将n次区间修改维护到数组上。

二分答案为q,每次判断需要升级的次数,是否小于k。

我们从左到右遍历塔i,类似manacher/扩展kmp算法一样更新一个当前最右端点nowr,

其实是贪心的思想,代表当前存在一个防御塔能更新到nowr,

对于不需要更新的点i,跳过即可;

需要更新点i的时候,我们就对[i,nowr]区间进行区间更新,显然是最优的。

最大化最小值,二分经典题型,就是check(mid)需要动一动脑筋。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
const int maxn=1e4+10;
ll bit0[maxn],bit1[maxn],tmp0[maxn],tmp1[maxn],n,m,k;
int range[maxn],nowr;
int lowbit(int x)
{
  return x&(-x);
}
void add(ll *b,int i,ll x)
{
    while(i<=m)
    {
     b[i]+=x;
     i+=lowbit(i);
    }
}
ll sum(ll *b,int i)
{
   ll ans=0;
   while(i>0)
   {
    ans+=b[i];
    i-=lowbit(i);
   }
   return ans;
}
ll ask(ll *bit1,ll *bit0,int l,int r)
{
   ll res=0;
   res+=sum(bit0,r)+sum(bit1,r)*r;
   res-=sum(bit0,l-1)+sum(bit1,l-1)*(l-1);
   return res;
}
void jia(ll *bit1,ll *bit0,int l,int r,ll a)
{
     add(bit0,l,-a*(l-1));
     add(bit1,l,a);
     add(bit0,r+1,a*r);
     add(bit1,r+1,-a);
}
bool check(ll mid)
{
    ll num=0;
    nowr=0;
    for(int i=1;i<=m;++i)
    {
        tmp0[i]=bit0[i];
        tmp1[i]=bit1[i];
    }
    for(int i=1;i<=m;++i)
    {
        ll q=ask(tmp1,tmp0,i,i);
        nowr=max(nowr,range[i]);//当前能到的最右 
        if(q>=mid)continue;
        if(nowr<i)return 0;
        num+=mid-q;
	    jia(tmp1,tmp0,i,nowr,mid-q);
        if(num>k)return 0;
    }
    return 1;
}
ll erfen(ll l,ll r)
{
    while(r-l>1)
    {
        ll mid=(l+r)/2;
        if(check(mid))l=mid;
        else r=mid;
    }
    return l;
}
int main()
{
  scanf("%lld%lld%lld",&n,&m,&k);
  for(int i=0;i<n;++i)
  {
     int l,r,a;
     scanf("%d%d%d",&l,&r,&a);
     jia(bit1,bit0,l,r,a);
     range[l]=max(range[l],r);
  }
  printf("%lld\n",erfen(0,1e18));
  return 0;
}

 

please enter the Linux version index(defalt 1): 2 -bash: echo: write error: No space left on device -bash: echo: write error: No space left on device -bash: echo: write error: No space left on device -bash: echo: write error: No space left on device -bash: echo: write error: No space left on device -bash: echo: write error: No space left on device -bash: echo: write error: No space left on device -bash: echo: write error: No space left on device -bash: echo: write error: No space left on device -bash: echo: write error: No space left on device -bash: echo: write error: No space left on device -bash: echo: write error: No space left on device -bash: echo: write error: No space left on device -bash: echo: write error: No space left on device -bash: echo: write error: No space left on device -bash: echo: write error: No space left on device -bash: echo: write error: No space left on device -bash: echo: write error: No space left on device -bash: echo: write error: No space left on device -bash: echo: write error: No space left on device -bash: echo: write error: No space left on device -bash: echo: write error: No space left on device -bash: echo: write error: No space left on device -bash: echo: write error: No space left on device -bash: echo: write error: No space left on device -bash: echo: write error: No space left on device -bash: echo: write error: No space left on device -bash: echo: write error: No space left on device -bash: echo: write error: No space left on device -bash: echo: write error: No space left on device -bash: echo: write error: No space left on device -bash: echo: write error: No space left on device -bash: echo: write error: No space left on device -bash: echo: write error: No space left on device -bash: echo: write error: No space left on device -bash: echo: write error: No space left on device -bash: echo: write error: No space left on device =============================ZERATUL=============================== ============================================================
最新发布
11-22
正常编译log Configuring for isvp_t31_sfcnor_ddr128M - Board: isvp_t31, Options: SPL_SFC_SUPPORT,ENV_IS_IN_SPI_FLASH,SPL_SFC_NOR,JZ_MMC_MSC0,DDR2_128M make make[2]: Entering directory '/home/lixueming/00lixueming/zeratul_1.2/os/uboot/u-boot' Generating include/autoconf.mk Generating include/autoconf.mk.dep mips-linux-gnu-gcc -DDO_DEPS_ONLY \ -g -Os -ffunction-sections -fdata-sections -D__KERNEL__ -DCONFIG_SYS_TEXT_BASE=0x80100000 -DCONFIG_SPL_TEXT_BASE=0x80001000 -DCONFIG_SPL_PAD_TO=36864 -I/home/lixueming/00lixueming/zeratul_1.2/os/uboot/u-boot/include -fno-builtin -ffreestanding -nostdinc -isystem /home/lixueming/00lixueming/cameos_BS_1.2/toolchain/zeratul_sdk/mips-gcc472-glibc216-64bit/bin/../lib/gcc/mips-linux-gnu/4.7.2/include -pipe -msoft-float -std=gnu89 -DCONFIG_MIPS -D__MIPS__ -G 0 -EL -msoft-float -fpic -mabicalls -march=mips32 -mabi=32 -DCONFIG_32BIT -mno-branch-likely -Wall -Wstrict-prototypes -fno-stack-protector -Wno-format-nonliteral -Wno-format-security -fstack-usage -DCONFIG_TP_SERIAL_FORBIDDEN \ -o lib/asm-offsets.s lib/asm-offsets.c -c -S In file included from /home/lixueming/00lixueming/zeratul_1.2/os/uboot/u-boot/include/config.h:15:0, from /home/lixueming/00lixueming/zeratul_1.2/os/uboot/u-boot/include/common.h:37, from lib/asm-offsets.c:18: 出问题的编译log ls: 无法访问'/home/wuhsulei/share_smbd/Cworkspace/2D230/zeratul/os/uboot/u-boot/tools/charge_logo/*.jpg': 没有那个文件或目录 make[2]: Leaving directory '/home/wuhsulei/share_smbd/Cworkspace/2D230/zeratul/os/uboot/u-boot/tools/ingenic-tools' make[1]: Leaving directory '/home/wuhsulei/share_smbd/Cworkspace/2D230/zeratul/os/uboot/u-boot' make[1]: Entering directory '/home/wuhsulei/share_smbd/Cworkspace/2D230/zeratul/os/uboot/u-boot' Configuring for isvp_t31_sfcnor_ddr128M - Board: isvp_t31, Options: SPL_SFC_SUPPORT,ENV_IS_IN_SPI_FLASH,SPL_SFC_NOR,JZ_MMC_MSC0,DDR2_128M make make[2]: Entering directory '/home/wuhsulei/share_smbd/Cworkspace/2D230/zeratul/os/uboot/u-boot' make[2]: mips-linux-gnu-gcc:命令未找到 /bin/sh: mips-linux-gnu-gcc: 未找到命令 dirname: 缺少操作数 Try 'dirname --help' for more information. Generating include/autoconf.mk /bin/sh: 行 3: mips-linux-gnu-gcc: 未找到命令 Generating include/autoconf.mk.dep /bin/sh: 行 3: mips-linux-gnu-gcc: 未找到命令 make[2]: mips-linux-gnu-gcc:命令未找到 /bin/sh: mips-linux-gnu-gcc: 未找到命令 dirname: 缺少操作数 Try 'dirname --help' for more information. /bin/sh: mips-linux-gnu-gcc: 未找到命令 mips-linux-gnu-gcc -DDO_DEPS_ONLY \ -g -Os -ffunction-sections -fdata-sections -D__KERNEL__ -I/home/wuhsulei/share_smbd/Cworkspace/2D230/zeratul/os/uboot/u-boot/include -fno-builtin -ffreestanding -nostdinc -isystem -pipe -msoft-float -std=gnu89 -DCONFIG_MIPS -D__MIPS__ -G 0 -EB -msoft-float -fpic -mabicalls -march=mips32 -mabi=32 -DCONFIG_32BIT -mno-branch-likely -Wall -Wstrict-prototypes -DCONFIG_TP_SERIAL_FORBIDDEN \ -o lib/asm-offsets.s lib/asm-offsets.c -c -S make[2]: mips-linux-gnu-gcc:命令未找到 Makefile:779: recipe for target 'lib/asm-offsets.s' failed make[2]: *** [lib/asm-offsets.s] Error 127 make[2]: Leaving directory '/home/wuhsulei/share_smbd/Cworkspace/2D230/zeratul/os/uboot/u-boot' .boards.depend:534: recipe for target 'isvp_t31_sfcnor_ddr128M' failed make[1]: *** [isvp_t31_sfcnor_ddr128M] Error 2 请问问题可能出在哪?
11-18
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小衣同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值