其实呢,我也不理解这道题咋做,等以后有时间再研究研究

#include <bits/stdc++.h>
#define ll long long
#define maxn 100002
using namespace std;
void setIO(string s) {
string in=s+".in";
freopen(in.c_str(),"r",stdin);
}
struct Union {
int p[maxn];
void init() {
for(int i=0;i<maxn;++i) p[i]=i;
}
int find(int x) {
return p[x]==x?x:p[x]=find(p[x]);
}
}tr;
int n,edges,m;
ll val[maxn];
int hd[maxn],to[maxn<<1],nex[maxn<<1],fa[21][maxn],nx[400][maxn];
int dep[maxn],key[maxn];
void addedge(int u,int v) {
nex[++edges]=hd[u],hd[u]=edges,to[edges]=v;
}
void dfs(int u,int ff) {
dep[u]=dep[ff]+1, fa[0][u]=ff, nx[1][u]=ff, nx[0][u]=u;
for(int i=2;i<=m;++i) nx[i][u]=nx[i-1][ff];
for(int i=1;i<21;++i) fa[i][u]=fa[i-1][fa[i-1][u]];
for(int i=hd[u];i;i=nex[i]) {
int v=to[i];
if(v^ff) dfs(v, u);
}
}
int LCA(int x,int y) {
if(dep[x]^dep[y]) {
if(dep[x] > dep[y]) swap(x,y);
for(int i=20;i>=0;--i) if(dep[fa[i][y]]>=dep[x]) y=fa[i][y];
}
if(x==y) return x;
for(int i=20;i>=0;--i) if(fa[i][x] ^ fa[i][y]) x=fa[i][x],y=fa[i][y];
return fa[0][y];
}
int up(int x,int k) {
if(k<=m) return nx[k][x];
for(int i=20;i>=0;--i) {
if(key[i]<=k) x=fa[i][x], k-=key[i];
if(!k) break;
}
return x;
}
void modify(int x) {
if(val[x]==1) return;
val[x]=sqrt(val[x]);
if(val[x]==1) tr.p[x]=tr.find(fa[0][x]);
}
int jump(int x,int y,int f,int k) {
if(dep[y]-dep[f]>=k) return up(y,k);
return up(x,dep[x]+dep[y]-(dep[f]<<1)-k);
}
int get(int x, int k) {
if (k > m) return up(x, k);
int y = tr.find(fa[0][x]);
return up(y, (k - (dep[x] - dep[y]) % k) % k);
}
void update(int x,int y,int k) {
int f=LCA(x,y), len=dep[x]+dep[y]-(dep[f]<<1);
if(len%k) modify(y),y=jump(x,y,f,len%k),f=LCA(x,y);
while(dep[x]>=dep[f]) modify(x),x=get(x,k);
while(dep[y]>dep[f]) modify(y),y=get(y,k);
}
ll query(int x,int y,int k) {
int f=LCA(x,y),len=dep[x]+dep[y]-(dep[f]<<1);
ll res=0;
if(len%k) {
int a=len%k;
res+=val[y];
// printf("%d %d\n",dep[x]-dep[y],a);
y=jump(x,y,f,len%k);
// y=up(x,11);
f=LCA(x,y);
}
res+=(dep[x]+dep[y]-(dep[f]<<1))/k+1;
while(dep[x]>=dep[f]) res+=val[x]-1,x=get(x,k);
while(dep[y]>dep[f]) res+=val[y]-1,y=get(y,k);
return res;
}
int main() {
// setIO("input");
scanf("%d",&n),m=233;
key[0]=1;
for(int i=1;i<=22;++i) key[i]=key[i-1]*2;
for(int i=1;i<=n;++i) scanf("%lld",&val[i]);
for(int i=1;i<n;++i) {
int u,v;
scanf("%d%d",&u,&v);
addedge(u,v),addedge(v,u);
}
dfs(1,0);
for(int i=1;i<=n;++i) {
if(val[i]==1) tr.p[i]=fa[0][i];
else tr.p[i]=i;
}
int Q;
scanf("%d",&Q);
for(int i=1;i<=Q;++i) {
int op,x,y,k;
scanf("%d%d%d%d",&op,&x,&y,&k);
// printf("%d %d %d %d\n",i,op,x,y);
if(op==0) update(x,y,k);
else printf("%lld\n",query(x,y,k));
}
return 0;
}

  

