fzyzojP2119 -- 圆圈游戏
说白了,就是这个样子:
这个玩意明显是一个优美的树形结构
是个森林
然后建个虚点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=;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);
(fl==true)&&(x=-x);
}
namespace Miracle{
const int N=+;
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[*N];
int tot;
struct node{
int nxt,to;
}e[*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]=;
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=;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=; q[++tot].pos=c[i].x+c[i].r;
q[tot].id=i;q[tot].typ=-;
}
sort(q+,q+tot+);
for(reg i=;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==){
it=s.upper_bound(po(q[i].id,));
if(it!=s.end()){
if((*it).fl==){
// 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]=;
add(,q[i].id);
}
s.insert(po(q[i].id,));
s.insert(po(q[i].id,-));
}else{
s.erase(po(q[i].id,));
s.erase(po(q[i].id,-));
}
}
dfs();
printf("%d\n",f[]);
return ;
} }
signed main(){
freopen("2.in","r",stdin);
freopen("2.out","w",stdout);
Miracle::main();
return ;
} /*
Author: *Miracle*
Date: 2019/2/10 8:46:45
*/
fzyzojP2119 -- 圆圈游戏的更多相关文章
- 4.9 省选模拟赛 圆圈游戏 树形dp set优化建图
由于圆不存在相交的关系 所以包容关系形成了树的形态 其实是一个森林 不过加一个0点 就变成了树. 考虑对于每个圆都求出最近的包容它的点 即他的父亲.然后树形dp即可.暴力建图n^2. const in ...
- 剑指Offer-孩子们的游戏(圆圈中最后剩下的数)
package Other; import java.util.LinkedList; /** * 孩子们的游戏(圆圈中最后剩下的数) * 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友, ...
- 剑指offer-孩子们的游戏(圆圈中最后剩下的数)-知识迁移能力-python
题目描述 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为牛客的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈.然后,他随机指 ...
- html5+Canvas实现酷炫的小游戏
最近除了做业务,也在尝试学习h5和移动端,在这个过程中,学到了很多,利用h5和canvas做了一个爱心鱼的小游戏.点这里去玩一下 PS: 貌似有点闪屏,亲测多刷新两下就好了==.代码在本地跑都不会闪, ...
- tyvj1008 传球游戏
背景 NOIP2008复赛普及组第三题 描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏. 游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一 ...
- Android 之surfaceView (画动态圆圈)
通过之前介绍的如何自定义View, 我们知道使用它可以做一些简单的动画效果.它通过不断循环的执行View.onDraw方法,每次执行都对内部显示的图形做一些调整,我们假设 onDraw方法每秒执行 ...
- 经典DOS游戏皇帝攻略(曾经的回忆)
最完美攻略>>>>> -------------------------------------------------------------------------- ...
- OpenNI结合Unity3D Kinect进行体感游戏开发(转)
OpenNI结合Unity3D Kinect进行体感游戏开发(转) 楼主# 更多 发布于:2012-07-17 16:42 1. 下载安装Unity3D(目前版本为3.4)2. 下载OpenN ...
- 七、考反映小游戏《苹果iOS实例编程入门教程》
该app为应用的功能为一个简单的考反应游戏 纲要:-UIButton, UILabel, UIImageView 的运用:-利用rendom增加游戏可玩性: 游戏说明: 在按下开始游戏后,分为三盏的指 ...
随机推荐
- day23 正则,re模块
一. 简谈正则表达式 元字符 . 除了换行符外任意字符. \w 数字.字母.下划线 \s 空白符 \b 单词的末尾 \d 数字 \n 匹配换行符 \t 匹配制表符 \W 除了数字. 字母 下划线 \D ...
- Aspose.words Java基于模板生成word之纯文本内容
一,创建word模板 1.新建一个word文档 2.分别给四个参数设置域 (1)将鼠标置于想要设置域的地方 (2)设置域名 (3)设置好之后如下图所示 二,项目 1,引入maven依赖 <dep ...
- Daily Scrumming* 2015.10.26(Day 7)
一.总体情况总结 今天我们开会具体讨论了一下接下来的任务.还详细讨论了一下分数的分配,具体分数分配我们会在下一篇博客中详细说明. 我们下一周大致的工作安排如下: 1.UI:完成社团后台界面的设计,以及 ...
- [2017BUAA软工]结对项目
软工结对项目 一. Github项目地址 https://github.com/crvz6182/sudoku_partner 二. PSP表格 Psp personal software progr ...
- 20135234mqy 实验四
北京电子科技学院(BESTI) 实 验 报 告 课程:java程序设计 班级:1352 姓名:mqy 学号:20135234 成绩: 指导教师:娄嘉鹏 ...
- Chapter 2 软件过程
软件发展前期,人们只重视结果而忽略了过程,随着技术的成熟,软件过程的重要性被日益发觉.软件过程是软件工程人员为了获得软件产品而在软件工具的支持下实施的一系列软件工程活动. 软件过程的基本活动包括问题提 ...
- 关于mybatis的思考(2)——mybatis映射文件的深入理解
1.配置文件 mybatis进行持久化操作是以SqlSessionFactory对象为基础的,这个对象是整个数据库映射关系经过编译后的内存镜像. InputStream inputStream = R ...
- 1003 我要通过!| PAT (Basic Level) Practice
1003 我要通过! (20 分) "答案正确"是自动判题系统给出的最令人欢喜的回复.本题属于 PAT 的"答案正确"大派送 -- 只要读入的字符串满足下列条件 ...
- Team饭来了团队作业3需求改进与系统设计
团队名称:饭来了 人员组成: 队长:侯晓东 学号:2016012087 队员:崔啸寒 学号:2016012006 队员:方柱权 学号:201601 ...
- Java集合技巧
集合的一些技巧: 需要唯一吗? 需要:Set 需要制定顺序: 需要: TreeSet 不需要:HashSet 但是想要一个和存储一致的顺序(有序):LinkedHashSet 不需要:List ...