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. 基于Centos 搭建Jenkins环境

    ⒈简介 Jenkins 是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能. ⒉Java安装 首先我们需要准备 ...

  2. P1062 数列 题解

    (题目为啥要强调用十进制输出呢,明明就是故意提醒) 分析一下样例 k=3k=3时,数列为:1,3,4,9,10,12,13..1,3,4,9,10,12,13.. 转换成三进制就是:1,10,11,1 ...

  3. 洛谷P1088 火星人

    //其实就是全排列 //我们从外星人给的那串数字往下搜索 //一直往下拓展m次 //最后输出结果 //虽然看起来很暴力,但是题目上说了m非常小 #include<bits/stdc++.h> ...

  4. Jmeter的基础使用一安装、启动、关联、断言

    一.下载Jmeter,配置环境变量 下载完解压即可, 环境变量配置: -------在环境变量中添加新变量JMETER_HOME:D:\jmeter\apache-jmeter-4.0 ------- ...

  5. TIPTOP之分割split函数方法、getIndexOf、subString、replace、临时表创建;

    范例(cnmq001): 原:每次查询都把数据全部查询到临时表后再筛选: 现:查询到临时表的时候,增加可行的筛选条件,再二次筛选临时表的数据,进行优化: 1)临时表创建: PRIVATE FUNCTI ...

  6. 【spring Boot】spring boot获取资源文件的三种方式【两种情况下】

    首先声明一点,springboot获取资源文件,需要看是 1>从spring boot默认的application.properties资源文件中获取 2>还是从自定义的资源文件中获取 带 ...

  7. 微信小程序上传图片及本地测试

    前端(.wxml) <view id="view1"> <view id="btns"> <image id="ima1 ...

  8. Linq操作之Except,Distinct,Left Join 【转】

    最近项目中用到了Linq中Except,Distinct,Left Join这几个运算,这篇简单的记录一下这几种情形. Except      基础类型使用Linq的运算很简单,下面用来计算两个集合的 ...

  9. 浅读vuex源码,了解vuex基本原理

    极简版vuex代码 class KVuex { constructor (options) { this.state = options.state this.mutations = options. ...

  10. app嵌套的vue项目更新后,页面没有更新

    记录下解决过程 1.index.html增加下面meta标签 <meta http-equiv="pragram" content="no-cache"& ...