【链接】 我是链接,点我呀:)

【题意】

横坐标1..2^n对应着2^n个复仇者的基地,上面有k个复仇者(位置依次给出)。
你是灭霸你要用以下方法消灭这k个复仇者:
一开始你获取整个区间[1..2^n]
假设你当前获取的区间为[l,r]
mid = (l+r)/2
那么你每次有两种选择
1.将整个区间全都毁掉,如果这个区间里没有复仇者,那么花费为A,否则花费为B*复仇者个数*区间长度
2.将区间分为[l,mid]和[mid+1,r]分开毁掉(即分别获取[l,mid]和[mid+1,r]这两个区间,然后累加递归处理后的花费)
问你最小花费是多少

【题解】

如果2^n比较大的话,k个复仇者其实所占据的区间会非常少
也就是说有很多区间都是空着的。。
而空着的区间其实就没有必要用第二种选择了,因为显然直接返回A是最好的
所以我们只需要模拟题目说的方法就好。
只需要用两个二分查找获取当前区间里面有多少个复仇者就好
如果没有复仇者了就直接返回A,否则模拟题目描述就ok
(同一个基地可能有多个复仇者).

【代码】

import java.io.*;
import java.util.*; public class Main { final static int N = (int)1e5;
static InputReader in;
static PrintWriter out;
static int n,k,A,B,a[],r; static int leftmorethan(int x) {
int l = 1,r = k,temp=-1;
while (l<=r) {
int mid = (l+r)>>1;
if (x<=a[mid]) {
temp = mid;
r = mid - 1;
}else {
l = mid + 1;
}
}
return temp;
} static int rightlessthan(int x) {
int l = 1,r = k,temp = -1;
while (l<=r) {
int mid = (l+r)>>1;
if (x>=a[mid]) {
temp = mid;
l = mid + 1;
}else {
r = mid-1;
}
}
return temp;
} static long dfs(int l,int r) {
int L = leftmorethan(l);
int R = rightlessthan(r);
boolean ok = true;
if (L==-1 || R==-1) ok = false;
if (L>R) ok = false;
if (!ok) return 1l*A; if (l==r) return 1l*B*(R-L+1); int mid = (l+r)>>1;
long ans;
//select all
ans = 1l*B*(R-L+1)*(r-l+1); //divede
ans = Math.min(ans, dfs(l,mid)+dfs(mid+1,r));
return ans;
} public static void main(String[] args) throws IOException{
in = new InputReader();
out = new PrintWriter(System.out); //code start from here
a = new int[N+10];
n = in.nextInt();k = in.nextInt();A = in.nextInt();B = in.nextInt();
for (int i = 1; i <= k;i++) a[i] = in.nextInt();
r = 1;
for (int i = 1;i <= n;i++) r = r*2;
Arrays.sort(a, 1,k+1);
out.print(dfs(1,r));
out.close();
} static class InputReader{
public BufferedReader br;
public StringTokenizer tokenizer; public InputReader() {
br = new BufferedReader(new InputStreamReader(System.in));
tokenizer = null;
} public String next(){
while (tokenizer==null || !tokenizer.hasMoreTokens()) {
try {
tokenizer = new StringTokenizer(br.readLine());
}catch(IOException e) {
throw new RuntimeException(e);
}
}
return tokenizer.nextToken();
} public int nextInt() {
return Integer.parseInt(next());
}
}
}

