D题,LCA是很明显的。要注意的是,因为是除法,所以最多可以除x>2的有64次,当大于64时可以直接返回0。而且注意到可能会有很多值为1的边,可以使用路径压缩,把边为1的边压缩掉,类似于并查集的路径压缩。

之前只压缩到LCA,一直TLE,可以直接压缩到它们的根节点。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
#define LL long long
using namespace std; const int MAX=200050; int head[MAX],tot;
struct Edge{
int u,v,next;
LL w;
}edge[MAX*2];
LL w[MAX]; int pre[MAX],depth[MAX],edno[MAX],par[MAX][20];
bool vis[MAX];
queue<int>que; void addedge(int u,int v,LL w){
edge[tot].u=u;
edge[tot].v=v;
edge[tot].w=w;
edge[tot].next=head[u];
head[u]=tot++;
} int n,m; void BFS(int u){
que.push(u);
depth[u]=1;
edno[u]=0;
while(!que.empty()){
u=que.front();
vis[u]=true;
que.pop();
for(int e=head[u];e!=-1;e=edge[e].next){
int v=edge[e].v;
if(vis[v]) continue;
depth[v]=depth[u]+1;
par[v][0]=u;
if(w[edno[u]]==1){
pre[v]=pre[u];
edno[v]=edge[e].w;
}
else{
pre[v]=u;
edno[v]=edge[e].w;
}
que.push(v);
}
}
} void init(){
int i,j;
for(j=1;(1<<j)<=n;j++)
for(i=1;i<=n;i++)
if(par[i][j-1]!=-1)
par[i][j]=par[par[i][j-1]][j-1];
} int LCA(int a,int b)//最近公共祖先
{
int i,j;
if(depth[a]<depth[b])swap(a,b);
for(i=0;(1<<i)<=depth[a];i++);
i--;
//使a,b两点的深度相同
for(j=i;j>=0;j--)
if(depth[a]-(1<<j)>=depth[b])
a=par[a][j];
if(a==b)return a;
//倍增法,每次向上进深度2^j,找到最近公共祖先的子结点
for(j=i;j>=0;j--){
if(par[a][j]!=-1&&par[a][j]!=par[b][j]){
a=par[a][j];
b=par[b][j];
}
}
return par[a][0];
} LL anum[70];
LL bnum[70]; LL query(int a,int b,LL y){
int ret=(int)(log((double)y)/log(2.0));
int lca=LCA(a,b);
/// cout<<lca<<" "<<ret<<endl;
int ac=0,bc=0;
while(a!=-1&&depth[a]>depth[lca]){
//// cout<<a<<" "<<w[edno[a]]<<endl;
if(w[edno[a]]>1){
y/=w[edno[a]];
if(y==0) return 0;
}
int tp=pre[a];
while(pre[tp]!=-1&&w[edno[tp]]==1){
tp=pre[tp];
}
int rt=tp; tp=a;
while(pre[tp]!=rt){
int tmp=pre[tp];
pre[tp]=rt;
tp=tmp;
}
a=rt;
}
LL ty=y;
while(b!=-1&&depth[b]>depth[lca]){
/// cout<<b<<" "<<edno[b]<<endl;
if(w[edno[b]]>1){
ty/=w[edno[b]];
bnum[bc++]=w[edno[b]];
if(ty==0) return 0;
}
int tp=pre[b];
while(pre[tp]!=-1&&w[edno[tp]]==1){
tp=pre[tp];
}
int rt=tp; tp=b;
while(pre[tp]!=rt){
int tmp=pre[tp];
pre[tp]=rt;
tp=tmp;
}
b=rt;
}
/// cout<<ac<<" "<<bc<<endl;
/// cout<<bnum[bc-1]<<endl;
/// for(int i=0;i<ac;i++) y/=anum[i];
for(int i=bc-1;i>=0;i--) y/=bnum[i];
return y;
} int main(){
int u,v,op,a,b,p,c;
LL y;
while(scanf("%d%d",&n,&m)!=EOF){
memset(pre,-1,sizeof(pre));
memset(head,-1,sizeof(head));
memset(depth,0,sizeof(depth));
memset(vis,false,sizeof(vis));
memset(w,0,sizeof(w));
memset(par,-1,sizeof(par));
memset(edno,0,sizeof(edno));
tot=0;
for(int i=1;i<n;i++){
cin>>u>>v>>w[i];
addedge(u,v,i);
addedge(v,u,i);
}
BFS(1);
/// cout<<pre[2]<<" "<<edno[2]<<endl;
init();
for(int i=1;i<=m;i++){
scanf("%d",&op);
if(op==1){
cin>>a>>b>>y;
cout<<query(a,b,y)<<endl;
}
else{
cin>>p>>y;
w[p]=y;
}
}
}
return 0;
}

  

