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],求环序列中逆序对 ...
随机推荐
- 【Tomcat】解决Tomcat catalina.out 不断成长导致档案过大的问题
Tomcat的网站上的说法http://wiki.apache.org/tomcat/FAQ/Logging#Q6: System.out 和 System.err 都被打印到 catalina.ou ...
- array的用法(关于动态选择值)
- 487. Max Consecutive Ones II
Given a binary array, find the maximum number of consecutive 1s in this array if you can flip at mos ...
- LL(1)语法分析器 //c++实现
#include<iostream> #include<string> #include<map> #include<vector> #include& ...
- DBCP,C3P0与Tomcat jdbc pool 连接池的比较
hibernate开发组推荐使用c3p0; spring开发组推荐使用dbcp(dbcp连接池有weblogic连接池同样的问题,就是强行关闭连接或数据库重启后,无法reconnect,告诉连接被重置 ...
- webstorm调试(一)提示css未使用的选择器Selector is never used
一.css未使用的选择器Selector 今天写vue的时候,给动态绑定了一个class属性,然后样式里面就给了warning,看起来怪怪的,很不舒服
- luogu P1704 寻找最优美做题曲线
题目背景 nodgd是一个喜欢写程序的同学,前不久(好像还是有点久了)洛谷OJ横空出世,nodgd同学当然第一时间来到洛谷OJ刷题.于是发生了一系列有趣的事情,他就打算用这些事情来出题恶心大家-- 题 ...
- java基础之IO流(一)字节流
java基础之IO流(一)之字节流 IO流体系太大,涉及到的各种流对象,我觉得很有必要总结一下. 那什么是IO流,IO代表Input.Output,而流就是原始数据源与目标媒介的数据传输的一种抽象.典 ...
- Tomcat服务器解析“GET /JavaWebDemo1/1.jsp HTTP/1.1”
(2)服务器收到http请求报文,返回http响应报文 Tomcat服务器解析“GET /JavaWebDemo1/1.jsp HTTP/1.1” Tomcat服务器解析“GET /JavaWebDe ...
- 【剑指offer】异或去重
转载请注明出处:http://blog.csdn.net/ns_code/article/details/27568975 这篇文章没有代码.介绍的是纯理论的思路. 异或是一种基于二进制的位运算,用符 ...