hdu 4614 Vases and Flowers (二分 线段树)
题目大意:爱丽丝有N个花瓶,每个花瓶最多放一朵花。然后又如下两个操作。
1:A B 从第A个花瓶开始,往后依次插B朵花,直到不能插为止。如果一朵花都不能插入就输出“can.....”,否则输出第一个插花位置和最后一个插花位置。
2:A B 输出A B 之间有多少朵花 然后将这些花瓶清空。
当时比赛的时候始终找不到办法求出 最后一个插花位置。 也想过二分 但是想着怕效率太慢就没写。
其实最后想想也是 只有50000个操作 再乘以log N的二分 最多也就20W左右吧。
我是弱菜,自己写的程序效率巨慢。而且数组也开得多。
思路:
用lef 记录每个区间最左边可以放的花瓶,如果没有就是INF
用rig 记录每个区间最右边可以放的花瓶,如果没有就是-1
以上两个在更新的时候 lef选较小的 rig选较大的
cov表示区间全空 0 还是全满1 ,或者是不空不满 -1
然后emp表示区间空花瓶数。
主要的难点就是可以插花的时候怎么找到最后一个插花位置。
那么就用二分 找那个 emp == 所需要插花的数量 的最小右边的区间。
详见代码。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <map>
#include <set>
#define maxn 50005
#define lson num<<1,s,mid
#define rson num<<1|1,mid+1,e
#define INF 0x3f3f3f3f
using namespace std; int emp[maxn<<2];
int cov[maxn<<2];
int lef[maxn<<2];
int lzy[maxn<<2];
int rig[maxn<<2]; void pushup(int num)
{
emp[num]=emp[num<<1]+emp[num<<1|1]; if(cov[num<<1]==0 && cov[num<<1|1]==0)cov[num]==0;
else if(cov[num<<1|1]==1 && cov[num<<1]==1)cov[num]=1;
else cov[num]=-1;
lef[num]=min(lef[num<<1],lef[num<<1|1]);
rig[num]=max(rig[num<<1|1],rig[num<<1]);
} void pushdown(int num,int s,int e)
{
if(lzy[num]!=0)
{
int mid=(s+e)>>1; lzy[num<<1]=lzy[num<<1|1]=lzy[num]; if(cov[num]!=-1)cov[num<<1]=cov[num<<1|1]=cov[num]; if(cov[num<<1]==0)emp[num<<1]=mid-s+1;
else if(cov[num<<1]==1)emp[num<<1]=0; if(cov[num<<1|1]==0)emp[num<<1|1]=e-mid;
else if(cov[num<<1|1]==1)emp[num<<1|1]=0; if(cov[num]==0)
{
lef[num<<1]=s;
rig[num<<1]=mid;
lef[num<<1|1]=mid+1;
rig[num<<1|1]=e;
}
else
{
lef[num<<1]=lef[num<<1|1]=INF;
rig[num<<1]=rig[num<<1|1]=-1;
}
lzy[num]=0;
}
} void build(int num,int s,int e)
{
cov[num]=0;
lef[num]=s;
rig[num]=e;
emp[num]=e-s+1;
lzy[num]=0;
if(s==e)return;
int mid=(s+e)>>1; build(lson);
build(rson);
pushup(num);
} void update(int num,int s,int e,int l,int r,int val)
{
if(l<=s && r>=e)
{
lzy[num]=1;
cov[num]=val;
emp[num]=val==0?e-s+1:0;
lef[num]=val==0?s:INF;
rig[num]=val==0?e:-1;
return;
}
pushdown(num,s,e);
int mid=(s+e)>>1;
if(l<=mid)update(lson,l,r,val);
if(r>mid)update(rson,l,r,val);
pushup(num);
} int query(int num,int s,int e,int l,int r)
{
//printf("emp=%d,s=%d,e=%d,l=%d,r=%d,cov=%d\n",emp[num],s,e,l,r,cov[num]);
if(l<=s && r>=e)
{
return emp[num];
}
pushdown(num,s,e);
int mid=(s+e)>>1;
if(r<=mid)return query(lson,l,r);
else if(l>mid)return query(rson,l,r);
else return query(lson,l,mid)+query(rson,mid+1,r);
pushup(num);
} int Q_L(int num,int s,int e,int l,int r)//找到区间的LEF
{
if(l==s && r==e)
{
return lef[num];
} pushdown(num,s,e);
int mid=(s+e)>>1;
if(r<=mid)return Q_L(lson,l,r);
else if(l>mid)return Q_L(rson,l,r);
else return min(Q_L(lson,l,mid),Q_L(rson,mid+1,r));
pushup(num);
} int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,m;
scanf("%d%d",&n,&m); build(1,1,n);//额额额。 我是用1-N 建的树 而题目说的是 0-N-1 所以。。。后面有一些++操作。。。
int tl,tr;
while(m--)
{
int op,aa,bb;
scanf("%d%d%d",&op,&aa,&bb); if(op==1)
{
aa++;
int ll=Q_L(1,1,n,aa,n);//找到左边
if(ll==INF)
{
printf("Can not put any one.\n");
continue;
}
printf("%d ",ll-1);
int ttmp=query(1,1,n,ll,n); if(ttmp==0)
printf("Can not put any one.\n");
else
{
if(ttmp<=bb)
{
printf("%d\n",rig[1]-1);
update(1,1,n,ll,n,1);
}
else
{
int top=n,bot=ll,mid;
while(bot<=top)
{
mid=(bot+top)>>1;
int bin=query(1,1,n,ll,mid);
if(bin>bb)
top=mid-1;
else if(bin<bb)
bot=mid+1;
else break;
}
while(query(1,1,n,ll,mid)==bb)//找到最小的
{
mid--;
if(mid<=ll)break;
}
printf("%d\n",mid+1-1);
update(1,1,n,ll,mid+1,1);
}
}
}
else
{
aa++,bb++;
printf("%d\n",bb-aa+1-query(1,1,n,aa,bb));
update(1,1,n,aa,bb,0);
}
}
puts("");
}
return 0;
}
hdu 4614 Vases and Flowers (二分 线段树)的更多相关文章
- HDU 4614 Vases and Flowers(二分+线段树区间查询修改)
描述Alice is so popular that she can receive many flowers everyday. She has N vases numbered from 0 to ...
- HDU 4614 Vases and Flowers(线段树+二分)
Vases and Flowers Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others ...
- HDU 4614 Vases and Flowers 【线段树】+【二分】
<题目链接> 题目大意: 有n个花瓶,每个花瓶中只能放一朵花.两种操作,一种是从A开始放F朵花,如果有的花瓶中已经有花则跳过这个花瓶,往下一个花瓶放:第二种是将区间[A,B]之间花瓶中的花 ...
- HDU 4614 Vases and Flowers(线段树+记录区间始末点或乱搞)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4614 题目大意:有n个空花瓶,有两种操作: 操作①:给出两个数字A,B,表示从第A个花瓶开始插花,插B ...
- hdu 4614 Vases and Flowers(线段树:成段更新)
线段树裸题.自己写复杂了,准确说是没想清楚就敲了. 先是建点为已插花之和,其实和未插花是一个道理,可是开始是小绕,后来滚雪球了,跪了. 重新建图,分解询问1为:找出真正插画的开始点和终止点,做成段更新 ...
- hdu 4614 Vases and Flowers(线段树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4614 题意: 给你N个花瓶,编号是0 到 N - 1 ,初始状态花瓶是空的,每个花瓶最多插一朵花. ...
- HDU4614 Vases and Flowers 二分+线段树
分析:感觉一看就是二分+线段树,没啥好想的,唯一注意,当开始摆花时,注意和最多能放的比大小 #include<iostream> #include<cmath> #includ ...
- HDU - 4614 Vases and Flowers(二分+区间修改)
https://cn.vjudge.net/problem/HDU-4614 题意 n个花瓶,m个操作,花瓶里面有的有花,有的是空的.1操作是从a开始往右放b朵花,花瓶有了的不放,跳过,直到a右边都放 ...
- HDU 4614 Vases and Flowers (2013多校2 1004 线段树)
Vases and Flowers Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others ...
- 【HDU 4614】Vases and Flowers(线段树区间更新懒惰标记)
题目0到n-1的花瓶,操作1在下标a开始插b朵花,输出始末下标.操作2清空[a,b]的花瓶,求清除的花的数量.线段树懒惰标记来更新区间.操作1,先查询0到a-1有num个空瓶子,然后用线段树的性质,或 ...
随机推荐
- Zend Studio 如何配置本地apache服务器使用xdebug调试php脚本
本地环境搭配: apache 2.2 安装位置:D:/program files/Apache Software Foundation/Apache2.2 php 5.2.10 安装位置:C:/php ...
- 64位win8 配置Apache2.4+mod_msgi4.4.21+django1.8.6+python3.4
学习了很多前人分享的资料,整理如下: 安装步骤: 一.安装python3.4 下载 python-3.4.3.amd64.msi 直接安装 地址:https://www. ...
- ASP.NET jQuery 随笔 显示CheckBoxList成员选中的内容
通过jQuery来获取CheckBoxList成员内容. <%@ Page Language="C#" AutoEventWireup="true" Co ...
- hibernate 持久化对象的生命周期 2.1
持久化对象的生命周期 瞬态(自由态) 表示对象在内存中存在,在数据库中没有数据相关,比如刚刚new出来的一个对象 持久态 持久态指的是持久化对象处于由Hibernate管理的状态,这种状态下持久化对象 ...
- Java学习之自定义异常
1 package com.gh; import java.util.Scanner; /** * 自定义异常 * @author ganhang * */ public class Exceptio ...
- Card Game Cheater(贪心+二分匹配)
Card Game Cheater Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- [Swust OJ 404]--最小代价树(动态规划)
题目链接:http://acm.swust.edu.cn/problem/code/745255/ Time limit(ms): 1000 Memory limit(kb): 65535 Des ...
- Oracle统计之like,or关键字
有的时候我们统计需要like多个条件,比如某个字段中含有 “银行”或者“投资公司”,这个时候就用like多个字段. 如下是统计某个地区的2015年入院的病种诊断中带有 “癌”或者“肿瘤”的情况, 正确 ...
- pkg_utility
创建包名: CREATE OR REPLACE PACKAGE BODY PKG_UTILITY AS --字符串转换到索引表 PROCEDURE STR_TO_LIST(PI_STR IN VARC ...
- 如何设置ssh安全只允许用户从指定的IP登陆
原文链接: 如何设置ssh安全只允许用户从指定的IP登陆 由于开发上传文件需要 在服务器上开启 允许用户名和密码ssh登录.这样不太安全.百度后参考文章现在ssh用户名和密码登录的ip. 登录服务 ...