luogu 4004 Hello world! 分块 + 并查集 + 乱搞的更多相关文章

  1. 洛谷P2661 信息传递 [NOIP2015] 并查集/乱搞 (待补充!

    感觉我好水啊,,,做个noip往年题目还天天只想做最简单的,,,实在太菜辽 然后最水的题目还不会正解整天想着乱搞,,,  虽然也搞出来辽233333 好滴不扯辽赶紧写完去做紫题QAQ 正解:并查集  ...

  2. BZOJ-1050 旅行comf 并查集+乱搞

    好久以前codevs上做过的,拿着改了改.. 1050: [HAOI2006]旅行comf Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2194 S ...

  3. bzoj 1050: [HAOI2006]旅行comf(codevs.cn 1001 舒适的路线) 快排+并查集乱搞

    没用的话:好像很久没发博客了,主要是懒太蒟找不到水题.我绝对没弃坑...^_^ 还用些话:本文为博主原创文章,若转载请注明原网址和作者. 进入正题: 先pa网址: bzoj :http://www.l ...

  4. AC日记——舒适的路线 codevs 1001 (并查集+乱搞)

    1001 舒适的路线 2006年  时间限制: 2 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description Z小镇是 ...

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

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

  6. [APIO2019] [LOJ 3145] 桥梁(分块+并查集)(有详细注释)

    [APIO2019] [LOJ 3145] 桥梁(分块+并查集)(有详细注释) 题面 略 分析 考试的时候就感觉子任务4是突破口,结果却写了个Kruskal重构树,然后一直想怎么在线用数据结构维护 实 ...

  7. P5443 [APIO2019]桥梁 [分块+并查集]

    分块+并查集,大板子,没了. 并查集不路径压缩,可撤销,然后暴力删除 这样对于每个块都是独立的,所以直接搞就行了. 然后块内修改操作搞掉,就是单独的了 // powered by c++11 // b ...

  8. [luogu P2170] 选学霸(并查集+dp)

    题目传送门:https://www.luogu.org/problem/show?pid=2170 题目描述 老师想从N名学生中选M人当学霸,但有K对人实力相当,如果实力相当的人中,一部分被选上,另一 ...

  9. BZOJ 1370: [Baltic2003]Gang团伙(luogu 1892)(种类并查集)

    题面: bzoj题面有误,还是看luogu的吧 https://www.luogu.org/problemnew/show/P1892 题解: 种类并查集.. 因为有敌人的敌人是朋友这个条件,所以需要 ...

随机推荐

  1. CSS3——盒子模型 border(边框) 轮廓(outline)属性 margin外边距 padding填充

    盒子模型 包括——边距,边框,填充,和实际内容 Margin(外边距) - 清除边框外的区域,外边距是透明的. Border(边框) - 围绕在内边距和内容外的边框. Padding(内边距) - 清 ...

  2. Xpath素材

    from lxml import etree text = """ <div> <ul> <li class="item-0&qu ...

  3. [Web 前端] 028 jQuery 事件

    目录 jQuery 的事件 1. 事件绑定 1.1 事件的获取 1.2 基本绑定 1.3 动态绑定 2. 事件触发 2.1 触发的写法 2.2 常用的鼠标事件 3. 事件冒泡和默认行为 3.1 事件冒 ...

  4. 【Linux内核】编译与配置内核(arm)

    ARM平台使用的内核 (1)清除原有的配置与中间文件 make distclean(2)配置内核 make menuconfig ARCH=arm(3)编译内核 make uImage ARCH=ar ...

  5. mysql(5.6及以下)解析json

    转自:https://blog.csdn.net/weixin_33979203/article/details/87621768 #json解析函数 DELIMITER $$ DROP FUNCTI ...

  6. HDU1181 题解(Floyd最短路)

    题面: 变形课 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) Total Subm ...

  7. [LeetCode] 132. 分割回文串 II

    题目链接 : https://leetcode-cn.com/problems/palindrome-partitioning-ii/ 题目描述: 给定一个字符串 s,将 s 分割成一些子串,使每个子 ...

  8. 工作日记之查看Linux系统里面的启动频率2017_02_07

    链接:http://www.jb51.net/LINUXjishu/19905.html 查看Linux里面的batch: cat /etc/crontab (1)0 19 * * 6 root /d ...

  9. Paper Reading_Distributed System

    最近(以及预感接下来的一年)会读很多很多的paper......不如开个帖子记录一下读paper心得 Mark一个上海交通大学东岳网络工作室的paper notebook Mark一个大神的笔记 Ed ...

  10. j网络爬虫之WebMagic

    WebMagic官网:http://webmagic.io/ 注意: 1.在自定义PageProcessor中使用System.out.println(“str”),Spider.create(new ...