说白了,就是这个样子:

这个玩意明显是一个优美的树形结构

是个森林

然后建个虚点0,并且w[0]=0,然后树形dp即可

f[x]=max(w[x],∑f[son])

难点是:树怎么建?

就要上计算几何了:

如果我们用扫描线扫过去

发现,同时存在的两个圆,由于不相交,不相切,所以 相对位置始终保持不变

或者说,不论扫到哪个位置,两个圆的四个纵坐标的相对大小是固定的。

基于这个优秀的事实,

判断圆的相互包含关系,这样处理:

画个图就明白了

这个都是基于:“纵坐标相对大小不变”的事实,所以,不管扫描线怎么动,虽然纵坐标变了,但是不用重新建平衡树,因为形态还是不变的

这使得插入的时候,这个树还是正确的,直接找前驱就是对的了

用set就可以

重载小于号,用全局变量P来比较(只有插入和查询前驱的时候会进行比较)

(比较的第二关键字还是有用的,因为同时插入两个半圆壳,纵坐标那个时候是相同的)

由于会出现r=0的情况,所以扫描线的处理,横坐标相同,插入在前,删除在后。

代码:

#include<bits/stdc++.h>
#define reg register int
#define il inline
#define numb (ch^'0')
using namespace std;
typedef long long ll;
il void rd(ll &x){char ch;x=0;bool fl=false;while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);for(x=numb;isdigit(ch=getchar());x=x*10+numb);(fl==true)&&(x=-x);
}
namespace Miracle{
const int N=100000+5;
int n;
ll P;//PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
struct circle{ll x,y,r;int w;long double calc(ll p,int fl){return (long double)y+fl*sqrt((long double)r*r-(long double)(p-x)*(p-x));            }
}c[N];
struct po{int id,fl;//fl=1 up; fl=-1 down
    po(){}po(int x,int y){id=x;fl=y;}bool friend operator <(po a,po b){if(c[a.id].calc(P,a.fl)!=c[b.id].calc(P,b.fl)) return c[a.id].calc(P,a.fl)<c[b.id].calc(P,b.fl);return a.fl<b.fl;}
};
set<po>s;
set<po>::iterator it;
struct que{int pos,id,typ;bool friend operator <(que a,que b){if(a.pos!=b.pos)return a.pos<b.pos;return a.typ>=b.typ;}
}q[2*N];
int tot;
struct node{int nxt,to;
}e[2*N];
int hd[N],cnt;
int du[N];
int fa[N];
void add(int x,int y){e[++cnt].nxt=hd[x];e[cnt].to=y;hd[x]=cnt;
}
int f[N];
bool vis[N];
void dfs(int x){vis[x]=1;for(reg i=hd[x];i;i=e[i].nxt){int y=e[i].to;if(!vis[y]){dfs(y);f[x]+=f[y];}}f[x]=max(f[x],c[x].w);
}
int main(){scanf("%d",&n);for(reg i=1;i<=n;++i){rd(c[i].x);rd(c[i].y);rd(c[i].r);//rd(c[i].w);scanf("%d",&c[i].w);q[++tot].pos=c[i].x-c[i].r;q[tot].id=i;q[tot].typ=1;q[++tot].pos=c[i].x+c[i].r;q[tot].id=i;q[tot].typ=-1;}sort(q+1,q+tot+1);for(reg i=1;i<=tot;++i){P=q[i].pos;//    cout<<q[i].pos<<" "<<q[i].id<<" "<<q[i].typ<<endl;//    cout<<c[1].calc(P,1)<<" and "<<c[1].calc(P,-1)<<" "<<c[q[i].id].calc(P,1)<<endl;if(q[i].typ==1){it=s.upper_bound(po(q[i].id,1));if(it!=s.end()){if((*it).fl==1){//    cout<<" find up "<<endl;fa[q[i].id]=(*it).id;add((*it).id,q[i].id);}else{fa[q[i].id]=fa[(*it).id];add(fa[(*it).id],q[i].id);}}else{fa[q[i].id]=0;add(0,q[i].id);}s.insert(po(q[i].id,1));s.insert(po(q[i].id,-1));}else{s.erase(po(q[i].id,1));s.erase(po(q[i].id,-1));}}dfs(0);printf("%d\n",f[0]);return 0;
}}
signed main(){freopen("2.in","r",stdin);freopen("2.out","w",stdout);Miracle::main();return 0;
}/*Author: *Miracle*Date: 2019/2/10 8:46:45
*/

转载于:https://www.cnblogs.com/Miracevin/p/10359299.html

fzyzojP2119 -- 圆圈游戏相关推荐

  1. 牛客网-数据结构笔试题目(三)-博弈论圆圈游戏(Circle Game)(附源码)

