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的更多相关文章

  1. HDU 6039 - Gear Up | 2017 Multi-University Training Contest 1

    建模简析: /* HDU 6039 - Gear Up [ 建模,线段树,图论 ] | 2017 Multi-University Training Contest 1 题意: 给你n个齿轮,有些齿轮 ...

  2. HDU 6039 Gear Up(线段树+并查集)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6039 [题目大意] 给出一些齿轮,有些齿轮是边相连,也就是拥有相同的线速度, 有的齿轮是轴相连,也 ...

  3. HDOJ 2111. Saving HDU 贪心 结构体排序

    Saving HDU Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  4. 【HDU 3037】Saving Beans Lucas定理模板

    http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...

  5. hdu 4859 海岸线 Bestcoder Round 1

    http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...

  6. HDU 4569 Special equations(取模)

    Special equations Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...

  7. HDU 4006The kth great number(K大数 +小顶堆)

    The kth great number Time Limit:1000MS     Memory Limit:65768KB     64bit IO Format:%I64d & %I64 ...

  8. HDU 1796How many integers can you find(容斥原理)

    How many integers can you find Time Limit:5000MS     Memory Limit:32768KB     64bit IO Format:%I64d ...

  9. hdu 4481 Time travel(高斯求期望)(转)

    (转)http://blog.csdn.net/u013081425/article/details/39240021 http://acm.hdu.edu.cn/showproblem.php?pi ...

随机推荐

  1. kafka安装使用配置1.2

    进入cd /usr/local/flume/conf/ vi kafka.conf 配置 agent.sources=s1 agent.channels=c1 agent.sinks=k1 agent ...

  2. js 中的 number 为何很怪异

    js 中的 number 为何很怪异 声明:需要读者对二进制有一定的了解 对于 JavaScript 开发者来说,或多或少都遇到过 js 在处理数字上的奇怪现象,比如: > 0.1 + 0.2 ...

  3. Java EE Servlet相关的两个包

    Servlet in Java EE 在Java EE的规范API中(链接),Servlet相关联的最重要的两个Package为: 1.javax.servlet 包含了一系列接口和类,他们在一个Se ...

  4. 【vue】computed 和 watch

    计算属性:computed  监听多个变量且变量是在vue实例中(依赖某个变量,变量发生改变就会触发) 侦听器:   watch        监听一个变量的变化 使用场景:watch(异步场景)  ...

  5. vue进阶:基于vue-cli创建项目(搭建手脚架)

    vue-cli安装.创建项目 基于vue-cli创建的项目进行开发 使用vue-cli图形化界面搭建项目 插件与工具 一.vue-cli简介.安装.创建项目 Vue-cli是基于Vue.js进行快速开 ...

  6. vue入门:(底层渲染实现render函数、实例生命周期)

    vue实例渲染的底层实现 vue实例生命周期 一.vue实例渲染的底层实现 1.1实例挂载 在vue中实例挂载有两种方法:第一种在实例化vue时以el属性实现,第二种是通过vue.$mount()方法 ...

  7. JS-数值转换

    JS数值转换 JS数值转换的方式有4种:Number(),parseInt(),parseFloat(),数据类型*1或者/1. 他们的区别在于: 1.Number():可以将非数值转为数值 如果是B ...

  8. MySql学习笔记【四、数据相关操作】

    CURD--增改查删 创建数据 INSERT [INTO] tb_name [(col_name,...)] VALUES(val,..) 若列名缺省,表示插入全部列,也可指定部分列名 如: INSE ...

  9. 记一次root用户在本地登录及SSH连接均遭遇permission denied的问题排查经过

    某日一位老师反映,机房的6号节点无法登录了.一开始以为是为节点防火墙配置IP白名单时忘记了加进去,但随后发现此节点并未进行白名单配置,密码也一直未有变更,于是在自己的电脑上连接,发现终端里很快显示出了 ...

  10. python学习-数据类型

    计算机处理的数据不单纯的指数字,计算机可以处理数字.文本.音频.视频等等各种数据,下面描述的是Python中可以直接使用和处理的基本数据类型.     整数 Python可以处理任意大小的整数,跟ja ...