4.9 省选模拟赛 圆圈游戏 树形dp set优化建图
由于圆不存在相交的关系 所以包容关系形成了树的形态 其实是一个森林 不过加一个0点 就变成了树。
考虑对于每个圆都求出最近的包容它的点 即他的父亲。然后树形dp即可。暴力建图n^2.
const int MAXN=100010;
int n,m,len;
struct wy
{
ll x,y,r,w;
inline int friend operator <(wy a,wy b){return a.r<b.r;}
}t[MAXN];
int f[MAXN];
int lin[MAXN],ver[MAXN<<1],nex[MAXN<<1];
inline db dist(int x,int y){return sqrt((pf(t[x].x-t[y].x)+pf(t[x].y-t[y].y))*1.0);}
inline void dp(int x)
{
f[x]=t[x].w;
int sum=0;
go(x)
{
dp(tn);
sum+=f[tn];
}
f[x]=max(f[x],sum);
}
inline void add(int x,int y)
{
ver[++len]=y;
nex[len]=lin[x];
lin[x]=len;
}
int main()
{
freopen("circle.in","r",stdin);
freopen("circle.out","w",stdout);
get(n);
rep(1,n,i)
{
ll x,y,r,w;
get(x);get(y);
get(r);get(w);
t[i]=(wy){x,y,r,w};
}
sort(t+1,t+1+n);
rep(1,n,i)//对于每个i找到一个最小的j.
{
db minn=INF;int p=0;
rep(i+1,n,j)
{
db d=dist(i,j);
if(t[j].r-t[i].r-d<0)continue;
if(t[j].r-t[i].r-d<minn)
{
minn=t[j].r-t[i].r-d;
p=j;
}
}
add(p,i);
}
dp(0);put(f[0]);return 0;
}
考虑优化建图 一个思路 把所有的边都连上 然后topsort建图 但是这并不能线段树优化建图什么的。
或者直接对于每个圆找到离自己最近的圆然后判断关系连边。
对于后者 可以考虑以扫描线的方式建图 对于每个圆我们都在左边插入 右边删除。
在插入的时候寻找父亲 可以发现此时圆对于离自己最近的圆要么是包含的 要么是兄弟。
对于前者直接找到了父亲 对于后者 兄弟的父亲就是自己的父亲。
考虑找到最近的圆可以使用圆的上半部分来判断 对于上半部分找到自己左端点离自己最近的圆弧 如果是下半圆弧就是兄弟 上半圆弧那么必然是父亲。
用set维护距离 可以发现这些圆弧的相对位置不变 所以总复杂度nlogn.
const ll MAXN=200010,maxn=3000010;
ll n,T,cnt,len;
ll f[MAXN];
ll lin[MAXN],ver[MAXN<<1],nex[MAXN<<1];
struct wy{ll x,y,z,r,id;}t[MAXN];
struct jl{ll x,y,op;}q[MAXN];
inline ll cmp(jl a,jl b){return a.x<b.x;}
inline void dp(ll x)
{
f[x]=t[x].z;
ll sum=0;
go(x)
{
dp(tn);
sum+=f[tn];
}
f[x]=max(f[x],sum);
}
inline void add(ll x,ll y)
{
ver[++len]=y;
nex[len]=lin[x];
lin[x]=len;
}
struct data
{
ll id,op;
//data(){};
inline double calc()const
{
if(op)return t[id].y+sqrt((pf(t[id].r)-pf(t[id].x-T))*1.0);
return t[id].y-sqrt((pf(t[id].r)-pf(t[id].x-T))*1.0);
}
inline ll friend operator <(data a,data b)
{
double x=a.calc();db y=b.calc();
if(fabs(y-x)>EPS)return x<y;
if(a.op!=b.op)return a.op<b.op;
return a.id<b.id;
}
};
set<data>s;
set<data>::iterator it;
signed main()
{
freopen("circle.in","r",stdin);
freopen("circle.out","w",stdout);
get(n);
rep(1,n,i)
{
ll x,y,z,r;
get(x);get(y);get(r);get(z);
t[i]=(wy){x,y,z,r};
q[++cnt]=(jl){t[i].x-t[i].r,i,1};
q[++cnt]=(jl){t[i].x+t[i].r,i,-1};
}
sort(q+1,q+1+cnt,cmp);
//rep(1,cnt,i)cout<<q[i].y<<endl;
rep(1,cnt,i)
{
T=q[i].x;
//cout<<(*s.begin()).id<<' '<<(*s.begin()).op<<endl;
if(q[i].op==1)
{
s.insert((data){q[i].y,1});
it=s.find((data){q[i].y,1});
++it;
if(it==s.end())f[q[i].y]=0;
else
{
if((*it).op==0)f[q[i].y]=f[(*it).id];
else f[q[i].y]=(*it).id;
}
s.insert((data){q[i].y,0});
}
else
{
s.erase((data){q[i].y,1});
s.erase((data){q[i].y,0});
}
}
rep(1,n,i)add(f[i],i);
dp(0);put(f[0]);return 0;
}
一些细节:两个圆并列的时候注意让下半圆弧优先 注意距离的计算公式。
4.9 省选模拟赛 圆圈游戏 树形dp set优化建图的更多相关文章
- 4.3 省选模拟赛 序列游戏 dp
可以发现 某一段被删除后状态难以表示 也难以链接起来. 考虑暴力 有40分的状压dp 暴力存状态 然后枚举转移即可.最后注意和f[0]这个状态取max 不然一分都没有. const int MAXN= ...
- 省选模拟赛 4.26 T1 dp 线段树优化dp
LINK:T1 算是一道中档题 考试的时候脑残了 不仅没写优化 连暴力都打挂了. 容易发现一个性质 那就是同一格子不会被两种以上的颜色染.(颜色就三种. 通过这个性质就可以进行dp了.先按照左端点排序 ...
- 5.29 省选模拟赛 树的染色 dp 最优性优化
LINK:树的染色 考场上以为这道题要爆蛋了 没想到 推出正解来了. 反正是先写了爆搜的 爆搜最近越写越熟练了 容易想到dp 容易设出状态 f[i][j]表示以i为根的子树内白色的值为j此时黑色的值怎 ...
- 5.15 省选模拟赛 容斥 生成函数 dp
LINK:5.15 T2 个人感觉生成函数更无脑 容斥也好推的样子. 容易想到每次放数和数字的集合无关 所以得到一个dp f[i][j]表示前i个数字 逆序对为j的方案数. 容易得到转移 使用前缀和优 ...
- 4.26 省选模拟赛 T3 状压dp 差分求答案
LINK:T3 比较好的题目 考试的时候被毒瘤的T2给搞的心态爆炸 这道题连正解的思路都没有想到. 一看到题求删除点的最少个 可以使得不连通. 瞬间想到最小割 发现对于10分直接跑最小割即可. 不过想 ...
- 4.15 省选模拟赛 编码 trie树 前缀和优化建图 2-sat
好题 np. 对于20分 显然可以爆搜. 对于50分 可以发现每个字符串上的问号要么是0,要么是1.考虑枚举一个字符串当前是0还是1 这会和其他字符串产生矛盾. 所以容易 发现这是一个2-sat问题. ...
- 4.2 省选模拟赛 流浪者 容斥dp
求出期望 所有情况很好搞 C(n+m-2,n-1). 也就是说求出所有情况的和乘以上面总方案的逆元即可. 可以发现所有情况和经过多少个障碍点有关 和所处位置无关. 简单的设f[i]表示从1,1到n,m ...
- Contest Hunter 模拟赛09 C [树形dp+差分]
题面 传送门 思路 又双叒叕是一道差分题我没想出来......记录一下 首先这个"所有祖先都比自己小"等价于"父亲比自己小" 这题的基础dp方程很显然,$dp[ ...
- CSP模拟赛 Repulsed(树形DP)
题面 ⼩ w ⼼⾥的⽕焰就要被熄灭了. 简便起⻅,假设⼩ w 的内⼼是⼀棵 n − 1 条边,n 个节点的树. 现在你要在每个节点⾥放⼀些个灭⽕器,每个节点可以放任意多个. 接下来每个节点都要被分配给 ...
随机推荐
- 古有七步成诗,今有六步完成DevOps上华为云DevCloud实践
引言: 在“DevOps能力之屋(Capabilities House of DevOps)”中,华为云DevCloud提出(工程方法+最佳实践+生态)×工具平台=DevOps能力.华为云DevClo ...
- Jenkins Pipeline 部署 SpringBoot 应用
一. 安装依赖包 yum install -y wget yum install -y gcc-c++ yum install -y zlib-devel perl-ExtUtils-MakeMake ...
- 简单的MVC框架
效果图: 源码下载:https://github.com/doyoulaikeme/DotNetSample/tree/master/DotNetSample4/easyMVCFramework
- C#使用NPOI对Word文档进行导出操作的dll最新版2.5.1
Npoi导出非模板 最近使用NPOI做了个导出Word文档的功能,因为之前都是导出Excel很方便(不用模板),所以导出Word也选用了Npoi(也没有用模板,
- React-redux使用
为什么要使用react-redux 由于redux的store与组件的耦合度太高所以,我们用react官方提供的react-redux可以使两者耦合度降低,更好的实现模块化开发. react-redu ...
- CVE-2020-5902 简单复现
这几天通报了f5的一个漏洞,想着先弄个环境保存着,说不定后面就用到了.. 1.漏洞描述 近日,F5官方发布公告,修复了流量管理用户界面(TMUI)中存在的一个远程代码执行漏洞(CVE-2020-5 ...
- 终于理解Python中的迭代器和生成器了!
迭代器和生成器 目录 迭代器和生成器 可迭代对象和迭代器 基础概念 判断 for循环本质 不想用for循环迭代了,如何使用迭代器? 列表推导式 生成器Generator 概念 如何实现和使用? 生成器 ...
- 技术干货丨通过wrap malloc定位C/C++的内存泄漏问题
摘要:用C/C++开发的程序执行效率很高,但却经常受到内存泄漏的困扰.本文提供一种通过wrap malloc查找memory leak的思路. 用C/C++开发的程序执行效率很高,但却经常受到内存泄漏 ...
- CSS(五)- 背景与边框 - 边框圆角与阴影基础用法
扩展阅读 本文仅仅做border的基础使用,想要深入了解的话可以戳以下几个链接,觉得作者写的很好. CSS Backgrounds and Borders Module Level 3 CSS魔法堂: ...
- Maven 专题(七):常用命令
mvn archetype:generate : 反向生成项目的骨架 mvn clean: 清除各个模块target目录及里面的内容 mvn compile: 静态编译,根据xx.java生成xx.c ...