2021牛客暑期多校训练营3 G-Yu Ling(Ling YueZheng) and Colorful Tree(cdq分治)

G-Yu Ling(Ling YueZheng) and Colorful Tree

HOWARLI题解

大致做法就是首先考虑哪些修改可能影响询问,当修改点权是询问的倍数时才可能影响询问。于是考虑把他们放在一起。

首先每次枚举每种询问的倍数,把这些修改和当前询问放在一起,由于每次考虑的是该点到根节点路径上的点,对于每个点的点权的修改仅仅影响的子树节点的询问。于是将单点修改→\to子树修改,链询问→\to单点询问。

于是每次修改转化成[dfnu,dfnu+szu−1][\text{dfn}_u,\text{dfn}_u+\text{sz}_u-1][dfnu,dfnu+szu1]添加一个[x,disu][x,\text{dis}_u][x,disu]即可以表示成插入{id,dfnu→dfnu+szu−1,x}=disu\{\text{id},\text{dfn}_u \to \text{dfn}_u+\text{sz}_u-1,x\} = \text{dis}_u{id,dfnudfnu+szu1,x}=disu

于是询问的问题转化成dfnu\text{dfn}_udfnu处询问[[l,r],max⁡{disu}][[l,r],\max\{\text{dis}_u\}][[l,r],max{disu}]可以表示成询问max⁡{{id,dfnu,l→r}=dis}\max\{\{\text{id},\text{dfn}_u,l\to r\}=\text{dis}\}max{{id,dfnu,lr}=dis}

现在相当于有三维[id,dfn,val][\text{id},\text{dfn},\text{val}][id,dfn,val],即空间上的一个点,点权是dis\text{dis}dis,显然可以树套树或者cdq分治。

分析一下就可以知道上述求的max⁡dis\max \text{dis}maxdis一定是离uuu最近的。
下面代码用cdq分治。不过wtcl还没调出来~~

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
template <class T=int> T rd()
{T res=0;T fg=1;char ch=getchar();while(!isdigit(ch)) {if(ch=='-') fg=-1;ch=getchar();}while( isdigit(ch)) res=(res<<1)+(res<<3)+(ch^48),ch=getchar();return res*fg;
}
const int N=110005;
int h[N],e[2*N],ne[2*N],idx;
ll w[2*N];
void add(int a,int b,ll c){e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;}int n,m;
struct node1
{int op,u,x;int l,r;
}q[N];
struct node2
{int op,id;int t,l,r;ll x;
}q0[N<<1];
int dfn[N],timestamp;
ll dis[N];
int sz[N];
void dfs(int u,int fa)
{dfn[u]=++timestamp;sz[u]=1;for(int i=h[u];i!=-1;i=ne[i]){int v=e[i];if(v==fa) continue;dis[v]=dis[u]+w[i];dfs(v,u);sz[u]+=sz[v];}
}
vector<int> V0[N],V1[N];
ll v[N<<2];
ll ans[N];
void modify(int u,int l,int r,int pos,ll x)
{if(l==r) return v[u]=x,void();int mid=l+r>>1;if(pos<=mid) modify(u<<1,l,mid,pos,x);else   modify(u<<1|1,mid+1,r,pos,x);v[u]=max(v[u<<1],v[u<<1|1]);
}
ll query(int u,int l,int r,int L,int R)
{if(L<=l&&r<=R) return v[u];int mid=l+r>>1;ll c=-1;if(L<=mid) c=max(c,query(u<<1,l,mid,L,R));if(R>mid)c=max(c,query(u<<1|1,mid+1,r,L,R));return c;
}
void solve(int l,int r)
{if(l>=r) return;int mid=l+r>>1;solve(l,mid),solve(mid+1,r);int i=l;for(int j=mid+1;j<=r;j++){while(i<=mid&&q0[i].t<=q0[j].t){if(q0[i].op==0) modify(1,1,n,q0[i].l,q0[i].x);i++;}if(q0[j].op==1) ans[q0[j].id]=max(ans[q0[j].id],query(1,1,n,q0[j].l,q0[j].r));}while(i>l) {--i;if(q0[i].op==0) modify(1,1,n,q0[i].l,-1);}inplace_merge(q0+l,q0+mid+1,q0+r+1,[](const node2&a,const node2&b){return a.t<b.t;});
}
int main()
{n=rd(),m=rd();memset(h,-1,sizeof h);memset(v,-1,sizeof v);memset(ans,-1,sizeof ans);for(int i=1;i<n;i++) {int u=rd(),v=rd(),c=rd();add(u,v,c),add(v,u,c);}for(int i=1;i<=m;i++){q[i].op=rd();q[i].u=rd();if(q[i].op) {q[i].l=rd(),q[i].r=rd(),q[i].x=rd();V1[q[i].x].push_back(i);}else {q[i].x=rd();V0[q[i].x].push_back(i);}}dfs(1,0);int cnt;for(int i=1;i<=n;i++){if(V1[i].empty()) continue;cnt=0;for(int j=i;j<=n;j+=i){for(int k:V0[j]){int u=q[k].u;q0[++cnt]={0,k,dfn[u],j,j,dis[u]};q0[++cnt]={0,k,dfn[u]+sz[u],j,j,-1};}}if(!cnt) continue;for(int k:V1[i]){int u=q[k].u,l=q[k].l,r=q[k].r;q0[++cnt]={1,k,dfn[u],l,r};}sort(q0+1,q0+1+cnt,[](const node2& a,const node2 &b){return a.id<b.id||a.id==b.id&&a.op<b.op;});solve(1,cnt);}for(int i=1;i<=m;i++){if(q[i].op==0) continue;if(ans[i]==-1)puts("Impossible!");elseprintf("%lld\n",dis[q[i].u]-ans[i]);}
}

