理由:
这是他写的题解的代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=2e5+5;
vector<ll> G[N];
queue<ll> q;
ll topu[N],to[N],ans[N];
ll n,x,y,answer;
int main(){
cin>>n;
for(int i=1;i<n;i++){
cin>>x>>y;
G[x].push_back(y);
topu[y]++;
}
for(int i=1;i<=n;i++) if(!topu[i]) q.push(i);
while(!q.empty()){//拓扑排序
ll x=q.front();
q.pop();
for(auto y:G[x]){
to[y]+=(to[x]+1);//更新数组
ans[y]+=(to[x]+ans[x]+1);
topu[y]--;
if(!topu[y]) q.push(y);
}
}
for(int i=1;i<=n;i++) answer+=ans[i];//累加求答案
cout<<answer;
return 0;
}
这是原题解代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define FOR(i, a, b) for(int i = (a); i <= (b); ++ i)
#define pb push_back
const int N = 2e5 + 10;
int n, outd[N], g[N], f[N];
vector<int> G[N];
queue<int> que;
signed main() {
scanf("%lld", &n);
FOR(i, 1, n - 1) {
int u, v;
scanf("%lld%lld", &u, &v);
G[v].pb(u), outd[u] ++;
}
FOR(i, 1, n) if(!outd[i]) que.push(i);
while(que.size()) {
int u = que.front(); que.pop();
for(int v: G[u]) {
g[v] += g[u] + 1;
f[v] += f[u] + g[u] + 1;
if(!(-- outd[v])) que.push(v);
}
}
int ans = 0;
FOR(i, 1, n) ans += f[i];
printf("%lld\n", ans);
return 0;
}
可以看到,代码结构完全一致,大家可以看一下。
原题解写了很多数学公式来阐释答案由来。让我们看看他怎么写的:
那怎么去更新两个数组呢?非常简单!
并没有原理解释。像极了自己把题解代码AC了又想写题解又不知道原理的样子。
没什么说的。他的题解比原题解要晚,不会矛盾。
这个。能看出,他第一遍提交就过了,而且代码就是题解代码。第二次AC只是增加了注释而已。
最后可以看到,他的思路解释就是原题解的思路解释的最后一自然段,甚至都没有原因的。
举报