【CodeCraft-19 and Codeforces Round #537 (Div. 2) C】Creative Snap的更多相关文章

  1. 【Codeforces Round #420 (Div. 2) C】Okabe and Boxes

    [题目链接]:http://codeforces.com/contest/821/problem/C [题意] 给你2*n个操作; 包括把1..n中的某一个数压入栈顶,以及把栈顶元素弹出; 保证压入和 ...

  2. 【Codeforces Round #420 (Div. 2) B】Okabe and Banana Trees

    [题目链接]:http://codeforces.com/contest/821/problem/B [题意] 当(x,y)这个坐标中,x和y都为整数的时候; 这个坐标上会有x+y根香蕉; 然后给你一 ...

  3. 【Codeforces Round #420 (Div. 2) A】Okabe and Future Gadget Laboratory

    [题目链接]:http://codeforces.com/contest/821/problem/A [题意] 给你一个n*n的数组; 然后问你,是不是每个位置(x,y); 都能找到一个同一行的元素q ...

  4. 【Codeforces Round #423 (Div. 2) C】String Reconstruction

    [Link]:http://codeforces.com/contest/828/problem/C [Description] 让你猜一个字符串原来是什么; 你知道这个字符串的n个子串; 且知道第i ...

  5. 【Codeforces Round #423 (Div. 2) B】Black Square

    [Link]:http://codeforces.com/contest/828/problem/B [Description] 给你一个n*m的格子; 里面包含B和W两种颜色的格子; 让你在这个格子 ...

  6. 【Codeforces Round #423 (Div. 2) A】Restaurant Tables

    [Link]:http://codeforces.com/contest/828/problem/A [Description] 有n个组按照时间顺序来餐馆; 每个组由一个人或两个人组成; 每当有一个 ...

  7. 【Codeforces Round #422 (Div. 2) D】My pretty girl Noora

    [题目链接]:http://codeforces.com/contest/822/problem/D [题意] 有n个人参加选美比赛; 要求把这n个人分成若干个相同大小的组; 每个组内的人数是相同的; ...

  8. 【Codeforces Round #422 (Div. 2) C】Hacker, pack your bags!(二分写法)

    [题目链接]:http://codeforces.com/contest/822/problem/C [题意] 有n个旅行计划, 每个旅行计划以开始日期li,结束日期ri,以及花费金钱costi描述; ...

  9. 【Codeforces Round #422 (Div. 2) B】Crossword solving

    [题目链接]:http://codeforces.com/contest/822/problem/B [题意] 让你用s去匹配t,问你最少需要修改s中的多少个字符; 才能在t中匹配到s; [题解] O ...

随机推荐

  1. YTU 2795: 编程题AB-侦察员的密码

    2795: 编程题AB-侦察员的密码 时间限制: 1 Sec  内存限制: 128 MB 提交: 155  解决: 43 题目描述 侦察员小甲在被捕前在墙上写了两行文字(ASCII字符),其中包含了他 ...

  2. JSP-Runoob:JSP XML 处理数据

    ylbtech-JSP-Runoob:JSP XML 处理数据 1.返回顶部 1. JSP XML 数据处理 当通过HTTP发送XML数据时,就有必要使用JSP来处理传入和流出的XML文档了,比如RS ...

  3. bzoj1098

    并查集+dfs 先开始想和不相连的点用并查集连起来,最后看每个连通块有多少个点就行了,但是这样是O(n*n)的,然而我并没有想到补图 其实就是求补图有多少连通块,因为补图中两个点有边,那么这两个点必须 ...

  4. Hadoop 的使用

    hadoop:hadoop启动:./sbin/start-dfs.shhadoop关闭:./sbin/stop-dfs.shbin文件用于在HDFS创建数据HDFS 中创建用户目录:./bin/hdf ...

  5. C++ 指针 部分

    基本知识:在内存中的每个字节都有一个编号,这就是“地址”,相当于旅馆中的房间号.记住,内存单元的地址和内存单元的内容是两个不同的概念. 程序在编译之后,就已经将变量名转换成变量地址,对变量值的存取都是 ...

  6. 客户端JavaScript基础 网页上的输入输出

    创建: 2017/10/06 完成: 2017/10/07   更新: 2017/10/15 增加了通过事件监听器登陆事件的方法的链接   # TODO: 补充 基于Canvas的图象 客户端Java ...

  7. JS判断数组是否包含某元素

    我在学习ES6数组拓展时,发现了新增了不少了有趣的数组方法,突然想好工作中判断数组是否包含某个元素是非常常见的操作,那么这篇文章顺便做个整理. 1.for循环结合break 可能很多人第一会想到for ...

  8. js 中的定时器

    在js中的定时器分两种:1.setTimeout() 2.setInterval() 1.setTimeOut() 只在指定时间后执行一次 /定时器 异步运行 function hello(){ al ...

  9. photoshop制作古风画

    效果图: 素材结构: 前期准备: 素材准备,我的素材包括:印章.花束.二次元妹纸,背景图片. 软件准备,用的软件是 photoshop CS6. 把二次元妹纸拖入photoshop,把她抠出来,Ctr ...

  10. JS——预解析

    1.排查语法错误 <script> console.log(1; </script> 2.变量提升和函数整体提升 <script> console.log(n1); ...