上面代码有大问题

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
template <class T=int> T rd()
{T res=0;T fg=1;char ch=getchar();while(!isdigit(ch)) {if(ch=='-') fg=-1;ch=getchar();}while( isdigit(ch)) res=(res<<1)+(res<<3)+(ch^48),ch=getchar();return res*fg;
}
const int N=110005;
int h[N],e[2*N],ne[2*N],idx;
ll w[2*N];
void add(int a,int b,ll c){e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;}int n,m;
struct node1
{int op,u,x;int l,r;
}q[N];
struct node2
{int op,id;int t,l,r;ll x;
}q0[N<<1];
int dfn[N],timestamp;
ll dis[N];
int sz[N];
void dfs(int u,int fa)
{dfn[u]=++timestamp;sz[u]=1;for(int i=h[u];i!=-1;i=ne[i]){int v=e[i];if(v==fa) continue;dis[v]=dis[u]+w[i];dfs(v,u);sz[u]+=sz[v];}
}
vector<int> V0[N],V1[N];
ll v[N<<2];
ll ans[N];
void modify(int u,int l,int r,int pos,ll x)
{if(l==r) return v[u]=x,void();int mid=l+r>>1;if(pos<=mid) modify(u<<1,l,mid,pos,x);else   modify(u<<1|1,mid+1,r,pos,x);v[u]=max(v[u<<1],v[u<<1|1]);
}
ll query(int u,int l,int r,int L,int R)
{if(L<=l&&r<=R) return v[u];int mid=l+r>>1;ll c=-1;if(L<=mid) c=max(c,query(u<<1,l,mid,L,R));if(R>mid)c=max(c,query(u<<1|1,mid+1,r,L,R));return c;
}struct node3
{int id;ll v;node3(){}node3(int id,ll v):id(id),v(v){}bool operator<(const node3&o)const{return v>o.v||v==o.v&&id<o.id;}
};
multiset<node3> mp[N];
multiset<node3>::iterator it;
void solve(int l,int r)
{if(l>=r) return;int mid=l+r>>1;solve(l,mid),solve(mid+1,r);int i=l;for(int j=mid+1;j<=r;j++){while(i<=mid&&q0[i].t<=q0[j].t){if(q0[i].op==0) {if(q0[i].x<0) {it=mp[q0[i].r].find(node3(q0[i].t-q0[i].l,-q0[i].x));if(it!=mp[q0[i].r].end()) mp[q0[i].r].erase(it);}elsemp[q0[i].r].insert(node3(q0[i].t,q0[i].x));if(mp[q0[i].r].size()) modify(1,1,n,q0[i].r,mp[q0[i].r].begin()->v);elsemodify(1,1,n,q0[i].r,-1);}i++;}if(q0[j].op==1) ans[q0[j].id]=max(ans[q0[j].id],query(1,1,n,q0[j].l,q0[j].r));}while(i>l) {--i;if(q0[i].op==0){modify(1,1,n,q0[i].r,-1);mp[q0[i].r].clear();}}inplace_merge(q0+l,q0+mid+1,q0+r+1,[](const node2&a,const node2&b){return a.t<b.t;});
}
int main()
{n=rd(),m=rd();memset(h,-1,sizeof h);memset(v,-1,sizeof v);memset(ans,-1,sizeof ans);for(int i=1;i<n;i++) {int u=rd(),v=rd(),c=rd();add(u,v,c),add(v,u,c);}for(int i=1;i<=m;i++){q[i].op=rd();q[i].u=rd();if(q[i].op) {q[i].l=rd(),q[i].r=rd(),q[i].x=rd();V1[q[i].x].push_back(i);}else {q[i].x=rd();V0[q[i].x].push_back(i);}}dis[1]=1;dfs(1,0);int cnt;for(int i=1;i<=n;i++){if(V1[i].empty()) continue;cnt=0;for(int j=i;j<=n;j+=i){for(int k:V0[j]){int u=q[k].u;q0[++cnt]={0,k,dfn[u],j,j,dis[u]};q0[++cnt]={0,k,dfn[u]+sz[u],sz[u],j,-dis[u]};}}for(int k:V1[i]){int u=q[k].u,l=q[k].l,r=q[k].r;q0[++cnt]={1,k,dfn[u],l,r};}sort(q0+1,q0+1+cnt,[](const node2& a,const node2 &b){return a.id<b.id||a.id==b.id&&a.t<b.t;});solve(1,cnt);}for(int i=1;i<=m;i++){if(q[i].op==0) continue;if(ans[i]==-1)puts("Impossible!");elseprintf("%lld\n",dis[q[i].u]-ans[i]);}
}

