洛谷P4374 [USACO18OPEN]Disruption(树链剖分+线段树)

本文介绍了一种使用树剖结合线段树技术解决特定路径修改问题的方法。通过将每条边的值赋给深度较大的节点,利用树剖和线段树进行高效路径修改,解决了原树上(u,v)路径上所有边的贡献问题。文章详细介绍了实现过程,包括代码示例,并强调了处理路径修改时的几个关键点。

传送门

 

不难发现,每一条额外修的路径,会对原树上$(u,v)$路径上的所有边产生贡献

于是这就变成了一个路径修改

那么我们把每一条边赋值到它连接的两个点中深度较大的那个上面,然后每一次用树剖+线段树做路径修改,然后再把权值取回来就行了

几个注意点:

1.记得路径修改的时候$LCA$是不需要改的

2.区间修改要打标记,统计答案之前先把标记全都放掉

3.一个小技巧就是把边从2开始存,这样双向边标号就分别是$(2,3),(4,5)...$,于是每一条双向边的标号除以二都是唯一的,就可以唯一的表示出来

 1 //minamoto
 2 #include<bits/stdc++.h>
 3 #define inf 0x3f3f3f3f
 4 using namespace std;
 5 #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
 6 char buf[1<<21],*p1=buf,*p2=buf;
 7 template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
 8 inline int read(){
 9     #define num ch-'0'
10     char ch;bool flag=0;int res;
11     while(!isdigit(ch=getc()))
12     (ch=='-')&&(flag=true);
13     for(res=num;isdigit(ch=getc());res=res*10+num);
14     (flag)&&(res=-res);
15     #undef num
16     return res;
17 }
18 char sr[1<<21],z[20];int C=-1,Z;
19 inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}
20 inline void print(int x){
21     if(C>1<<20)Ot();if(x<0)sr[++C]=45,x=-x;
22     while(z[++Z]=x%10+48,x/=10);
23     while(sr[++C]=z[Z],--Z);sr[++C]='\n';
24 }
25 const int N=50005;
26 int head[N],ver[N<<1],Next[N<<1],tot=1;
27 inline void add(int u,int v){
28     ver[++tot]=v,Next[tot]=head[u],head[u]=tot;
29 }
30 int num[N],val[N],bl[N],dfn[N],sz[N],fa[N],dep[N],son[N],top[N],cnt,n,m;
31 void dfs1(int u){
32     sz[u]=1,dep[u]=dep[fa[u]]+1;
33     for(int i=head[u];i;i=Next[i]){
34         int v=ver[i];
35         if(v!=fa[u]){
36             fa[v]=u,num[v]=i>>1,dfs1(v),sz[u]+=sz[v];
37             if(sz[son[u]]<sz[v]) son[u]=v;
38         }
39     }
40 }
41 void dfs2(int u,int t){
42     top[u]=t,dfn[u]=++cnt,bl[cnt]=u;
43     if(son[u]){
44         dfs2(son[u],t);
45         for(int i=head[u];i;i=Next[i]){
46             int v=ver[i];
47             if(v!=fa[u]&&v!=son[u]) dfs2(v,v);
48         }
49     }
50 }
51 int mn[N<<2],tag[N<<2];
52 #define ls (p<<1)
53 #define rs (p<<1|1)
54 inline void upd(int p){mn[p]=min(mn[ls],mn[rs]);}
55 inline void pd(int p){
56     if(tag[p]!=inf){
57         cmin(tag[ls],tag[p]),cmin(tag[rs],tag[p]);
58         cmin(mn[ls],tag[p]),cmin(mn[rs],tag[p]);
59         tag[p]=inf;
60     }
61 }
62 void update(int p,int l,int r,int ql,int qr,int x){
63     if(ql<=l&&qr>=r) return (void)(cmin(tag[p],x),cmin(mn[p],x));
64     int mid=(l+r)>>1;pd(p);
65     if(ql<=mid) update(ls,l,mid,ql,qr,x);
66     if(qr>mid) update(rs,mid+1,r,ql,qr,x);
67     upd(p);
68 }
69 void query(int p,int l,int r){
70     if(l==r) return (void)(val[num[bl[l]]]=mn[p]);
71     int mid=(l+r)>>1;pd(p);
72     query(ls,l,mid),query(rs,mid+1,r);
73 }
74 void change(int u,int v,int x){
75     while(top[u]!=top[v]){
76         if(dep[top[u]]<dep[top[v]]) swap(u,v);
77         update(1,1,n,dfn[top[u]],dfn[u],x);
78         u=fa[top[u]];
79     }
80     if(u==v) return;
81     if(dep[u]<dep[v]) swap(u,v);
82     update(1,1,n,dfn[son[v]],dfn[u],x);
83 }
84 int main(){
85 //    freopen("testdata.in","r",stdin);
86     n=read(),m=read();
87     for(int i=1,u,v;i<n;++i)
88     u=read(),v=read(),add(u,v),add(v,u);
89     memset(mn,0x3f,sizeof(mn)),memset(tag,0x3f,sizeof(tag));
90     dfs1(1),dfs2(1,1);
91     while(m--){
92         int u=read(),v=read(),e=read();
93         change(u,v,e);
94     }
95     query(1,1,n);
96     for(int i=1;i<n;++i) print(val[i]==inf?-1:val[i]);
97     Ot();
98     return 0;
99 }

 

转载于:https://www.cnblogs.com/bztMinamoto/p/9794778.html

源码来自:https://pan.quark.cn/s/41b9d28f0d6d 在信息技术领域中,jQuery作为一个广受欢迎的JavaScript框架,显著简化了诸多操作,包括对HTML文档的遍历、事件的管理、动画的设计以及Ajax通信等。 本篇文档将深入阐释如何运用jQuery达成一个图片自动播放的功能,这种效果常用于网站的轮播展示或幻灯片演示,有助于优化用户与页面的互动,使网页呈现更加动态的视觉体验。 为了有效实施这一功能,首先需掌握jQuery的核心操作。 通过$符号作为接口,jQuery能够迅速选取DOM组件,例如$("#id")用于选取具有特定ID的元素,而$(".class")则能选取所有应用了某类class的元素。 在选定元素之后,可以执行多种行为,诸如事件监听、样式的变更、内容的更新以及动画的制作等。 关于“一个基于jQuery的图片自动播放功能”,首要任务是准备一组图片素材,这些素材将被整合至一个容器元素之中。 例如,可以构建一个div元素,将其宽度设定为单张图片的尺寸,再借助CSS实现溢出内容的隐藏,从而构建出水平滚动的初始框架。 ```html<div id="slider"> <img src="image1.jpg" alt="Image 1"> <img src="image2.jpg" alt="Image 2"> <!-- 更多图片内容... --></div>```接着,需要编写jQuery脚本以实现图片的自动切换。 这通常涉及到定时器的运用,以设定周期性间隔自动更换当前显示的图片。 通过使用`.fadeOut()`和`.fadeIn()`方法,能够实现图片间的平滑过渡,增强视觉效果。 ```javascript$(document).re...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值