CF #329 D的更多相关文章

  1. CF #329 C

    C题我还以为是拉格朗日插值... 其实可以想象到,必须有这样一个函数,经过某一点时,其它圆相关的函数要为0. 于是,可以构造这样的一个函数,对于x有 (x/2)*(1-abs(t-i)+abs(1-a ...

  2. ORA-00494: enqueue [CF] held for too long (more than 900 seconds) by 'inst 1, osid 5166'

    凌晨收到同事电话,反馈应用程序访问Oracle数据库时报错,当时现场现象确认: 1. 应用程序访问不了数据库,使用SQL Developer测试发现访问不了数据库.报ORA-12570 TNS:pac ...

  3. cf之路,1,Codeforces Round #345 (Div. 2)

     cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅.....   ...

  4. cf Round 613

    A.Peter and Snow Blower(计算几何) 给定一个点和一个多边形,求出这个多边形绕这个点旋转一圈后形成的面积.保证这个点不在多边形内. 画个图能明白 这个图形是一个圆环,那么就是这个 ...

  5. ARC下OC对象和CF对象之间的桥接(bridge)

    在开发iOS应用程序时我们有时会用到Core Foundation对象简称CF,例如Core Graphics.Core Text,并且我们可能需要将CF对象和OC对象进行互相转化,我们知道,ARC环 ...

  6. [Recommendation System] 推荐系统之协同过滤(CF)算法详解和实现

    1 集体智慧和协同过滤 1.1 什么是集体智慧(社会计算)? 集体智慧 (Collective Intelligence) 并不是 Web2.0 时代特有的,只是在 Web2.0 时代,大家在 Web ...

  7. CF memsql Start[c]UP 2.0 A

    CF memsql Start[c]UP 2.0 A A. Golden System time limit per test 1 second memory limit per test 256 m ...

  8. CF memsql Start[c]UP 2.0 B

    CF memsql Start[c]UP 2.0 B B. Distributed Join time limit per test 1 second memory limit per test 25 ...

  9. CF #376 (Div. 2) C. dfs

    1.CF #376 (Div. 2)    C. Socks       dfs 2.题意:给袜子上色,使n天左右脚袜子都同样颜色. 3.总结:一开始用链表存图,一直TLE test 6 (1)如果需 ...

随机推荐

  1. Windows(7/8/10)搭建kibana 6.x版本(elasticsearch的可视化服务)

    在搭建kibana之前,我们先了解下什么是kibana Kibana 是一款开源的数据分析和可视化平台,它是 Elastic Stack 成员之一,设计用于和 Elasticsearch 协作.您可以 ...

  2. Android内存管理(6)onTrimMemory,onLowMemory,MemoryInfo()

    转自: http://www.cnblogs.com/sudawei/p/3527145.html 参考: Android Application生命周期学习 Android中如何查看内存(上) An ...

  3. 【Leetcode】92. Reverse Linked List II && 206. Reverse Linked List

    The task is reversing a list in range m to n(92) or a whole list(206). All in one : U need three poi ...

  4. [转]linux tr命令详解

    转自:http://www.cnblogs.com/huangxingkezhan/archive/2013/01/23/2874031.html 通过使用 tr,您可以非常容易地实现 sed 的许多 ...

  5. the interview questions of sql server

    1.一道SQL语句面试题,关于group by 表内容: 2005-05-09 胜 2005-05-09 胜 2005-05-09 负 2005-05-09 负 2005-05-10 胜 2005-0 ...

  6. 数字签名与数字证书以及https

    数字签名与数字证书以及httpshttps://blog.csdn.net/lzghxjt/article/details/79604602

  7. NHibernate系列学习(二)-使用sql和hql以及linq

    1.本文主要介绍了NH的三种查询方式 2.界面查看 3.代码架构 4.代码详情 namespace KimismeDemo { public partial class Form2 : Form { ...

  8. 一、CSS的基础样式

    CSS的基础样式 border 边框 复合写法 border:border-width  border-style border-color: border-width:边框宽度 top right ...

  9. Android 控制硬加速 hardwareAccelerated

    从Android3.0 (API level11)开始,Android的2D显示管道被被设计得更加支持硬加速了.硬加速使用GPU承担了所有在View的canvas上执行的绘制操作. 启用硬加速最简单的 ...

  10. Linux 信息查询

    CPU信息查看 #查看CPU型号:   $>grep 'model name' /proc/cpuinfo |uniq    model name : Intel(R) Xeon(R) CPU ...