题意

一个长度$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;
}

  

最新文章

  1. kafka配置参数
  2. SELECT控件操作的JS代码示例
  3. (Hibernate进阶)Hibernate系列——总结篇(九)
  4. 软将工程课设day1与day2
  5. How to implement a custom type for NHibernate property
  6. LoadRunner使用技巧之添加事务
  7. 测试mysql的sql语句预编译效果
  8. JavaScript 数组方法和属性
  9. ios----protocol, optional ,delegate
  10. chrome浏览器频频崩溃,如何解决?
  11. -_-#Tiny Raytracer
  12. Android 开发笔记-Eclipse中文乱码
  13. DOM4J介绍与代码示例
  14. git 域名配置
  15. LOJ#6387 「THUPC2018」绿绿与串串 / String (Manacher || hash+二分)
  16. cache 基本原理
  17. SQL记录-PLSQL事务
  18. VC++ 学习笔记2 列表框添加字符串
  19. [转贴]Cocos2d-x3.2与OpenGL渲染总结(一)Cocos2d-x3.2的渲染流程
  20. matlab实现cart(回归分类树)

热门文章

  1. Dubbo管控台安装(zookeeper集群)
  2. CentOS在VirtualBox虚拟机中网络配置
  3. VS2015快捷键大全
  4. cmd快速设置本机ip和dns【转】
  5. CSS脱离文档流&amp;浮动
  6. Kettle系列: Kettle并行执行Trans后的合并问题
  7. 可由inetd启动的协议无关时间获取服务器程序
  8. PHP+MySql+Bootstrap实现用户界面数据的删除、修改与批量选择删除——实例操作
  9. 往github上传代码忽略node_modules文件夹
  10. Python基础2(2017-07-18)