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. C#使用Parallel处理数据同步写入Datatable并使用BulkInsert批量导入数据库

    项目需要,几十万张照片需要计算出每个照片的特征值(调用C++编写的DLL). 业务流程:选择照片文件夹,分别访问照片-->调用DLL接口传递照片路径-->接收处理返回值-->写入数据 ...

  2. Educational Codeforces Round 42 (Rated for Div. 2)

    A. Equator(模拟) 找权值的中位数,直接模拟.. 代码写的好丑qwq.. #include<cstdio> #include<cstring> #include< ...

  3. python笔记之发送邮件

    发送邮件前提:开启邮箱授权码 一.开启授权码(以163邮箱为例) 1.登录163邮箱,点击设置--POP3/SMTP/IMAP,出现设置界面   2. 开启SMTP服务且可以查询SMTP的host地址 ...

  4. Typescript编译设置

    TypeScript MSBuild编译选项,用记事本打开工程文件,进行修改,如<TypeScriptGeneratesDeclarations>true</TypeScriptGe ...

  5. chrome浏览器处理本地Ajax跨域

    chrome浏览器下 项目开发过程中,用到了Ajax异步请求.若将项目放在本地服务器中,通过localhost访问文件,不会报错.若直接通过file://访问文件就会报错. 报错信息: XMLHttp ...

  6. Uncaught TypeError: str.replace is not a function

    在做审核页面时,点击审核通过按钮不执行 后来F12控制台查看发现有报错 是因为flisnullandxyzero未执行 然后找出这个方法,此方法为公共方法,将这个方法复制出来 然后使用console. ...

  7. pop的运用

    pop():弹出列表最后一个元素 练习题: num_list = [12, 45, 34,13, 100, 24, 56, 74, 109] one_list = [] two_list = [] t ...

  8. CentOS7搭建KMS服务器

    使用vlmcsd搭建KMS服务器 1.下载vlmcsd: wget https://github.com/Wind4/vlmcsd/releases/download/svn1111/binaries ...

  9. Django工程

    一.Django工程创建 1.Django安装: pip3 install django 安装成功后,会在python的安装目录下“Scripts"中生成”django-admin.exe& ...

  10. chrony配置介绍

    rhel7 文档https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/System_Adminis ...