博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[CF1111C]Creative Snap
阅读量:6257 次
发布时间:2019-06-22

本文共 997 字,大约阅读时间需要 3 分钟。

题目大意:有一个长度为$2^n(n\leqslant30)$的格子,有$k(k\leqslant10^5)$个球,分布在这些格子中,有两种消灭格子的方法:

1. 若一段格子长度大于等于$2$,可以对半分开

2. 消灭一段格子,若其中有球,代价为$B\times x\times l$,$l$为格子长度,$x$为球个数;若没有球,代价为$A$

求最小代价

题解:动态开点线段树,直接模拟这个$DP$过程即可。可以把$0$号点代价设为$A$,表示没有球。

卡点:

 

C++ Code:

#include 
#include
#define maxn 100010long long A, B;namespace SgT {#define N (maxn * 18) long long V[N]; int lc[N], rc[N], idx, S[N]; void insert(int &rt, int l, int r, int pos) { if (!rt) rt = ++idx; ++S[rt]; if (l == r) { V[rt] = B * S[rt]; return ; } const int mid = l + r >> 1; if (pos <= mid) insert(lc[rt], l, mid, pos); else insert(rc[rt], mid + 1, r, pos); V[rt] = std::min(B * S[rt] * (r - l + 1), V[lc[rt]] + V[rc[rt]]); }}int n, k, rt;int main() { scanf("%d%d%lld%lld", &n, &k, &A, &B); n = 1 << n; SgT::V[0] = A; for (int i = 0, x; i < k; ++i) { scanf("%d", &x); SgT::insert(rt, 1, n, x); } printf("%lld\n", SgT::V[rt]); return 0;}

  

转载于:https://www.cnblogs.com/Memory-of-winter/p/10357324.html

你可能感兴趣的文章
ubuntu配置bridge网桥
查看>>
批量修改sharepoint 2013站点里区域设置
查看>>
在尝试重新安装一个服务时遇到这样的错误:指定服务已标记为删除
查看>>
我的Android开发相关文章
查看>>
20141029
查看>>
Windows Server 2012如果打开网页慢下载快的话
查看>>
【反传销】春节一个短暂误入传销和脱身的真实故事以及对技术的思考(二)回家之路...
查看>>
166. Fraction to Recurring Decimal
查看>>
(转)Java线程:新特征-条件变量
查看>>
建立ORACLE10G DATA GUARD---&gt;Physical Standby
查看>>
Python pyenv
查看>>
使用LotusScript操作Lotus Notes RTF域
查看>>
IPv4头部结构具体解释
查看>>
帕雷托最优(Pareto optimality)、帕雷托效率(Pareto efficiency)
查看>>
PHP 面向对象
查看>>
getResourceAsStream和getResource的用法及Demo实例
查看>>
[C#] string 与 String,大 S 与小 S 之间没有什么不可言说的秘密
查看>>
javascript 自定义错误处理
查看>>
POJ 3278 Catch That Cow(BFS,板子题)
查看>>
Ubuntu下U盘只读文件系统,图标上锁,提示无法修改
查看>>