首页 > 其他分享 >CF566C Logistical Questions

CF566C Logistical Questions

时间:2023-12-29 17:33:48浏览次数:26  
标签:CF566C frac 答案 dep siz sum int Questions Logistical

更好的阅读体验

CF566C Logistical Questions

好强的题,感觉完全想不到。

如果对于每个点都计算答案的话复杂度是 \(\mathcal O(n^2)\),但是由于题目中给了一个 \(\frac{3}{2}\) 次方这么一个非常恶心人的东西,这个算法基本没有优化空间,所以考虑换一种思路,先选择一个点,然后尝试对答案进行调整。

对于一个点,它的答案是:

\[f(u)=\sum_{i\in u}a_idep_i^{\frac{3}{2}} \]

假设我们把当前答案尝试移动到 \(u\) 的一个儿子 \(v\),新的答案为:

\[g(x)=\sum_{i\in v}a_i(dep_i-x)^{\frac{3}{2}}+\sum_{i\notin v}a_i(dep_i+x)^{\frac{3}{2}} \]

其中 \(x\) 可以表示 \((u,v)\) 的边权。这个东西好像还是没有什么性质,我们尝试对它求导:

\[\begin{aligned} g'(x)&=-\frac 3 2\sum_{i\in v}a_i(dep_i-x)^{\frac{1}{2}}+\frac 3 2\sum_{i\notin v}a_i(dep_i+x)^{\frac{1}{2}}\\ &=\frac 3 2(\sum_{i\notin v}a_i(dep_i+x)^{\frac{1}{2}}-\sum_{i\in v}a_i(dep_i-x)^{\frac{1}{2}}) \end{aligned} \]

还是没有什么性质,我们尝试再次求导:

\[g''(x)=\frac 3 4(\sum_{i\notin v}a_i(dep_i+x)^{-\frac 1 2}+\sum_{i\in v}a_i(dep_i-x)^{-\frac 1 2}) \]

因为 \(x<dep_u\),所以二阶导数恒正,这说明这个函数是凸的!所以对于每一条边 \((u,v)\),如果答案靠近 \(u\),则 \(g'(x)\) 单增,所以 \(g(x)\) 是单调递增并且增速越来越快,极小值不在 \(x>0\) 的部分,否则 \(g'(x)\) 单减,说明极值在 \(x>0\) 的部分(在 \(g'(x)=0\) 处)。

这个结论是对于一条边来说的,但是它扩展到树上也是对的。假设答案在 \(u\),则对于所有的 \((u,v)\) 上述结论成立。对于其余的部分,随着答案尝试向下移动,\(g'(x)\) 的前一部分 \(i\notin v\) 的点会变得越来越多,\(i\in v\) 的点会变得越来越少,相应的,随着向下走,整体来看 \(g'(x)\) 是变大的,所以我们得到关键结论:在树上一个点越远离答案点,它的答案越劣(这里的点可以不只是树上的点,可以是边中间的实数的点)。

所以我们可以先选择一个点,然后尝试向下移动,判断的依据就是 \(g'(0)\),如果其大于 \(0\) 则说明答案不在这棵子树里,否则在,向下递归。但是这样复杂度不对,可以用点分治优化:每次选取重心作为当前的答案,然后尝试移动到重心的其余儿子,此时上述结论显然也是正确的。总复杂度 \(\mathcal O(n\log n)\)。

	int n,cnt,head[200010],dep[200010],to[400010],v[400010],nex[400010],a[200010];
	inline void add(int x,int y,int z){to[++cnt]=y,v[cnt]=z,nex[cnt]=head[x],head[x]=cnt;}
	namespace Starch
	{
		int siz[200010],root,all,maxi;
		double delta,delta2,ans=INF,sum;
		bool vis[200010];
		void find(int x,int fa)
		{
			siz[x]=1;int maxn=0;
			for(int i=head[x];i;i=nex[i])
			{
				if(to[i]==fa||vis[to[i]])continue;
				dep[to[i]]=dep[x]+v[i],find(to[i],x),siz[x]+=siz[to[i]],maxn=max(maxn,siz[to[i]]);
			}
			if(max(maxn,all-siz[x])<=all/2)root=x;
		}
		void dfs(int x,int fa,int dep)
		{
			sum+=a[x]*pow(dep,1.5),delta+=a[x]*sqrt(dep);
			for(int i=head[x];i;i=nex[i])if(to[i]!=fa)dfs(to[i],x,dep+v[i]);
		}
		void dfs2(int x,int fa,int dep)
		{
			delta2+=a[x]*sqrt(dep);
			for(int i=head[x];i;i=nex[i])if(to[i]!=fa)dfs2(to[i],x,dep+v[i]);
		}
		void starch(int x)
		{
			find(x,0),find(x=root,0),vis[x]=1,sum=delta=0,dfs(x,0,0);
			if(sum<ans)ans=sum,maxi=x;
			for(int i=head[x];i;i=nex[i])
			{
				if(vis[to[i]])continue;
				delta2=0,dfs2(to[i],x,v[i]);
				if(delta-2*delta2<0)all=siz[to[i]],starch(to[i]);
			}
		}
	}
	using namespace Starch;
	inline void mian()
	{
		read(n),all=n;int x,y,z;
		for(int i=1;i<=n;++i)read(a[i]);
		for(int i=1;i<n;++i)read(x,y,z),add(x,y,z),add(y,x,z);
		starch(1),cout<<maxi<<" ";
		printf("%.7lf",ans);
	}

标签:CF566C,frac,答案,dep,siz,sum,int,Questions,Logistical
From: https://www.cnblogs.com/WrongAnswer90-home/p/17935385.html

相关文章

  • 无涯教程-PHP Interview Questions函数
    亲爱的读者,这些PHP编程语言面试问题是专门设计的,目的是让您熟悉在采访中可能会遇到的关于PHP编程语言主题的问题的性质。根据我的经验,优秀的面试官几乎不会计划在面试过程中提出任何特定的问题,通常,问题是从该主题的一些基本概念开始的,然后根据进一步的讨论和您的回答继续......
  • Google classic interview questions, throwing eggs the least number of times All
    Googleclassicinterviewquestions,throwingeggstheleastnumberoftimesAllInOne谷歌经典面试题,扔鸡蛋最少次数14✅你在一栋100层的大楼里工作,你得到2个相同的鸡蛋。你需要计算出鸡蛋可以掉落到最高的楼层而不破裂。问题是你需要投掷多少次。找到一种在......
  • Royal Questions题解
    题目链接RoyalQuestions-洛谷|计算机科学教育新生态(luogu.com.cn)分析每个公主会选择两个王子,考虑将每个公主所选择的两个王子连边,边权为该公主的嫁妆选择该边即为选择该公主那么结果图是什么呢?由于每个王子最多只能选择一个公主即每个点最多有1个出边(也可能没有出边......
  • 无涯教程-jQuery Interview Questions函数
    尊敬的读者,这些jQuery面试问题是专门设计的,目的是让您熟悉在您采访jQuery时可能遇到的问题的性质。根据我的经验,优秀的面试官几乎不会计划在面试过程中提出任何特定的问题,通常,问题是从该主题的一些基本概念开始的,然后根据进一步的讨论和您的回答继续进行讨论-Whatisj......
  • Interleaving Retrieval with Chain-of-Thought Reasoning for Knowledge-Intensive M
    目录概IRCoT代码TrivediH.,BalasubramanianN.,KhotT.,SabharwalA.Interleavingretrievalwithchain-of-thoughtreasoningforknowledge-intensivemulti-stepquestions.ACL,2023.概CoT(ChainofThought)+检索.IRCoT对于如上的问题,"Inwhatcountry......
  • Questions Whlie Reading A Research Paper
    Givemeabriefsummaryofthebackgroundandcontextoftheresearch.Givemeabriefsummaryofthebackgroundandcontextoftheresearch.Whataretheresearchquestionsaddressedinthepaper.Whataretheresearchquestionsaddressedinthepape......
  • questions_03 【http://127.0.0.1:8000/%5Emanage/(%3FP1%5Cd+)/dashboard/】项目id参
    【原因背景】当我们在点击进入具体项目的时候,根据我们所写的url,中间应该包含我们的项目id,当不知道什么原因可以进入项目,但是id是乱码的【原因分析】在查看相关资料后发现是我们在写path的时候出现的问题:Django2.2.x之后的版本path:用于普通路径,不需要自己手动添加正则首位......
  • Exploiting Cloze Questions for Few Shot Text Classification and Natural Language
    ExploitingClozeQuestionsforFewShotTextClassificationandNaturalLanguageInference  论文全程及链接:《ExploitingClozeQuestionsforFewShotTextClassificationandNaturalLanguageInferenceTimo》项目地址:https://github.com/timoschick/pet  ......
  • questions_02:【KeyError: 'mobile_phone'[27/Apr/2023 21:42:21] "POST /register/ H
    BUG在成功注册之后,如果填写相同的信息,会报出一个【KeyError:'mobile_phone'[27/Apr/202321:42:21]"POST/register/HTTP/1.1"50086526】的bug,原因是我们的cleaned_data中的数据是按照fields中的顺序去校验成功之后添加的,所以当出现相同的数据时候cleaned_data前面几个字......
  • questions_01:500 Internal Server Error 解决思路
    500InternalServerError问题如何解决?结果令人啼笑皆非问题出现场景register.html:在利用ajax发送请求之后,我们手机会收到短信验证码,并且前端会收到后台的一个返回值,此时在我们的页面就要开始验证码倒计时,不知道什么原因就是显示不出来,后台运行代码也没报错,短信也是正常收......