传送门

虽然洛谷数据水,然而咱最终还是没有卡过uoj上的毒瘤数据……

神tm全uoj就3个人过了这题……

首先,每个数最多被开根\(6\)次,开到\(1\)之后就别管它了,把它用并查集连到它父亲上

它每次要走\(k\)步,我们可以对\(k\)分类讨论,如果\(k\)比较大就直接暴力跳,否则建\(k\)棵树,每次树剖+线段树维护

然而我只会暴力跳了……

//minamoto
#include<bits/stdc++.h>
#define R register
#define ll long long
#pragma GCC optimize(3)
#define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
inline void swap(R int &x,R int &y){x^=y^=x^=y;}
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
ll read(){
R ll res,f=1;R char ch;
while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
return res*f;
}
char sr[1<<21],z[20];int C=-1,Z=0;
inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}
void print(R ll x){
if(C>1<<20)Ot();if(x<0)sr[++C]='-',x=-x;
while(z[++Z]=x%10+48,x/=10);
while(sr[++C]=z[Z],--Z);sr[++C]='\n';
}
const int N=1e5+5,S=655;
struct eg{int v,nx;}e[N<<1];int head[N],tot;
inline void add(R int u,R int v){e[++tot]={v,head[u]},head[u]=tot;}
ll a[N],ans;int ga[N],fa[N],fat[N][25],jp[N][S],dep[N],son[N],sz[N],top[N];
int n,s,m,u,v,op,k;
int find(R int x){return ga[x]==x?x:ga[x]=find(ga[x]);}
void dfs1(int u,int f){
sz[u]=1,dep[u]=dep[f]+1,fa[u]=fat[u][0]=jp[u][1]=f;
jp[u][0]=u;
fp(i,1,18)fat[u][i]=fat[fat[u][i-1]][i-1];
fp(i,2,s)jp[u][i]=jp[f][i-1];
go(u)if(v!=f){
dfs1(v,u),sz[u]+=sz[v];
if(sz[v]>sz[son[u]])son[u]=v;
}
}
void dfs2(int u,int t){
top[u]=t;if(!son[u])return;
dfs2(son[u],t);
go(u)if(!top[v])dfs2(v,v);
}
int LCA(R int u,R int v){
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]])swap(u,v);
u=fa[top[u]];
}return dep[u]<dep[v]?u:v;
}
struct query{
int md[N],len[N],top[N],son[N],hi[N];
vector<int>U[N],D[N];
void dfs1(int u,int fa){
md[u]=dep[u];
go(u)if(v!=fa){
dfs1(v,u);
if(md[v]>md[son[u]])son[u]=v,md[u]=md[v];
}
}
void dfs2(int u,int t){
top[u]=t,len[u]=md[u]-dep[t]+1;
if(!son[u])return;
dfs2(son[u],t);
go(u)if(!top[v])dfs2(v,v);
}
void init(){
dfs1(1,0),dfs2(1,1);
int now=0;
fp(i,1,n){
if(!(i>>now&1))++now;
hi[i]=now;
}
fp(i,1,n)if(i==top[i]){
for(R int j=1,u=i;j<=len[i]&&u;++j)u=fa[u],U[i].push_back(u);
for(R int j=1,u=i;j<=len[i]&&u;++j)u=son[u],D[i].push_back(u);
}
}
int Fa(int u,int k){
if(k>dep[u])return 0;if(!k)return u;
u=fat[u][hi[k]],k^=(1<<hi[k]);
if(!k)return u;
if(dep[u]-dep[top[u]]==k)return top[u];
if(k>dep[u]-dep[top[u]])return U[top[u]][k-dep[u]+dep[top[u]]-1];
return D[top[u]][dep[u]-dep[top[u]]-k-1];
}
}qwq;
void upd(R int u){
if(a[u]==1)return;
a[u]=sqrt(a[u]);
if(a[u]==1)ga[u]=find(fa[u]);
}
int pos(int u,int v,int lca,int k){
if(dep[v]-dep[lca]>=k)return qwq.Fa(v,k);
k-=dep[v]-dep[lca];
return qwq.Fa(u,dep[u]-dep[lca]-k);
}
int jump(int u,int k){
if(k>s)return qwq.Fa(u,k);
int v=find(fa[u]),d=(dep[u]-dep[v])%k;
if(d)d=k-d;
return jp[v][d];
}
void update(int u,int v,int k){
if(u==v)return upd(u);
int lca=LCA(u,v),dis=dep[u]+dep[v]-(dep[lca]<<1);
if(dis<=k)return upd(u),upd(v);
if(dis%k)upd(v),v=pos(u,v,lca,dis%k),lca=LCA(u,v);
while(dep[u]>=dep[lca])upd(u),u=jump(u,k);
while(dep[v]>dep[lca])upd(v),v=jump(v,k);
}
void query(int u,int v,int k){
if(u==v)return ans=a[u],void();
int lca=LCA(u,v),dis=dep[u]+dep[v]-(dep[lca]<<1);
if(dis<=k)return ans=a[u]+a[v],void();
if(dis%k)ans+=a[v],v=pos(u,v,lca,dis%k),lca=LCA(u,v);
ans+=(dep[u]+dep[v]-(dep[lca]<<1))/k+1;
while(dep[u]>=dep[lca])ans+=a[u]-1,u=jump(u,k);
while(dep[v]>dep[lca])ans+=a[v]-1,v=jump(v,k);
}
int main(){
// freopen("testdata.in","r",stdin);
n=read();
fp(i,1,n)a[i]=read(),ga[i]=i;
fp(i,1,n-1)u=read(),v=read(),add(u,v),add(v,u);
m=read(),s=500;
dfs1(1,0),dfs2(1,1),qwq.init();
fp(i,1,n)if(a[i]==1)ga[i]=find(fa[i]);
while(m--){
op=read(),u=read(),v=read(),k=read();
if(op==1){
ans=0,query(u,v,k),print(ans);
}else update(u,v,k);
}
return Ot(),0;
}

