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 ...
随机推荐
- Android UI组件:布局管理器
为了更好的管理Android应用的用户界面中的组件,Android提供了布局管理器.通过使用布局管理器,Android应用的图形用户界面具有良好的平台无关性.通常,推荐使用布局管理器来管理组件的分布. ...
- TCP的粘包、半包和Netty的处理
参考文献:极客时间傅健老师的<Netty源码剖析与实战>Talk is cheap.show me the code! 什么是粘包和半包 在客户端发送数据时,实际是把数据写入到了TCP发送 ...
- python商城项目总结
项目概括 本项目用于针对Django框架的练习,主要分为前端和后端两部分.前端负责用户注册.登录.商品展示以及添加购物车和显示订单列表的功能:后端负责会员信息.商品类别.商品信息的增删改查以及订单状态 ...
- c++11 跨平台多线程demo和qt 静态链接(std::thread有join函数,设置 QMAKE_LFLAGS = -static)
#include <stdio.h>#include <stdlib.h> #include <chrono> // std::chrono::seconds#in ...
- Hinton等人最新研究:大幅提升模型准确率,标签平滑技术到底怎么用?
Hinton等人最新研究:大幅提升模型准确率,标签平滑技术到底怎么用? 2019年07月06日 19:30:55 AI科技大本营 阅读数 675 版权声明:本文为博主原创文章,遵循CC 4.0 B ...
- Asp.net core Enum as string + ef core value convertor
更新 : 2019-06-08 build in convertor https://docs.microsoft.com/en-us/ef/core/modeling/value-conversio ...
- 使用filebeat给多个logstash传输数据
1. filebeat.yml filebeat.inputs: - type: log enabled: true paths: - /var/log/messages - /var/log/dme ...
- spring-cloud 学习二 服务发现
注册中心服务发现的例子 添加module pom文件如下 <?xml version="1.0" encoding="UTF-8"?> <pr ...
- 这周末又参加班里同学生日party,同学父母包场2小时花费大约1000美金左右。
今天班上Claire的生日,邀请了几个小朋友去pump it up.特别特别开心,因为她父母选的时间特别好晚上6-8点小孩子玩疯了以后吃的特别多.
- LCN分布式事务管理(一)
前言 好久没写东西了,9月份换了份工作,一上来就忙的要死.根本没时间学东西,好在新公司的新项目里面遇到了之前没遇到过的难题.那遇到难题就要想办法解决咯,一个请求,调用两个服务,同时操作更新两个数据库. ...