hdu 6039 Gear Up
题
OvO http://acm.hdu.edu.cn/showproblem.php?pid=6039
(2017 Multi-University Training Contest 1 1007)
解
诶嘿嘿 终于过了
我还以为像我这么菜过这题要用很久呢
结果真的用了很久……淦。
用wi代表i的角速度,ri代表i的角度,则共享线速度的两个齿轮x,y的角速度满足log2(wx)+log2(rx)==log2(wy)+log2(ry)
必然是要对这些齿轮建树的,最后建出来一个森林,然后每个森林取根节点为对照,则整棵树的速度都可以以此为参照用上面那个等式推导出来
然后把节点分2类,一类是他有父亲的(树中,这个节点的上方,有齿轮和他共享线速度),一类是他没父亲的(树中,这个节点的上方,没有齿轮),前者和后者修改半径的话,对子树的影响是不一样的。
1.修改前者的半径话,他共轴的节点为根的子树以及他本身的角速度会发生改变
2.后者的话,以他为根的子树(不包括他)角速度会发生改变
之后就是按DFS序建一颗线段树(区间最值)
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector> #define log2(x) log(x)/log(2)
#define pow2(x) pow(2,x) using namespace std; const int M=1e5+44; struct Edge
{
int u,v,d;
}; int n,m,q,r[M];
int fa[M];
int l1[M],r1[M],l2[M],r2[M];
int init_val[M];
int now;
int frt[M],chg[M];
vector<int> v[M];
vector<Edge> edge[M]; int tree[M*3],tag[M*3]; void build(int rt,int li,int ri)
{
tag[rt]=0;
if(li==ri)
{
tree[rt]=init_val[ri];
return ;
}
int mid=(li+ri)>>1,lc=(rt<<1),rc=(rt<<1)+1;
build(lc,li,mid);
build(rc,mid+1,ri);
tree[rt]=max(tree[lc],tree[rc]);
} void pushdown(int rt,int li,int ri)
{
if(li==ri)
{
tag[rt]=0;
return ;
}
int mid=(li+ri)>>1,lc=(rt<<1),rc=(rt<<1)+1;
tree[lc]+=tag[rt];
tree[rc]+=tag[rt];
tag[lc]+=tag[rt];
tag[rc]+=tag[rt];
tag[rt]=0;
} void update(int rt,int li,int ri,int lq,int rq,int val) //add
{
if(lq<=li && ri<=rq)
{
tag[rt]+=val;
tree[rt]+=val;
return ;
}
int mid=(li+ri)>>1,lc=(rt<<1),rc=(rt<<1)+1;
if(tag[rt])
pushdown(rt,li,ri);
if(mid>=lq)
update(lc,li,mid,lq,rq,val);
if(mid+1<=rq)
update(rc,mid+1,ri,lq,rq,val);
tree[rt]=max(tree[lc],tree[rc]);
} int query(int rt,int li,int ri,int lq,int rq) //get max
{
int ret=-1e9-7;
if(lq<=li && ri<=rq)
return tree[rt];
int mid=(li+ri)>>1,lc=(rt<<1),rc=(rt<<1)+1;
if(tag[rt])
pushdown(rt,li,ri);
if(mid>=lq)
ret=max(ret,query(lc,li,mid,lq,rq));
if(mid+1<=rq)
ret=max(ret,query(rc,mid+1,ri,lq,rq));
return ret;
} int fff(int x)
{
if(fa[x]==x)
return x;
fa[x]=fff(fa[x]);
return fa[x];
} void init()
{
int i,j;
now=0;
for(i=1;i<=n;i++)
{
l2[i]=1e9+7;
r2[i]=0;
edge[i].clear();
v[i].clear();
fa[i]=i;
}
memset(frt,0,(n+4)*sizeof(int));
memset(chg,0,(n+4)*sizeof(int));
} void dfs(int rt,int pa,int dis,int root)
{
int i,j,uu,vv,dd;
l1[rt]=++now+1;
frt[rt]=root;
init_val[now]=dis;
for(i=0;i<edge[rt].size();i++)
{
uu=edge[rt][i].u; vv=edge[rt][i].v; dd=edge[rt][i].d;
if(vv==pa)
{
chg[uu]=1;
continue;
}
l2[uu]=min(l2[uu],now+1);
// cout<<uu<<' '<<vv<<' '<<dd<<endl;
dfs(vv,rt,dis+dd,root);
r2[uu]=max(r2[uu],now);
}
r1[rt]=now;
} int main()
{
// freopen("数据//1007.in","r",stdin);
// freopen("数据//1007my.out","w",stdout);
int i,j,typ,a,b,cas=0,pa,pb;
while(scanf("%d%d%d",&n,&m,&q)!=EOF)
{
init();
for(i=1;i<=n;i++)
{
scanf("%d",&r[i]);
r[i]=log2(r[i]);
}
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&typ,&a,&b);
if(typ==1)
{
v[a].push_back(b);
v[b].push_back(a);
}
else
fa[fff(a)]=fff(b);
}
for(i=1;i<=n;i++)
for(j=0;j<v[i].size();j++)
edge[fff(i)].push_back(Edge{i,fff(v[i][j]),r[i]-r[v[i][j]]});
for(i=1;i<=n;i++)
if(fa[i]==i && frt[i]==0)
dfs(i,-1,0,i);
build(1,1,now);
// for(i=1;i<=n;i++)
// printf("%d %d - %d %d %d %d - %d\n",frt[i],chg[i],l1[i],r1[i],l2[i],r2[i],init_val[i]);
printf("Case #%d:\n",++cas);
while(q--)
{
scanf("%d%d%d",&typ,&a,&b);
if(typ==1)
{
b=log2(b);
pa=fff(a);
if(chg[a])
{
if(l1[pa]-1<=r1[pa])
update(1,1,now,l1[pa]-1,r1[pa],+r[a]-b);
if(l2[a]<=r2[a])
update(1,1,now,l2[a],r2[a],-(+r[a]-b));
}
else
{
if(l2[a]<=r2[a])
update(1,1,now,l2[a],r2[a],-r[a]+b);
}
r[a]=b;
}
else
{
pa=fff(a);
double ans=1.0*query(1,1,now,l1[frt[pa]]-1,r1[frt[pa]])-query(1,1,now,l1[pa]-1,l1[pa]-1)+log2(b);
printf("%.3lf\n",ans*log(2));
}
}
}
return 0;
}
hdu 6039 Gear Up的更多相关文章
- HDU 6039 - Gear Up | 2017 Multi-University Training Contest 1
建模简析: /* HDU 6039 - Gear Up [ 建模,线段树,图论 ] | 2017 Multi-University Training Contest 1 题意: 给你n个齿轮,有些齿轮 ...
- HDU 6039 Gear Up(线段树+并查集)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6039 [题目大意] 给出一些齿轮,有些齿轮是边相连,也就是拥有相同的线速度, 有的齿轮是轴相连,也 ...
- HDOJ 2111. Saving HDU 贪心 结构体排序
Saving HDU Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 【HDU 3037】Saving Beans Lucas定理模板
http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...
- hdu 4859 海岸线 Bestcoder Round 1
http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...
- HDU 4569 Special equations(取模)
Special equations Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u S ...
- HDU 4006The kth great number(K大数 +小顶堆)
The kth great number Time Limit:1000MS Memory Limit:65768KB 64bit IO Format:%I64d & %I64 ...
- HDU 1796How many integers can you find(容斥原理)
How many integers can you find Time Limit:5000MS Memory Limit:32768KB 64bit IO Format:%I64d ...
- hdu 4481 Time travel(高斯求期望)(转)
(转)http://blog.csdn.net/u013081425/article/details/39240021 http://acm.hdu.edu.cn/showproblem.php?pi ...
随机推荐
- Hadoop集群搭建-03编译安装hadoop
Hadoop集群搭建-05安装配置YARN Hadoop集群搭建-04安装配置HDFS Hadoop集群搭建-03编译安装hadoop Hadoop集群搭建-02安装配置Zookeeper Hado ...
- Navicat远程无法创建数据库
Navicat远程无法创建数据库 提示报错信息如下,说明是用户创建的权限不足. Error Code: 1044. Access denied for user 'root'@'%' to datab ...
- matplotlib库的基本使用与折线图
matplotlib:最流行的Python底层绘图库,主要做数据可视化图表,名字取材于MATLAB,模仿MATLAB构建 基本使用: x和y的长度必须一致 figure()方法用来设置图片大小 x,y ...
- linux下selenium+phantomjs环境
# 安装依赖软件yum -y install wget fontconfig # 下载PhantomJSwget -P /tmp/ https://bitbucket.org/ariya/phanto ...
- Elastic Search中mapping的问题
Mapping在ES中是非常重要的一个概念.决定了一个index中的field使用什么数据格式存储,使用什么分词器解析,是否有子字段,是否需要copy to其他字段等.Mapping决定了index中 ...
- T100——取得系统参数值,如关帐日期
CALL cl_get_para(g_enterprise,g_site,'S-MFG-0031') RETURNING l_para_data 用此方法获取关帐日期
- 服务端相关知识学习(五)之Zookeeper leader选举
在上一篇文章中我们大致浏览了zookeeper的启动过程,并且提到在Zookeeper的启动过程中leader选举是非常重要而且最复杂的一个环节.那么什么是leader选举呢?zookeeper为什么 ...
- Yali7月集训Contest2 T1 Cube 题解
题目链接: 连我们都只有纸质题目...话说雅礼集训都是这样的吗... 大意 0维基本图形是一个点 1维基本图形是一条线段 2维基本图形是一个正方形 3维基本图形是一个正方体 4维基本图形是... 求\ ...
- Angular 开发环境搭建
Angular 是一款开源 JavaScript 框架,由Google 维护,用来协助单一页面应用程序运行的.它的目标是增强基于浏览器的应用,使开发和测试变得更加容易.目前最新的 Angular 版本 ...
- java_day02_标识符等
ch02 目标: 1. 标识符.关键字和类型介绍 2. 如何构建类---------------------------------1.注释 作用:使部分内容只为程序员可见,不为编译器所编译.虚拟机所 ...