洛谷P4004 Hello world!(分块+并查集)的更多相关文章

  1. 洛谷P3247 最小公倍数 [HNOI2016] 分块+并查集

    正解:分块+并查集 解题报告: 传送门! 真的好神仙昂QAQ,,,完全想不出来,,,还是太菜了QAQ 首先还是要说下,这题可以用K-D Tree乱搞过去(数据结构是个好东西昂,,,要多学学QAQ),但 ...

  2. Bzoj1015/洛谷P1197 [JSOI2008]星球大战(并查集)

    题面 Bzoj 洛谷 题解 考虑离线做法,逆序处理,一个一个星球的加入.用并查集维护一下连通性就好了. 具体来说,先将被消灭的星球储存下来,先将没有被消灭的星球用并查集并在一起,这样做可以路径压缩,然 ...

  3. 洛谷1525 关押罪犯NOIP2010 并查集

    问题描述 S城现有两座监狱,一共关押着N名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨气值”(一个正整数值)来表示某两 ...

  4. 洛谷P1525 关押罪犯(并查集、二分图判定)

    本人蒟蒻,只能靠题解AC,看到大佬们的解题思路,%%%%%% https://www.luogu.org/problemnew/show/P1525 题目描述 S城现有两座监狱,一共关押着N名罪犯,编 ...

  5. 洛谷 P2661 信息传递 Label:并查集||强联通分量

    题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的生日.之后每一 ...

  6. 洛谷 P1111 修复公路 Label:并查集

    题目背景 A地区在地震过后,连接所有村庄的公路都造成了损坏而无法通车.政府派人修复这些公路. 题目描述 给出A地区的村庄数N,和公路数M,公路是双向的.并告诉你每条公路的连着哪两个村庄,并告诉你什么时 ...

  7. 洛谷P3367 【模板】并查集

    P3367 [模板]并查集 293通过 551提交 题目提供者HansBug 标签 难度普及- 提交  讨论  题解 最新讨论 不知道哪错了 为啥通不过最后三个节点 题解 不懂为什么MLE 最后一个数 ...

  8. 洛谷 P3367 【模板】并查集

    P3367 [模板]并查集 题目描述 如题,现在有一个并查集,你需要完成合并和查询操作. 输入输出格式 输入格式: 第一行包含两个整数N.M,表示共有N个元素和M个操作. 接下来M行,每行包含三个整数 ...

  9. 洛谷P4092 [HEOI2016/TJOI2016]树 并查集/树链剖分+线段树

    正解:并查集/树链剖分+线段树 解题报告: 传送门 感觉并查集的那个方法挺妙的,,,刚好又要复习下树剖了,所以就写个题解好了QwQ 首先说下并查集的方法趴QwQ 首先离线,读入所有操作,然后dfs遍历 ...

  10. 洛谷P1955 程序自动分析 [NOI2015] 并查集

    正解:并查集+离散化 解题报告: 传送门! 其实题目还挺水的,,,但我太傻逼了直接想挂了,,,所以感觉还是有个小坑点所以还是写个题解记录下我的傻逼QAQ 首先这题一看,就长得很像NOIp关押罪犯?然后 ...

随机推荐

  1. 服务器安装tensorflow导入模块报错Illegal instruction (core dumped)

    在ubuntu上安装tensorflow后导入模块显示Illegal instruction (core dumped) 服务器的版本是Ubuntu 16.04.5 降低版本,成功导入模块 pip3 ...

  2. python 安装coreml

    2.安装pip,  下载get-pip.py, https://bootstrap.pypa.io/get-pip.py,然后Python 这个文件,如果没有权限就加sudo 3.安装coreml:这 ...

  3. python循环次数的使用

    a=[str(i) for i in range(88888,88912)] b=[str(i) for i in range(77777,77785)] def f(a,b,k=0,m=0): n= ...

  4. DenseNet算法详解——思路就是highway,DneseNet在训练时十分消耗内存

    论文笔记:Densely Connected Convolutional Networks(DenseNet模型详解) 2017年09月28日 11:58:49 阅读数:1814 [ 转载自http: ...

  5. 局域网扫描IP

    今天有朋友去面试,被问到一个“如何扫描局域网IP”的问题(即找出局域网中当前已使用的IP),朋友回答的不好,回来问我,我首先想到的就是使用ping命令将局域网可分配的IP地址逐个遍历一遍,能ping通 ...

  6. vim 编辑器IDE版

    wget https://raw.github.com/ma6174/vim/master/setup.sh -O ma6174_vim_setup.sh && bash ma6174 ...

  7. AtCoder Beginner Contest 102

    A - Multiple of 2 and N Time Limit: 2 sec / Memory Limit: 1024 MB Score : 100100 points Problem Stat ...

  8. 1080 Graduate Admission (30)(30 分)

    It is said that in 2013, there were about 100 graduate schools ready to proceed over 40,000 applicat ...

  9. BZOJ 1567: [JSOI2008]Blue Mary的战役地图

    1567: [JSOI2008]Blue Mary的战役地图 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1011  Solved: 578[Sub ...

  10. windwos 10 谷歌浏览器出现彩色闪条

    应该是上个星期五开始,发现电脑从别的地方切换到谷歌浏览器就会出现闪条,开始也没太注意,但是到周一还是这样,所以再网上查了下, 说什么的都有,什么你按脑屏幕坏了,内存条不行什么是的.后来才发现原来是谷歌 ...