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. 【原创】Vue项目中各种功能的实现

    已完成: 后台的管理功能: 这里用的组件是 element-UI  ====> NavMenu ◆首先是排版 : <div class="manage-page fillcont ...

  2. 虚拟机下安装VM

    Linux(CentOS 7)命令行模式安装VMware Tools 详解 [日期:2017-05-02] 来源:Linux社区  作者:Linux [字体:大 中 小] 本篇文章主要介绍了如何在Li ...

  3. Android开发之Intent.Action Android中Intent的各种常见作用

    1 Intent.ACTION_MAIN String: android.intent.action.MAIN 标识Activity为一个程序的开始.比较常用. Input:nothing Outpu ...

  4. 海量文本信息查Top-k

    问题描述: 有1千万条短信,一条一行,有重复.在5分钟之内,找出重复出现的前10条. 方案一: 1.分组进行边扫描边建散列表.建立哈希表,使用头,尾和中间随便两个字节作为Hash Code, 插入到H ...

  5. 使用A*寻路小记

    前几天做另一个DEMO 要用实现自动寻路功能,看到普遍都是A* 学习了下 我的主循环代码: isFindEndPoint = false; //主循环 do { CreateOutSkirtsNode ...

  6. js基础---object对象

    //**********************************复杂JSON举例**************************************** var Jsondata={d ...

  7. IC验证概念总结

    一份代码,在写完之后,一定要再经过一次或多次整理和打磨,才能算完成的:一份代码,一定要把其有效代码行,精简.锤炼到最少.最短.最有效,才能算完成的.   下面这些问题和回答是忘记是在哪里看到的了,参考 ...

  8. 【译】x86程序员手册17-第6章保护

    Chapter 6 Protection 第六章 保护 6.1 Why Protection? 为什么要保护? The purpose of the protection features of th ...

  9. Python标准库os

    如果你希望自己的程序能够与平台无关的话,这个模块至关重要. os.name #'nt' for windows, 'posix' for linux/unix os.getcwd() #get cur ...

  10. 初学JSP_内置对象

    out内置对象: 表单,表单常用的的提交方式