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 ...
随机推荐
- 查询统计SQL分组求和使用小技巧
我们在做查询统计时,肯定会遇到将查询结果再次分组求和这种需求,但是往往查询的sql本身就比较复杂,再使用分组函数不太可能,那么这时候我们就想到了用临时表的办法,通过联合临时表我们就可以获得想要的分组求 ...
- linux 查找大文件
查看磁盘使用情况:df -h [root@iZwz9gs2zseivevv1k5vnkZ /]# df -h Filesystem Size Used Avail Use% Mounted on /d ...
- docker-Overlay原生网络
节点1/键值存储:192.168.50.130 :192.168.50.131 1.下载Consul二进制包并启动 wget https://releases.hashicorp.com/consul ...
- MySQL的简介、启动及其DDL
MySQL的各项配置: 默认会启用TCP/IP网络: 默认客户端/服务器端口:3306: 将数据库的BIN目录写入Windows的的path环境变量: 默认不允许root用户在其他机器上远程登录: M ...
- 《深入实践C++模板编程》之二——模板类
1.类的模板的使用 类,由于没有参数,所以没有模板实参推导机制. #include <stdexcept> template<typename T> class my_stac ...
- bash 中的 :=、=、:-、-、=?、?、:+、+
bash 中的 :=.=.:-.-.=?.?.:+.+ 来源 https://www.cnblogs.com/fhefh/archive/2011/04/22/2024750.html 变量替换和变量 ...
- URL的 ? 和 # (hash),如何将参数保存在URL中,用于刷新获取之前的变量?
URL中会带上参数,假如是?开头的,那这个是会被加入到ajax请求中的,#(hash)相当于书签锚点,用于定位页面,不会加入到ajax请求中,所以有些时候,我们可以把一些参数放在#后面 如何获取URL ...
- Centos搭建hexo教程
hexo文档:https://hexo.io/zh-cn/ 1.安装Git # sudo yum install git-core// 查看版本# git version// 输出git versio ...
- Oracle 11.2.0.1 ADG环境MRP进程遭遇ORA
环境:Linux + Oracle 11.2.0.1 ADG现象:发现备库没有应用日志 1. 数据库查询备库目前状态发现备库目前没有应用日志,apply lag已经显示备库有3天21小时多没有应用日志 ...
- 安装grafna已经grafna对接zabbix
安装插件 grafana-cli plugins install alexanderzobnin-zabbix-app 重启grafna systemctl restart grafana-serve ...