调了一天了,现在感觉这样写不太行www,cdq分治必须贡献能够分开计算,显然最大值不能贡献累加,导致上面写法可能不太行,草(一种植物)一天没了~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318709.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

参加胶东开发者技术大会有感

2015年的时候&#xff0c;也是在12月&#xff0c;我和Bob(https://www.cnblogs.com/nianming/)去北京参加了“全球架构师峰会”&#xff0c;在那次会议上&#xff0c;来自百度、腾讯、阿里巴巴、京东、美团、新浪微博、Twitter等公司的架构师、技术专家们分享了各自在架构方面的…

牛客题霸 [矩阵乘法] C++题解/答案

牛客题霸 [矩阵乘法] C题解/答案 题目描述 给定两个nn的矩阵A和B&#xff0c;求AB。 题解&#xff1a; 都学过矩阵相乘把&#xff0c;[i][k][i][j]*[j][k] 代码&#xff1a; class Solution { public:/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&…

专题:数列信息传递问题转化为图论合点问题(ybtoj-数列询问+序列破解)

文章目录前言&#xff1a;一、数列询问&#xff08;取模&#xff09;解析代码二、序列破解&#xff08;奇偶性&#xff09;解析代码thanks for reading&#xff01;前言&#xff1a; 在一个数列a中&#xff0c;对于一个大区间A和组成它的两个小区间a&#xff0c;b&#xff1b;…

CF786C-Till I Collapse【树状数组倍增,优先队列】

正题 题目链接:https://www.luogu.com.cn/problem/CF786C 题目大意 给出一个长度为nnn的序列。 对于每个k∈[1,n]k\in[1,n]k∈[1,n]求将nnn分成最少的段使得每段的长度不同。 1≤ai≤n≤1051\leq a_i\leq n\leq 10^51≤ai​≤n≤105 解题思路 考虑对于一个kkk我们的做法显然…

Docker最全教程——从理论到实战(五)

在笔者参加腾讯容器服务技术交流会时&#xff0c;我们了解到了藏区牧民的目前的生活艰辛状况&#xff0c;因此除了在同事朋友之间推荐其土特产之外&#xff0c;我们也在此进行初步分享&#xff0c;希望略尽绵薄之力&#xff0c;能够帮助到他们&#xff1a;货真价实、确保都是37…

2021牛客暑期多校训练营6 J-Defend Your Country(无向图点双+思维)

无向图联通分量 点u是割点&#xff0c;当且仅当 特判树根&#xff1a;u为树根&#xff0c;且u有多于1棵子树u不为树根&#xff0c;在递归树上u存在子节点v&#xff0c;满足&#xff1a;dfnu≤lowv\text{dfn}_u\leq \text{low}_vdfnu​≤lowv​ 如上图&#xff0c;v想走到u的组…

牛客题霸 [比较版本号] C++题解/答案

牛客题霸 [比较版本号] C题解/答案 题目描述 如果version1 > version2 返回1&#xff0c;如果 version1 < version2 返回-1&#xff0c;不然返回0. 输入的version字符串非空&#xff0c;只包含数字和字符.。.字符不代表通常意义上的小数点&#xff0c;只是用来区分数字…

不止代码:循环比赛(分治)

循环比赛日程表&#xff08;match&#xff09; 【问题描述】 解析 dfs或分治 分治可以不断递归4个小正方形 左上右下为前一半&#xff0c;左下右上后一半 dfs就很无脑了 代码 #include<cstdio> #include<cstring> #include<algorithm> #include<cmath…

P4983-忘情【wqs二分,斜率优化】

正题 题目链接:https://www.luogu.com.cn/problem/P4983 题目大意 给出长度为nnn的序列xxx&#xff0c;记平均数为xˉ\bar{x}xˉ&#xff0c;要求将序列分成mmm段。 每一段[l,r][l,r][l,r]的值为 ((∑ilrxixˉ)xˉ)2xˉ2\frac{((\sum_{il}^rx_i\times \bar x)\bar x)^2}{\bar…

