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],求环序列中逆序对 ...
随机推荐
- 【网摘】sql 语句修改字段名称以及字段类型
网上摘抄,备份使用: 修改字段名: 下例将表 customers 中的列 contact title 重命名为 title. EXEC sp_rename 'customers.[contact ti ...
- [其他] 关于C语言中使用未声明函数的问题
在c语言中,碰到一个.c文件,无.h头文件,在另一.c文件调用函数时,并没有进行声明extern, 此时编译器不会报错,会默认去查找同名的函数,这样会存在一些问题,查了些资料,稍微总结了下: 总结: ...
- 标准C程序设计七---31
Linux应用 编程深入 语言编程 标准C程序设计七---经典C11程序设计 以下内容为阅读: <标准C程序设计>(第7版) 作者 ...
- SGU 106 在区间范围内的线性方程解个数
题意:求解方程ax+by+c=0,在区间x1->x2和y1->y2的解的个数. 看似简单,真心a的不容易啊! 开始跪于第8组数据,原因是没用long long !后来改了,跪于12组,超时 ...
- Flutter学习(一)——搭建开发环境(Windows)
久闻 Flutter 大名,今天终于有时间体验一下了 ٩(๑>◡<๑)۶ 官网:https://flutter.dev/ 中文官网:https://flutterchina.club/ 一 ...
- 快速掌握RabbitMQ(二)——四种Exchange介绍及代码演示
在上一篇的最后,编写了一个C#驱动RabbitMQ的简单栗子,了解了C#驱动RabbitMQ的基本用法.本章介绍RabbitMQ的四种Exchange及各种Exchange的使用场景. 1 direc ...
- Windows Phone 8.1 开发实例 网络编程 天气预报
首先感谢林政老师的博客,给了我很大的指导. 准备工作 我的开发环境: - Visual Studio 2013(With Update 4) - Windows Phone 8.1 - Windows ...
- Java I/O概述
Java的I/O通过java.io包下的类.接口来支持.在java.io包下主要包括输入.输出两种IO流,每种输入.输出流又可分为字符流.字节流两大类. 字符流以字符为单位处理输入.输出操作,字节流以 ...
- Webstorm上面通过babel将es6转化为es5
1.首先创建一个新的文件夹(名为do);2.然后再根目录下面新建一个package.json,只需要写明两个属性即name和version,这个没有必须要和下面我写的一致,可以自行定义. { &quo ...
- (转) SYSTEM_HANDLE_INFORMATION中ObjectTypeIndex的定义
typedef struct _SYSTEM_HANDLE_TABLE_ENTRY_INFO{ USHORT UniqueProcessId; USHORT CreatorBackTraceIndex ...