hdu------(4302)Holedox Eating(树状数组+二分)
Holedox Eating
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3362 Accepted Submission(s): 1145
Problem Description
Holedox is a small animal which can be considered as one point. It lives in a straight pipe whose length is L. Holedox can only move along the pipe. Cakes may appear anywhere in the pipe, from time to time. When Holedox wants to eat cakes, it always goes to the nearest one and eats it. If there are many pieces of cake in different directions Holedox can choose, Holedox will choose one in the direction which is the direction of its last movement. If there are no cakes present, Holedox just stays where it is.
Input
The input consists of several test cases. The first line of the input contains a single integer T (1 <= T <= 10), the number of test cases, followed by the input data for each test case.The first line of each case contains two integers L,n(1<=L,n<=100000), representing the length of the pipe, and the number of events. The next n lines, each line describes an event. 0 x(0<=x<=L, x is a integer) represents a piece of cake appears in the x position; 1 represent Holedox wants to eat a cake. In each case, Holedox always starts off at the position 0.
Output
Output the total distance Holedox will move. Holedox don’t need to return to the position 0.
Sample Input
3 10 8 0 1 0 5 1 0 2 0 0 1 1 1 10 7 0 1 0 5 1 0 2 0 0 1 1 10 8 0 1 0 1 0 5 1 0 2 0 0 1 1
Sample Output
Case 1: 9 Case 2: 4 Case 3: 2
Author
BUPT
Source
2012 Multi-University Training Contest 1
代码:
1 #include<cstring>
2 #include<cstdio>
3 #define maxn 100080
4 #define inf 0x3f3f3f3f
5 int next[maxn];
6 int len,n;
7 int lowbit(int x){
8 return x&(-x);
9 }
10 void update(int st,int val){
11 while(st<=len+1){
12 next[st]+=val;
13 st+=lowbit(st);
14 }
15 }
16 int query(int st){
17 int ans=0;
18 while(st>0){
19 ans+=next[st];
20 st-=lowbit(st);
21 }
22 return ans;
23 }
24
25 int main(){
26 int test;
27 int jud,tem,pos,ans;
28 //freopen("test.in","r",stdin);
29 //freopen("test1.in","w",stdout);s
30 scanf("%d",&test);
31 for(int i=1;i<=test;i++ ){
32 scanf("%d%d",&len,&n);
33 memset(next,0,sizeof(next));
34 bool flag=true; //开始从0开始所以必须去右边
35 pos=1; //初始牛的位置在1初开始数
36 ans=0;
37 while(n--)
38 {
39 scanf("%d",&jud);
40 if(!jud){
41 scanf("%d",&tem);
42 update(tem+1,1);
43 }
44 else{ //如果jud=1说明那条牛要吃蛋糕了
45 //但是不知道那边有蛋糕...
46 int left=pos, right=len+1;
47 int mid;
48 int rr=inf; //记录最近的右边蛋糕位置
49 int ll=-inf; //记录最近的左边蛋糕位置
50 bool iseat_r=false;
51 int st_num=query(pos-1); //开始位置以下的位置蛋糕的数目
52 while(left<=right){
53 mid=left+((right-left)>>1);
54 if(query(mid)>st_num) {
55 right=mid-1;
56 rr=mid;
57 iseat_r=true; //表示吃到了蛋糕
58 }
59 else
60 left=mid+1;
61 }
62 left=1;
63 right=pos;
64 st_num=query(pos);
65 bool iseat_l=false;
66 while(left<=right){
67 mid=left+((right-left)>>1);
68 if(st_num-query(mid-1)>0){
69 left=mid+1;
70 ll=mid;
71 iseat_l=true;
72 }
73 else right=mid-1;
74 }
75 if(iseat_l||iseat_r) //又一边有蛋糕吃就可以了,否则什么都不做
76 {
77 int len1=pos-ll;
78 int len2=rr-pos;
79 if(len1<len2){
80 pos=ll;
81 ans+=len1;
82 flag=false;
83 }
84 else { //如果相等,真的可以随便吃吗,以继续保持原来的方向优先
85 if(len1>len2){
86 pos=rr;
87 ans+=len2;
88 flag=true;
89 }
90 else if(flag){ pos=rr;
91 ans+=len2;
92 }
93 else{
94 pos=ll;
95 ans+=len1;
96 }
97 }
98 update(pos,-1); //吃掉了一个蛋糕
99 }
100 }
101 }
102 printf("Case %d: %dn",i,ans);
103 }
104 return 0;
105 }
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 疫情这么严重,还不待家里学Numpy和Pandas?
- CSP-201812-2-小明放学-Java
- Mac怎么设置docker国内镜像源来加速下载?
- 适合数据分析面试笔试入门的编程题
- 女同事问狗哥什么是线程池的阻塞队列?
- BAT某厂数据分析终面面经
- 通过常见的业务掌握SQL高级功能
- 滴滴出行数据分析师面试经验
- 如何制作推论统计分析报告
- 全局唯一 ID 服务的分布式ID生成系统
- SpringBoot 国际化实现跨地区的多语言切换
- MySQL 死锁产生原因和解决方法
- 手把手教你ShardingSphere和Mybatis拦截器实现特殊字段动态切换加密
- Swagger3.0官方starter诞生,可以扔掉那些野生starter了
- Prometheus 入门教程(一):Prometheus 快速入门