前瞻科技,引领未来!Microsoft Connect(); 2018即将重磅来袭!

怎么用一句话点燃全球的开发者&#xff1f;——Microsoft Connect(); 2018即将重磅来袭&#xff01;每一个观点都能引发科技狂潮&#xff0c;每一项技术都将提速技术进程&#xff0c;由微软举办的 Microsoft Connect(); 2018 即将在太平洋时间12月4日8:30拉开帷幕&#xff01;大…

2021“MINIEYE杯”中国大学生算法设计超级联赛(7)Yiwen with Formula(任意模数FFT)

Yiwen with Formula 溢流眼泪题解 生成函数化成n个多项式乘积&#xff0c;然后分治把他们依次相乘&#xff0c;需要由于指数需要modϕ(998244353)998244353−1\bmod \phi(998244353)998244353-1modϕ(998244353)998244353−1&#xff0c;因此需要任意模数的FFT。。。 常数贼大…

牛客题霸 [ 孩子们的游戏] C++题解/答案

牛客题霸 [ 孩子们的游戏] C题解/答案 题目描述 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开…

4.1模拟报告

总结 做的很坎坷。。。 一些细节上的玄学bug &#xff08;上次也一样。。。&#xff09; 还是要加强基础&#xff01;&#xff01;&#xff01; T1 x的实根 不贴了&#xff0c;就是水题。。。 T2 二分查找 就是lowerbound T3逆序对 1.树状数组 2.归并排序 注意&#xff…

P5048-[Ynoi2019 模拟赛]Yuno loves sqrt technology III【分块】

正题 题目链接:https://www.luogu.com.cn/problem/P5048 题目大意 就是这个 【QA】区间众数&#xff0c;但空间很小 长度为nnn的序列&#xff0c;要求支持查找区间众数出现次数。 强制在线 1≤n,m≤51051\leq n,m\leq 5\times 10^51≤n,m≤5105 解题思路 空间小就不能用蒲公…

2021牛客暑期多校训练营7 J-xay loves Floyd(最短路+bitset优化集合交)

J-xay loves Floyd ANJHZ题解 abcdhhhh_题解 如果di,jwi,j\text d_{i,j}\text w_{i,j}di,j​wi,j​,那么按照题意中的算法仍然能得到正确的结果。此时记cani,j1\text{can}_{i,j}1cani,j​1。 如果存在vvv&#xff0c;使得①cani,v1\text{can}_{i,v}1cani,v​1②canv,j1\text{…

通俗易懂,C#如何安全、高效地玩转任何种类的内存之Span的脾气秉性(二)

前言读完上篇《通俗易懂&#xff0c;C#如何安全、高效地玩转任何种类的内存之Span(一)》&#xff0c;相信大家对span的本质应该非常清楚了。含着金钥匙出生的它&#xff0c;从小就被寄予厚望要成为.NET下编写高性能应用程序的重要积木&#xff0c;而且很多老前辈为了接纳它&…

4.6模拟 宽度优先搜索

总结 bfs除了代码能力没有任何算法。。。 有些细节是值得注意的 T1 面积(area) bfs被我写成了dfs。。。 &#xff08;不过我觉得这么写挺不戳&#xff09; 核心思路就是用一个flag记录当前跑得这些点有没有效 恶心之处在于本题默认mn10&#xff01;&#xff01;&#xff01;…

牛客题霸 [ 有重复项数字的所有排列] C++题解/答案

牛客题霸 [ 有重复项数字的所有排列] C题解/答案 题目描述 给出一组可能包含重复项的数字&#xff0c;返回该组数字的所有排列。 题解&#xff1a; 很多人应该都是用的递归方式来做&#xff0c;这里介绍一个stl的next_permutation 在头文件里&#xff0c;可以产生全排列 ne…

2021牛客暑期多校训练营7 F-xay loves trees(线段树+滑动窗口)

F-xay loves trees 考虑在树1中满足条件的一些点&#xff0c;首先不难想到一定是一条链&#xff0c;其次如果点uuu被选择那么在树2以uuu为根的子树的点就禁止被选&#xff0c;于是只需区间&#xff0c;然后查询区间最值是否存在>1也就是树2中覆盖次数超过2的节点即可。 首…

微软开发者大会:VS 2019 Preview 发布;Windows UX 主要技术开源

美国当地时间12月4日&#xff0c;微软正式举行 Microsoft Connect(); 2018 开发者大会&#xff0c;本次大会的 slogan 是"Build the apps of tomorrow, today."。在今年的大会上&#xff0c;看得出来微软不是憋了一个 —— 而是憋了一波大招。不妨先看一下这次大会微…