首页 > 其他分享 >ABC 359

ABC 359

时间:2024-06-24 10:53:29浏览次数:22  
标签:ABC fa int auto dfs dep mp 359

submissions

A,B

直接模拟即可。

C

纵向的距离很好算。有两种情况:

  • 横向距离更小。这个直接输出纵向距离。

  • 更大。减去纵向的步数。

横向距离怎么算?我们考虑把 \(s,e\) 都移动到方块靠左,然后就是横坐标之和。

D

简单的 dp。设 \(dp_{i,msk}\) 为到了第 \(i\) 为,目前前面的状态是 \(msk\),A,B 分别是 \(0,1\)。转移可以预处理也可以直接判断填 A,B 可不可以。

E

直接单调栈维护目前目前的最大值们。如果有更优(即更靠后切更大)就弹出。

F

考虑到知道每一个都至少有 \(1\),树就是可以构造出来的,一共要分配 \(2n-2\)。我们先给每一个 \(1\),然后优先队列贪心分配就可以了。

G

我一个很显然的数据分治(出现次数 \(<\sqrt{n}\) 的暴力,否则树上 dp),但是还要 \(\mathcal{O}(1)\) 的 lca,然后我不会。

其实这个题可以直接启发式合并。每一个节点维护每一个颜色的出现个数。可以把 \(+\) 和 \(-\) 分开来,这样好算。代码也很简单。

这道题按道理来说虚树,点分治都可以做,但是这个应该是我见到的最简洁的写法。

Code
#include <bits/stdc++.h>

using namespace std;

using ll = long long;

const int N = 2e5+5;

int n,dep[N],a[N],fr[N];
vector<int> g[N];
map<int,int> mp[N];
ll ans;

void dfs(int u,int fa){
	for (auto v : g[u]){
		if (v^fa){
			dep[v]=dep[u]+1;
			dfs(v,u);
		}
	}
	mp[u][a[u]]=1;
	for (auto v : g[u]){
		if (v^fa){
			if (mp[v].size()>mp[u].size()){
				swap(mp[v],mp[u]);
			}
			for (auto x : mp[v]){
				ans-=1ll*x.second*mp[u][x.first]*dep[u]*2ll;
				mp[u][x.first]+=x.second;
			}
		}
	}
}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);

	cin>>n;
	for (int i=1; i<n; i++){
		ll u,v;
		cin>>u>>v;
		g[u].push_back(v);
		g[v].push_back(u);
	}
	for (int i=1; i<=n; i++){
		cin>>a[i];
		fr[a[i]]++;
	}
	dfs(1,0);
	for (int i=1; i<=n; i++){
		ans+=1ll*(fr[a[i]]-1)*dep[i];
	}
	cout<<ans<<"\n";
	return 0;
}

标签:ABC,fa,int,auto,dfs,dep,mp,359
From: https://www.cnblogs.com/SFlyer/p/18264548

相关文章

  • ABC359E的有趣解法
    题意:给定一个h序列,对于\(h_i\),找到一个\(j\)满足\(j<i\)且\(h_j>=h_i\),令\(ans_i=h_i*(i-j+1)+ans_j+1\),最后输出ans序列。赛时给了个很魔怔的解法,不知道是不是正解,反正是过了(摊手)我们可以开一个idx数组,将h[i]从小到大排序后将其原下表存入idx数组,这样我们从前......
  • AtCoder Beginner Contest 359
    AtCoderBeginnerContest359(3/6)A-CountTakahashiProblemStatementYouaregivenNNNstrings.Thei......
  • AtCoder Beginner Contest 359
    A-CountTakahashi(abc359A)题目大意给定\(n\)个字符串,问有多少个字符串是Takahashi解题思路注意判断比较即可。神奇的代码#include<bits/stdc++.h>usingnamespacestd;usingLL=longlong;intmain(void){ios::sync_with_stdio(false);cin.tie(0);......
  • [题解]AT_abc350_g [ABC350G] Mediator
    思路有加边操作,一眼LCT。问题在于处理询问操作。首先,判断联通。如果\(x,y\)不在同一个联通块内,则一定没有答案。其次,求出\(x,y\)之间节点的数量\(num\)(包括\(x,y\))。如果\(num=3\)说明\(x,y\)之间有一个共同的节点;如果\(num=2\)说明\(x,y\)直接连接;如果\(n......
  • [题解]AT_abc343_g [ABC343G] Compress Strings
    思路首先假设有两个串\(a,b\),如果\(b\)是\(a\)的子串,且\(a\neqb\)则不需要考虑\(b\);如果\(a=b\),则如需要保留一个\(a\)。做完上述操作后,显然最终的答案是由这些串按照一定顺序拼接起来,再删掉重叠部分。例如:abbcc与ccdde拼接为abbccccdde,发现cc是重复的,所以......
  • [题解]AT_abc342_f [ABC342F] Black Jack
    思路发现自己与庄家的操作是完全独立的,所以考虑分别计算它们。首先考虑自己的情况,定义\(dp_i\)表示掷出骰子的和为\(i\)获胜的概率,并记\(f(i)\)表示\(x=i\)时就不掷的获胜概率。对于每一步我们要么掷骰子(并且掷出的值等概率的在\(1\simD\)中),要么直接结束。两种情......
  • UNIQUE VISION Programming Contest 2024 Summer (AtCoder Beginner Contest 359)
    A-CountTakahashi(abc359A)解题思路遍历判断即可神奇的代码#include<iostream>#include<algorithm>#include<vector>#include<queue>#include<map>#include<set>#include<cstring>usingnamespacestd;#defineendl'\n......
  • ABC359 G - Sum of Tree Distance
    题目链接题目大意给出一棵树,树上每个节点都有一种颜色,求所有颜色相同的节点两两之间距离的总和。 题解想来写题解主要是看了一下官方解法都写的需要“重心分解”,应该是对应中文语境下的树的点分治。实际上点分治写起来很费事,可以用启发式合并替代。具体来说,dfs时每个节点......
  • UNIQUE VISION Programming Contest 2024 Summer (AtCoder Beginner Contest 359) 题
    点我看题A-CountTakahashi没啥好说的点击查看代码#include<bits/stdc++.h>#definerep(i,n)for(inti=0;i<n;++i)#definerepn(i,n)for(inti=1;i<=n;++i)#defineLLlonglong#definefifirst#definesesecond#definepbpush_back#definemprmake_pair......
  • abc359_G Sum of Tree Distance 题解
    题目链接:Atcoder或者洛谷先考虑暴力,显然是枚举整棵树的路径,这个枚举复杂度显示是\(O(n^2)\),还不考虑计算\(f(i,j)\),考虑使用点分治优化枚举复杂度:\(O(n\log{n})\)。接下来考虑如何计算每条路径的\(f(i,j)\),注意到\(f(i,j)\):当且仅当\(a[i]=a[j]\)时,答案加上\(dis(i,j......