bzoj3276磁力 两种要求下的最大值:分块or线段树+拓扑
时间:2019-03-25
本文章向大家介绍bzoj3276磁力 两种要求下的最大值:分块or线段树+拓扑,主要包括bzoj3276磁力 两种要求下的最大值:分块or线段树+拓扑使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
进阶指南上的做法是分块的。。
但是线段树搞起来也挺快,将磁石按照距离排序,建立线段树,结点维护区间质量最小值的下标
进行拓扑,每次在可行的范围内在线段树中找到质量最小的下标取出,取出后再将线段树对应的点设置成0
查询时找区间不为0最小值的下标即可
#include<cstdio> #include<algorithm> #define N 250010 typedef long long ll; int n,i,x0,y0,nowp,x,y,r,c,v[N<<2],tmp,h=1,t,q[N];ll nowr; struct P{int m,p;ll d,r;}a[N]; inline bool cmp(P x,P y){return x.d<y.d;} inline void read(int&a){ char c;bool f=0;a=0; while(!((((c=getchar())>='0')&&(c<='9'))||(c=='-'))); if(c!='-')a=c-'0';else f=1; while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0'; if(f)a=-a; } inline ll sqr(ll x){return x*x;} inline int lower(){ int l=1,r=n,t=0,mid; while(l<=r)if(a[mid=(l+r)>>1].d<=nowr)l=(t=mid)+1;else r=mid-1; return t; } inline int merge(int x,int y){ if(!x)return y; if(!y)return x; return a[x].m<a[y].m?x:y; } inline void up(int x){v[x]=merge(v[x<<1],v[x<<1|1]);} void build(int x,int a,int b){ if(a==b){v[x]=a;return;} int mid=(a+b)>>1; build(x<<1,a,mid),build(x<<1|1,mid+1,b),up(x); } void change(int x,int a,int b,int c){ if(a==b){v[x]=0;return;} int mid=(a+b)>>1; c<=mid?change(x<<1,a,mid,c):change(x<<1|1,mid+1,b,c); up(x); } void ask(int x,int a,int b){ if(b<=c){tmp=merge(tmp,v[x]);return;} int mid=(a+b)>>1; ask(x<<1,a,mid); if(c>mid)ask(x<<1|1,mid+1,b); } int main(){ read(x0),read(y0),read(nowp),read(r),read(n),nowr=sqr(r); for(i=1;i<=n;i++){ read(x),read(y),read(a[i].m),read(a[i].p),read(r); a[i].d=sqr(x-x0)+sqr(y-y0),a[i].r=sqr(r); } std::sort(a+1,a+n+1,cmp),build(1,1,n); if(c=lower())while(1){ tmp=0,ask(1,1,n); if(!tmp||a[tmp].m>nowp)break; change(1,1,n,q[++t]=tmp); } while(h<=t){ nowp=a[q[h]].p,nowr=a[q[h++]].r; if(c=lower())while(1){ tmp=0,ask(1,1,n); if(!tmp||a[tmp].m>nowp)break; change(1,1,n,q[++t]=tmp); } } return printf("%d",t),0; }
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android studio圆形进度条 百分数跟随变化
- Android中的SpannableString与SpannableStringBuilder详解
- 浅谈Android 中图片的三级缓存策略
- Android主线程和子线程区别详解
- Android 用RxBinding与RxJava2实现短信验证码倒计时功能
- Android右滑返回上一个界面的实现方法
- Android pull解析xml的实现方法
- Android实现QQ图片说说照片选择效果
- 一个简单的toolabar结合drawlayout使用方法
- 利用DrawerLayout和触摸事件分发实现抽屉侧滑效果
- Android App端与PHP Web端的简单数据交互实现示例
- Android开发实现读取assets目录下db文件的方法示例
- Android Textview实现颜色渐变滚动效果
- Android中fragment+viewpager实现布局
- android自动工具类TextUtils使用详解