Holedox Eating HDU - 4302 2012多校C 二分查找+树状数组/线段树优化
题意
一个长度$n<=1e5$的数轴,$m<=1e5$个操作
有两种一些操作
$0$ $x$ 在$x$放一个食物
$1$ 一个虫子去吃最近的食物,如果有两个食物一样近,不转变方向的去吃
虫子一开始在$0$点,没吃的就不动
求最终虫子跑了多远?
解法:
用数组维护每个地点有几个食物,
用树状数组维护数轴区间和,每次对于左右进行二分区间求和,找到左右最近的那个点,取最小值即可
#include <bits/stdc++.h>
#define ll long long
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define pp pair<int,int>
#define rep(ii,a,b) for(int ii=a;ii<=b;ii++)
#define per(ii,a,b) for(int ii=a;ii>=b;ii--)
#define show(x) cout<<#x<<"="<<x<<endl
#define show2(x,y) cout<<#x<<"="<<x<<" "<<#y<<"="<<y<<endl
#define show3(x,y,z) cout<<#x<<"="<<x<<" "<<#y<<"="<<y<<" "<<#z<<"="<<z<<endl
#define showa(a,b) cout<<#a<<'['<<#b<<"]="<<a[b]<<endl
using namespace std;
const int maxn=1e5+10;
const int maxm=1e6+10;
const int INF=0x3f3f3f3f;
int casn,n,m,k;
#define lb(x) (x&(-x))
int bt[maxn];
inline void upd(int pos,int x){
while(pos<=n)
bt[pos]+=x,pos+=lb(pos);
}
inline int psum(int pos,int sum=0){
while(pos)
sum+=bt[pos],pos-=lb(pos);return sum;
}
inline int rsum(int l,int r){
// show2(l,r);
return psum(r)-psum(l);
} int main(){
//#define test
#ifdef test
freopen("in.txt","r",stdin);freopen("out.txt","w",stdout);
#endif
IO;
cin>>casn;
int t=0;
while(casn--){
int ans=0;
cin>>n>>m;
n++;
memset(bt,0,sizeof bt);
int pos=1,dir=1;
for(int i=0;i<m;i++){
int a,b;
cin>>a;
if(a==0){
cin>>b;
b++;
upd(b,1);
}else {
if(rsum(pos-1,pos)){
upd(pos,-1);
// show(1);
}else {
int l=1,r=pos-1;
int x1=INF,x2=INF;
if(pos>1&&rsum(0,pos)!=0){
while(l<r){
int mid=(l+r)>>1;
if(rsum(mid,pos)>0){
l=mid+1;
}else r=mid;
}
x1=pos-l;
}
if(pos<n&&rsum(pos,n)){
l=pos+1,r=n;
while(l<r){
int mid=(l+r)>>1;
if(rsum(pos,mid)>0){
r=mid;
}else l=mid+1;
}
x2=l-pos;
}
if(x1==x2&&x1==INF){
// show(1);
continue;
}
if(x1==x2){
ans+=x1;
pos+=dir*x1;
upd(pos,-1);
}else {
ans+=min(x1,x2);
if(x1<x2){
pos-=x1;
dir=-1;
upd(pos,-1);
}else{
pos+=x2;
dir=1;
upd(pos,-1);
}
}
// show2(x1,x2);
}
}
// show(ans);
}
cout<<"Case "<<++t<<": ";
cout<<ans<<endl;
} #ifdef test
fclose(stdin);fclose(stdout);system("out.txt");
#endif
return 0;
}
Holedox Eating HDU - 4302 2012多校C 二分查找+树状数组/线段树优化的更多相关文章
- hdu 3966 Aragorn's Story(树链剖分+树状数组/线段树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3966 题意: 给出一棵树,并给定各个点权的值,然后有3种操作: I C1 C2 K: 把C1与C2的路 ...
- hdu 1166 敌兵布阵——(区间和)树状数组/线段树
pid=1166">here:http://acm.hdu.edu.cn/showproblem.php?pid=1166 Input 第一行一个整数T.表示有T组数据. 每组数据第一 ...
- HDU 1166 敌兵布阵 树状数组||线段树
http://acm.hdu.edu.cn/showproblem.php?pid=1166 题目大意: 给定n个数的区间N<=50000,还有Q个询问(Q<=40000)求区间和. 每个 ...
- HDU 3303 Harmony Forever 前缀和+树状数组||线段树
Problem Description We believe that every inhabitant of this universe eventually will find a way to ...
- hdu 1166:敌兵布阵(树状数组 / 线段树,入门练习题)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- hdu 1166 树状数组 线段树入门
点修改 区间求和 #include <cstdio> #include <cstdlib> #include <cmath> #include <map> ...
- hdu 1166 树状数组(线段树)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- HDU 5293 Train chain Problem - 树链剖分(树状数组) + 线段树+ 树型dp
传送门 题目大意: 一颗n个点的树,给出m条链,第i条链的权值是\(w_i\),可以选择若干条不相交的链,求最大权值和. 题目分析: 树型dp: dp[u][0]表示不经过u节点,其子树的最优值,dp ...
- hdu 5147 Sequence II【树状数组/线段树】
Sequence IITime Limit: 5000/2500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem ...
随机推荐
- 使用git 上传项目到gitee/github
参考: https://blog.csdn.net/qq944639839/article/details/79864081 注意:在此之前需要设置ssh公匙 详见:Github/github 初始化 ...
- c++中sizeof的理解
1. 例题 #include <iostream> class A {}; class B { char m_data; }; class C { ]; }; class D { char ...
- 微信小程序入门教程(一)API接口数据记录
今天测试用小程序调用API接口,发现有些数据打印都是对象,怎么全部打印详细点来 小程序代码: httpsearch: function (name, offset, type, cb) { wx.re ...
- Java中的AES加解密
直接上代码,Base64使用的是Java8的方法,如没有,替换即可 KEY:即密码 IV:即偏移量,可自订,十六位 加密方式:AES/CBC/PKCS5Padding,128位加密 如果想用256位和 ...
- 用IntelliJ IDEA搭建第一个SpringBoot例子
前言:最近把IntelliJ IDEA弄好了,也偶然接触到了springboot这个新的微服务框架.发现这个框架简单但也有一些不足.听说springboot可以在140个字符内发布一个web应用.所以 ...
- VS Code使用 Vue工程配置 eslint
首先确保VS Code 安装了 Vetur 和 Eslint 插件. VS CODE :文件 =>首选项 => 设置 (有3个点 或 {} 这样的大括号,打开setting.json) ...
- 向JSP中静态导入HTML文件时,运行jsp时,html中中文产生乱码问题最简单的解决方法
在保证其他的编码格式一致的情况下 在html标签内,head标签外添加一下代码时可以完美解决 亲测 <%@page pageEncoding="UTF-8"%>
- 在SQL注入中利用MySQL隐形的类型转换绕过WAF检测
web应用一般采用基于表单的身份验证方式(页面雏形如下图所示),处理逻辑就是将表单中提交的用户名和密码传递到后台数据库去查询,并根据查询结果判断是否通过身份验证.对于LAMP架构的web应用而言,处理 ...
- 快速学习 javascript
// js 6种数据类型:字符串.数值.布尔值.undefined.null.object // 三种非数字的数字类型:Infinity -Infinity NaN var str = "H ...
- PDO和MySQLi区别与选择?
当用PHP访问数据库时,除了PHP自带的数据库驱动,我们一般还有两种比较好的选择:PDO和MySQLi.在实际开发过程中要决定选择哪一种首先要对二者有一个比较全面的了解.本文就针对他们的不同点进行分析 ...