hdu 4302 Holedox Eating(优先队列/线段树)
题意:一只蚂蚁位与原点,在x轴正半轴上会不时地出现一些蛋糕,蚂蚁每次想吃蛋糕时选取最近的去吃,如果前后距离相同,则吃眼前的那一块(即方向为蚂蚁的正前),求最后蚂蚁行进距离。
思路:优先队列q存储蚂蚁前面的蛋糕(从小到大排),q2存储后面的(从大到小排),这样两队队首分别是前后离他最近的。
优先队列:
#include<iostream>
#include<stdio.h>
#include<queue>
using namespace std; struct cmp1{
bool operator ()(int &a,int &b){
return a>b;//最小值优先
}
}; priority_queue<int,vector<int>,cmp1>q;//从小到大
priority_queue<int>q2;//从大到小
int main(){
int T,L,n,A,B,i;
int x,ans,t;
int temp1,temp2;
scanf("%d",&T);
for(i=;i<=T;++i){
scanf("%d%d",&L,&n);
while(!q.empty())q.pop();
while(!q2.empty())q2.pop();
x=;//初始位置
ans=;
t=;//方向
while(n--){
scanf("%d",&A);
if(A==){
scanf("%d",&B);
if(B>=x)q.push(B);
else q2.push(B);
}
else{
if(!q.empty()&&!q2.empty()){
temp1=q.top();
temp2=q2.top();
if(temp1-x<x-temp2){
t=;
ans+=temp1-x;
x=temp1;
q.pop();
}
else if(temp1-x>x-temp2){
t=-;
ans+=x-temp2;
x=temp2;
q2.pop();
}
else if(t==){
ans+=temp1-x;
x=temp1;
q.pop();
}
else{
ans+=x-temp2;
x=temp2;
q2.pop();
}
}
else if(!q.empty()){
temp1=q.top();
t=;
ans+=temp1-x;
x=temp1;
q.pop();
}
else if(!q2.empty()){
temp2=q2.top();
t=-;
ans+=x-temp2;
x=temp2;
q2.pop();
}
}
}
printf("Case %d: %d\n",i,ans);
}
return ;
}
线段树:
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std; const int MAXN=;
const int INF=0x3f3f3f3f; struct Node
{
int l,r;
int t;
int Min,Max;
}segTree[MAXN*]; void Build(int i,int l,int r)
{
segTree[i].l=l;
segTree[i].r=r;
segTree[i].t=;
if(l==r)
{
segTree[i].Min=INF;
segTree[i].Max=-;
return;
}
int mid=(l+r)>>;
Build(i<<,l,mid);
Build((i<<)|,mid+,r);
segTree[i].Max=max(segTree[i<<].Max,segTree[(i<<)|].Max);
segTree[i].Min=min(segTree[i<<].Min,segTree[(i<<)|].Min);
}
void add(int i,int t)
{
if(segTree[i].l==t&&segTree[i].r==t)
{
segTree[i].Max=segTree[i].Min=t;
segTree[i].t++;
return;
}
int mid=(segTree[i].l+segTree[i].r)>>;
if(t<=mid)add(i<<,t);
else add((i<<)|,t);
segTree[i].Max=max(segTree[i<<].Max,segTree[(i<<)|].Max);
segTree[i].Min=min(segTree[i<<].Min,segTree[(i<<)|].Min);
}
void del(int i,int t)
{
if(segTree[i].l==t&&segTree[i].r==t)
{
segTree[i].t--;
if(segTree[i].t==)
{
segTree[i].Min=INF;
segTree[i].Max=-;
} return;
}
int mid=(segTree[i].l+segTree[i].r)>>;
if(t<=mid)del(i<<,t);
else del((i<<)|,t);
segTree[i].Max=max(segTree[i<<].Max,segTree[(i<<)|].Max);
segTree[i].Min=min(segTree[i<<].Min,segTree[(i<<)|].Min);
}
int query1(int i,int l,int r)//查询最大值
{
if(segTree[i].l==l&&segTree[i].r==r)
{
return segTree[i].Max;
}
int mid=(segTree[i].l+segTree[i].r)>>;
if(r<=mid)return query1(i<<,l,r);
else if(l>mid) return query1((i<<)|,l,r);
else return max(query1(i<<,l,mid),query1((i<<)|,mid+,r));
} int query2(int i,int l,int r)//查询最大值
{
if(segTree[i].l==l&&segTree[i].r==r)
{
return segTree[i].Min;
}
int mid=(segTree[i].l+segTree[i].r)>>;
if(r<=mid)return query2(i<<,l,r);
else if(l>mid) return query2((i<<)|,l,r);
else return min(query2(i<<,l,mid),query2((i<<)|,mid+,r));
} int main()
{
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
int x;
int T;
int n;
int m;
int flag;
scanf("%d",&T);
int a,b;
int iCase=;
while(T--)
{
iCase++;
scanf("%d%d",&n,&m); Build(,,n);
int flag=;//往前的
x=;
int ans=; while(m--)
{
scanf("%d",&a);
if(a==)
{
scanf("%d",&b);
add(,b);
}
else
{
int t1=query1(,,x);
int t2=query2(,x,n);
if(t1==-&&t2!=INF)
{
ans+=t2-x;
x=t2;
del(,t2);
flag=;
}
else if(t1!=-&&t2==INF)
{
ans+=x-t1;
x=t1;
del(,t1);
flag=-;
}
else if(t1!=-&&t2!=INF)
{
if(x-t1>t2-x)
{
ans+=t2-x;
x=t2;
del(,t2);
flag=;
}
else if(x-t1<t2-x)
{
ans+=x-t1;
x=t1;
del(,t1);
flag=-;
}
else
{
if(flag==)
{
ans+=t2-x;
x=t2;
del(,t2);
flag=;
}
else
{
ans+=x-t1;
x=t1;
del(,t1);
flag=-;
}
}
} } }
printf("Case %d: %d\n",iCase,ans); }
return ;
}
hdu 4302 Holedox Eating(优先队列/线段树)的更多相关文章
- HDU 4302 Holedox Eating (线段树模拟)
题意:一个老鼠在一条长度为L的直线上跑,吃蛋糕,老鼠只能沿直线移动.开始时没有蛋糕,老鼠的初始位置是0. 有两个操作,0 x 代表在位置x添加一个蛋糕: 1 代表老鼠想吃蛋糕.老鼠每次都会选择离自己最 ...
- HDU 4302 Holedox Eating (STL + 模拟)
Holedox Eating Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- hdu 4302 Holedox Eating
http://acm.hdu.edu.cn/showproblem.php?pid=4302 #include <cstdio> #include <cstring> #inc ...
- HDU 4302 Holedox Eating(multiset)
http://acm.hdu.edu.cn/showproblem.php?pid=4302 题意: 在一条直线上,会有多条命令,如果是0,那么就会在x位置处出现一个蛋糕,如果是1,某人就会找到最近的 ...
- HDU 3016 Man Down (线段树+dp)
HDU 3016 Man Down (线段树+dp) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...
- HDU.5692 Snacks ( DFS序 线段树维护最大值 )
HDU.5692 Snacks ( DFS序 线段树维护最大值 ) 题意分析 给出一颗树,节点标号为0-n,每个节点有一定权值,并且规定0号为根节点.有两种操作:操作一为询问,给出一个节点x,求从0号 ...
- HDU.1556 Color the ball (线段树 区间更新 单点查询)
HDU.1556 Color the ball (线段树 区间更新 单点查询) 题意分析 注意一下pushdown 和 pushup 模板类的题还真不能自己套啊,手写一遍才行 代码总览 #includ ...
- HDU.1166 敌兵布阵 (线段树 单点更新 区间查询)
HDU.1166 敌兵布阵 (线段树 单点更新 区间查询) 题意分析 加深理解,重写一遍 代码总览 #include <bits/stdc++.h> #define nmax 100000 ...
- HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对)
HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对) 题意分析 给出n个数的序列,a1,a2,a3--an,ai∈[0,n-1],求环序列中逆序对 ...
随机推荐
- 玩转css样式选择器----利用padding实现元素等比缩放
- Codeforces Round #268 (Div. 2) D. Two Sets [stl - set + 暴力]
8161957 2014-10-10 06:12:37 njczy2010 D - Two Sets GNU C++ A ...
- Yii 之Session使用
public function actionIndex(){ $session = \YII::$app->session; //判断session是否开启 if(!$session->i ...
- Laravel 视图中的url
<a href="{{ url('url') }}">url</a> <a href="{{ action('StudentControll ...
- 在ScrollView添加一个ListView造成的滚动问题的简单解决办法()
正常来说,在ScrollView添加一个ListView后在真机上只会显示ListView的一行多一点,我也不理解为什么会这样,后来我把ListView的layout_height改成400dip,而 ...
- ubuntu 命令行模式和图形界面切换
1.按ALT+CTRL+F1切换到字符界面(Linux实体机) 如果是VMware虚拟机安装的Linux系统,则切换到字符界面的时候需要以下操作 按下ALT+CTRL+SPACE(空格),ALT+CT ...
- mongDB的常用操作总结
目录 常用查询: 查询一条数据 查询子元素集合:image.id gte: 大于等于,lte小于等于... 查询字段不存在的数据not 查询数量: 常用更新 更新第一条数据的一个字段: 更新一条数据的 ...
- (type interface {}) to type string
go 语言开发中,经常会在函数中碰到使用 insterface{} 作为接收任意参数,但是我们接收的数据经常是需要做类型转换,由于是初学者,因此,初次转换我是直接就 func New(paramete ...
- flask如何使模板返回大文件,又不消耗大量内存
当我们要往客户端发送大量的数据,比如一个大文件时,将它保存在内存中再一次性发到客户端开销很大.比较好的方式是使用流,本篇就要介绍怎么在Flask中通过流的方式来将响应内容发送给客户端.此外,我们还会演 ...
- 斯坦福《机器学习》Lesson6感想———1、函数间隔和几何间隔
这一课主要是从怎样推断一个机器学习分类算法里拟合的參数是最佳參数引出函数间隔和几何间隔的定义. 1.函数间隔 如果假想函数 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkb ...