把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

luogu P8274 [USACO22OPEN] Balancing a Tree G

题面传送门
感觉一道比较精妙的题目。但是我的做法好像很暴力
首先考虑确定根节点权值以后怎么做。
对于每个节点,考虑其到根的路径上的节点,可以发现只有最大值和最小值是有用的。
这个点的取值只有三种情况:左端点,右端点,最大值和最小值的中值(如果在这个区间里的话)。
等等,我们好像没有考虑对下面点的影响?
实际上只要这个点最优,对下面的影响就最小。因为最后一种对最大值和最小值是没有影响,可以忽略。前两种取到最优的时候恰好是对最大最小值影响最低的时候。
然后剩下根节点的取值,发现看上去一脸三分,然后就过了。
时间复杂度O(nlogW)
code:

#include<bits/stdc++.h>
#define I inline
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define abs(x) ((x)>0?(x):-(x))
#define ll long long
#define db double
#define lb long db
#define N (100000+5)
#define M (900+5)
#define K (200000+5)
#define mod 9248440332
#define Mod (mod-1)
#define eps (1e-9)
#define U unsigned int
#define it iterator
#define Gc() getchar() 
#define Me(x,y) memset(x,y,sizeof(x))
#define Mc(x,y) memcpy(x,y,sizeof(x))
#define d(x,y) (n*(x-1)+(y))
#define R(n) (rand()*rand()%(n)+1)
#define Pc(x) putchar(x)
#define LB lower_bound
#define UB upper_bound
#define PB push_back
using namespace std;vector<int> S[N];
int n,m,k,x,y,z,T,B,H,L[N],R[N],P[N],l,r,m1,m2,Ans,Pus;
struct Ques{int x,w;}Q[4];I bool cmp(Ques x,Ques y){return x.w<y.w;}
I void dfs(int x,int Mx,int Mi){
	H=0;Q[++H]=(Ques){L[x],max(abs(L[x]-Mx),abs(L[x]-Mi))};Q[++H]=(Ques){R[x],max(abs(R[x]-Mx),abs(R[x]-Mi))};(Mx+Mi)/2>=L[x]&&(Mx+Mi)/2<=R[x]&&(Q[++H]=(Ques){(Mx+Mi)/2,(Mx-Mi+1)/2},0);
	sort(Q+1,Q+H+1,cmp);P[x]=Q[1].x;Pus=max(Pus,Q[1].w);for(int i:S[x]) dfs(i,max(Mx,P[x]),min(Mi,P[x]));
}
I int CK(int mid){Pus=0;P[1]=mid;for(int i:S[1]) dfs(i,P[1],P[1]);return Pus;}
I void Solve(){
	int i;for(i=1;i<=n;i++) S[i].clear();scanf("%d",&n);for(i=2;i<=n;i++) scanf("%d",&x),S[x].PB(i);for(i=1;i<=n;i++) scanf("%d%d",&L[i],&R[i]);
	l=L[1];r=R[1];while(l+2<r) m1=l+(r-l)/3,m2=r-(r-l)/3,CK(m1)<CK(m2)?(r=m2):(l=m1);Ans=1e9;for(i=l;i<=r;i++) x=CK(i),Ans=min(Ans,x);
	//cerr<<' '<<CK(1)<<'\n';
	printf("%d\n",Ans);if(!B) return;for(i=l;i<=r;i++) if(CK(i)==Ans) {printf("%d ",i);break;}for(i=2;i<=n;i++) printf("%d ",P[i]);Pc('\n');
}
int main(){
	freopen("1.in","r",stdin);
	scanf("%d%d",&T,&B);while(T--) Solve();
}
posted @   275307894a  阅读(62)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
历史上的今天:
2021-04-04 luogu P5471 [NOI2019] 弹跳
2021-04-04 luogu P3829 [SHOI2012]信用卡凸包
浏览器标题切换
浏览器标题切换end
点击右上角即可分享
微信分享提示