ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2020.09.29pm

2021-09-30 13:32:07  阅读:138  来源: 互联网

标签:2020.09 head int son fa blacktriangledown blacktriangle 29pm


2021.09.29PM

预期 实际
A 100 100
B 100 100
C 10 20
D 0 10
S 210 230

可能水,一定菜

A 满汉全席\(\blacktriangle\!\blacktriangledown\!\blacktriangle\)

  1. 才明白这个成语啥意思。
  2. 还是之前那句话,用 \(Tarjan\) 的紫题都很水。
  3. 这道题由于食材要么用于做汉式要么做满式就能联想到 \(2-SAT\)。
  4. 同时评委会给出更多的约束条件,那就更是 \(2-SAT\) 了。
  5. 每个评委不做第一道菜(或者说用该种食材做了另一种菜)必须做第二道菜;不做第二道菜必须做第一道菜,最后检查是否同一个食材又要做汉式又要做满式,跑 \(Tarjan\) 找强连通分量即可。
  6. \(P.S.\) 考试的时候我其实不是这样写的。我设的状态更多(做汉式,不做汉式,做满式,不做满式,变成两个点,食材也变成约束关系),但其实问题也不大,只要理得清矛盾关系,不漏掉矛盾关系就问题不大。

B 部落划分 \(\blacktriangle\!\blacktriangledown\)

  1. 好家伙,最小生成树没想出来,倒是用之前口胡的常数更大的方法做的····。
  2. 先说考试时候的方法吧——二分最大距离。
    • 我们把所有小于等于最大距离的边都建上,同时用并查集维护看最后有几个连通块。
    • 如果连通块数目大于等于 \(k\) 说明成立,反之不成立。(大于 \(k\) 可以把几个连通块合并,不会使距离变小)
  3. 再说最小生成树吧,这道题只能说用了最小生成树的思路。
    • 先建当前最短的边,直到当前只有 \(k\) 个连通块。
    • 正确性显然。

C 冷冻波 \(\blacktriangle\!\blacktriangledown\!\blacktriangle\!\blacktriangledown\!\blacktriangle\!\blacktriangledown\!\blacktriangle\!\blacktriangledown\!\blacktriangle\!\blacktriangledown\!\blacktriangle\!\blacktriangledown\!\blacktriangle\!\blacktriangledown\!\blacktriangle\!\blacktriangledown\!\blacktriangle\!\blacktriangledown\!\blacktriangle\!\blacktriangledown\!\blacktriangle\!\blacktriangledown\!\blacktriangle\!\blacktriangledown\!\blacktriangle\!\blacktriangledown\!\blacktriangle\!\blacktriangledown\!\blacktriangle\!\blacktriangledown\!\blacktriangle\!\blacktriangledown\!\blacktriangle\!\blacktriangledown\!\blacktriangle\!\blacktriangledown\!\blacktriangle\!\blacktriangledown\!\blacktriangle\!\blacktriangledown\!\blacktriangle\!\blacktriangledown\!\blacktriangle\!\blacktriangledown\!\blacktriangle\!\blacktriangledown\)

  1. 不仅不会做,而且不会做。

D 蔬菜庆典\(\blacktriangle\!\blacktriangledown\!\blacktriangle\)

  1. 笑死,比赛时心想最后一道,大抵整不动,样例都没分析····要是分析一下说不定就整出来了?。
  2. 这个地方有个离谱的地方:+inf要分开算,导致解题要分成两个部分,让人十分难受。

Part 1 +inf

  • 首先从样例2能看出第一个规律:如果儿子不同,自己不是根,答案就是+inf。(由于根不能变,之后除非专门提及根,默认为除根外的其它点。)
    • 证明:\(v[x] \to v[fa]+v[son_1]-v[x] \to v[fa]+v[son_2]-(v[fa]+v[son_1]-v[x])=v[son_2]-v[son_1]+v[x]\)
  • 其次,即使儿子相同,但有一个儿子的值可以变化,会造成两个儿子不同,同样是+inf,而不能变化是由于儿子为叶子节点,或儿子 \(y\) 一定满足 \(f[y]=f[fa_y]+f[son_y]-f[y]\)
  • 最后,父亲能变自己也能变。(显然)
  • 所以最后的代码如下:
	void dfs(int x,int fa){//全是单向边
	if(out[x]){//不是叶子节点
		if(change[fa])change[x]=1;//父亲能变则自己能变
		for(int i=head[x];i;i=e[i].nx){
			int y=e[i].b;
			if(v[y]+v[fa]!=2*v[x])change[x]=1;//自己的值能变化
			dfs(y,x);
			if(change[y])change[x]=1;//儿子能变自己能变
			if(pan)return;//+inf
		}
	}
	if(out[x]>1)//不是一条链
		for(int i=head[x];i;i=e[i].nx){
			int y=e[i].b;
			if(change[y]||v[y]!=v[e[head[x]].b]){pan=1;return;}//儿子有不同值
		}
}

Part 2 ans

  • 在成功把+inf排除后,显然会满足一个性质:有分叉(有起码两个儿子的点)之后不可能有任何变化。

  • 那么能变化的有且只有从根的儿子到各自分叉点的几条链(按道理来说分叉点也是不可变化的,但是如果分叉点底下全是值相同的叶子节点显然是可以变化的,而不能变化放进去也不是不阔以)。

  • 考虑怎么样使得链值之和最大。

  • 假设一条链为\(A,B,C,D,E\)

  • 修改后:\(A,B,B+D-C,D,E\)

  • 发现,变成了前后之和减去自己(废话)

  • 感觉和换位子很像,考虑差分。

  • 差分后:\(A,B-A,C-B,D-C,E-D\)

  • 交换后:\(A,B-A,D-C,C-B,E-D\)

  • 还原(前缀和):\(A,B,B+D-C,D,E\)

  • 发现完全一致。(我觉得能有这个察觉能力的大抵都是省选水平的巨佬,我反正想不到这么深,当然多试几组数据可能可以看出来)

  • 那么为了使最后的答案尽可能大,自然进行降序排列。

    inline void ji(){//计算链的答案
    	if(cnt==1)return;
    	for(int i=cnt;i>=2;i--)
    		zhan[i]-=zhan[i-1];
    	sort(zhan+2,zhan+cnt+1,cmp);
    	for(int i=2;i<=cnt;i++){
    		zhan[i]+=zhan[i-1];
    		ans+=zhan[i];
    	}
    	cnt=1;
    }
    void sum(int x){//计算子树答案
    	ans+=v[x];
    	for(int i=head[x];i;i=e[i].nx)
    		sum(e[i].b);
    }
    void dfs1(int x){
    	zhan[++cnt]=v[x];//最后面的点虽然不能修改,但也能产生贡献。
    	if(out[x]>1){
    		zhan[++cnt]=v[e[head[x]].b];//分叉点也可以更新,而它的儿子一定不能更新
    		ji();
    		ans-=v[e[head[x]].b];//之后算子树会重复计算一个点
    		for(int i=head[x];i;i=e[i].nx)
    			sum(e[i].b);
    		return;
    	}
    	if(out[x]==0){ji();return;}
    	dfs1(e[head[x]].b);
    }
    

image
\(\cal {Made} \ {by} \ {YuGe}\)

标签:2020.09,head,int,son,fa,blacktriangledown,blacktriangle,29pm
来源: https://www.cnblogs.com/u2003/p/15356307.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有