    题意 从前有两个人,一个叫Utkarsh,另外一个叫Ashish. 这两个人在一个2D的棋盘上玩移动棋子的游戏,一开始从原点出发,Ashish先手.每次可以把棋子向上或者是向右移动k个单位的距离.两人 ...

  2. 【最新计算机、电子毕业设计 本科 大专 设计+源码】

    2022年 - 2023年 最新计算机.电子毕业设计 本科 大专 设计+源码 下载前必看: 纯小白教程,unity两种格式资源的使用方法,1打开现有项目.2导入package 大专毕设源码:数媒专业. ...

  3. 剑指offer-孩子们的游戏(圆圈中最后剩下的数)

    题目描述 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为牛客的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈.然后,他随机指 ...

  4. 把所有圆圈连接起来的游戏_20个幼儿园体育小游戏教程

    1.游戏<木头人> 游戏规则:幼儿手拉手围成一个圆圈,边走边念儿歌"我是一个木头人,不会说话不会动,看谁坚持一分钟"念到最后一个字时所有幼儿摆出造型不动.老 师说时间到 ...

  5. 把所有圆圈连接起来的游戏_【实用教案】赶紧收藏!幼儿园秋季户外游戏大全、好玩易操作!...

    又是一年秋来到,秋分已过,天气凉快了很多,秋高气爽!现在正是户外活动的好季节,下面小编就为大家总结一下最适合秋天的户外活动,幼儿园老师园长快快收藏起来吧!幼儿园徒手类游戏1.粘泡泡糖.所有的孩子围成 ...

  6. python循环绘制六角星_《Python游戏趣味编程》 第3章 美丽的圆圈画

    知乎视频​www.zhihu.com 图书简介可以看这里: 童晶:<Python游戏趣味编程>新书上架了​zhuanlan.zhihu.com 本章我们将利用Python绘制美丽的圆圈画, ...

  7. 《Python游戏趣味编程》 第4章 疯狂的小圆圈

    4 疯狂的小圆圈 图书简介可以看这里: 童晶:<Python游戏趣味编程>新书上架了 本章我们将实现一个好玩的程序,鼠标点击后,会在点击处出现一些同心圆圈,并在窗口中四处反弹,效果如图4- ...

  8. 《Python游戏趣味编程》 第3章 美丽的圆圈画

    3 美丽的圆圈画 图书简介可以看这里: 童晶:<Python游戏趣味编程>新书上架了 本章我们将利用Python绘制美丽的圆圈画,鼠标点击时圆圈的颜色会随机变化.首先在上一章的基础上,绘制 ...

  9. 把所有圆圈连接起来的游戏_适合幼儿园玩的10大经典游戏

    原标题:适合幼儿园玩的10大经典游戏 1.木头人 游戏规则:小朋友手拉手围成一个圆圈,边走边念儿歌"我是一个木头人,不会说话不会动,看谁坚持一分钟"念到最后一个字时所有幼儿摆出造型 ...

最新文章

  1. CSDN 十大技术主题盘点-AI篇
  2. Excel如何快速清除单元格所有内容
  3. Spring学习6之自动装配Bean02
  4. ubuntu 12.04 LTS u盘安装
  5. 英文Ubantu系统安装中文输入法
  6. 完全卸载mysql数据库图文教程
  7. .mvn 需要放git上吗_汽车行李架上可以放东西吗?放了东西可以跑高速吗?
  8. Linux内核TCP/IP协议栈运行时序 | 配图
  9. 人脸对齐(三)--AAM算法
  10. Ansible Ad-Hoc与常用模块
  11. php --- 二维码生成代码
  12. JavaScript使用计时事件制作的电子时钟
  13. 《德鲁克管理思想精要》读书笔记3 - 管理的新范式?
  14. VBNet WinForm如何开发一个照片自动排版程序
  15. 1.初始PR,怎么导入素材和添加效果处理?
  16. ML-czy的小组任务
  17. 全面屏虚拟键适配方案
  18. 处理接口幂等性的两种常见方案
  19. 数加平台在数据挖掘项目中的实践 1
  20. 25款最佳响应式HTML5前端开发框架

热门文章

  1. Linux实时监控日志文件的swatchdog
  2. 教你用 FRP 自建 Teamview 连接避开商业检测
  3. CentOS7网络配置ping通外网
  4. Linux流行病毒家族清除方法集锦
  5. Windows Server 2019安装OpenSSH Server简明教程
  6. Failed to start Zabbix Agent.
  7. 工作中使用到的单词(软件开发)_2022-02-26_备份
  8. 【Excel-2010】日期函数
  9. 【Oracle】审计
  10. 微信JSSDK多图片上传并且解决IOS系统上传一直加载的问题