Hướng dẫn giải của Another Tree Problem


Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.

Lưu ý: Các code mẫu dưới đây chỉ mang tính tham khảo và có thể không AC được bài tập này

Code mẫu của flashmt

const fi='';
      fo='';
      maxn=100010;
      z=1000000007;
var n:longint;   re,s:int64;
    a,c:array[1..maxn shl 1] of longint;
    b:array[1..maxn,0..2] of longint;
    pos,cur,sl:array[1..maxn] of longint;

procedure rf;
var i:longint;
begin
     read(n);
     for i:=1 to n-1 do
     begin
          read(b[i,0],b[i,1],b[i,2]);
          inc(sl[b[i,0]]);
          inc(sl[b[i,1]]);
     end;
     pos[1]:=1; cur[1]:=1;
     for i:=2 to n+1 do
     begin
          pos[i]:=pos[i-1]+sl[i-1];
          cur[i]:=pos[i];
     end;
     for i:=1 to n-1 do
     begin
          a[cur[b[i,0]]]:=b[i,1];
          c[cur[b[i,0]]]:=b[i,2];
          inc(cur[b[i,0]]);
          a[cur[b[i,1]]]:=b[i,0];
          c[cur[b[i,1]]]:=b[i,2];
          inc(cur[b[i,1]]);
     end;
end;

procedure visit(x,y:longint;var s:int64);
var i:longint;  sq,t:int64;
begin
     s:=0; sq:=0;
     for i:=pos[x] to pos[x+1]-1 do
         if a[i]<>y then
         begin
              visit(a[i],x,t);
              t:=(t*c[i]) mod z;
              re:=(re+(t*s) mod z) mod z;
              s:=(s+t) mod z;
         end;
     re:=(re+s) mod z;
     s:=(s+1) mod z;
end;

procedure pr;
var i:longint;
begin
     re:=0;
     visit(1,0,s);
     writeln(re);
end;

begin
     assign(input,fi); reset(input);
     rf;
     pr;
     close(input);
end.

Code mẫu của happyboy99x

#include<cstdio>
#include<vector>
using namespace std;

const int N = (int) 1e5 + 5, TWO_POW_MINUS_ONE = (int) 5e8 + 4;
const long long MOD = (int) 1e9 + 7;
#define TR(v,i) for(typeof((v).begin()) i=(v).begin();i!=(v).end();++i)

long long a[N], b[N];
int n, c[N]; bool vst[N];
vector<vector<pair<int, int> > > g;

void enter() {
    scanf("%d", &n); g.resize(n);
    for(int i = 1; i < n; ++i) {
        int u, v, l; scanf("%d%d%d", &u, &v, &l);
        g[--u].push_back(make_pair(--v, l));
        g[v].push_back(make_pair(u, l));
    }
}

void dfs(int u) {
    vst[u] = 1;
    TR(g[u], it) {
        int v = it->first, w = it->second;
        if(vst[v]) continue; dfs(v); long long tmp = w * (a[v] + 1) % MOD;
        a[u] = (a[u] + tmp) % MOD;
        b[u] = (b[u] - tmp * tmp % MOD) % MOD;
    }
    b[u] = (b[u] + a[u] * a[u] % MOD) % MOD * TWO_POW_MINUS_ONE % MOD;
}

void solve() {
    dfs(0); long long res = 0;
    for(int i = 0; i < n; ++i) res = (res + a[i] + b[i]) % MOD;
    res = (res + MOD) % MOD;
    printf("%d\n", (int) res);
}

int main() {
    enter();
    solve();
    return 0;
}

Code mẫu của ladpro98

#include <bits/stdc++.h>
#define ii pair<int, int>
#define X first
#define Y second
const int N = 100005;
const long long B = 1000000007;
using namespace std;
vector<ii> a[N], child[N];
bool was[N];
long long P[N], Q[N], res;
int n;

void DFS(int u) {
    was[u] = true; int i, v;
    for(i=0; i<a[u].size(); i++) {
        v = a[u][i].X;
        if (was[v]) continue;
        child[u].push_back(a[u][i]);
        DFS(v);
    }
}

long long Pfunc(int u) {
    if (P[u] != -1) return P[u];
    P[u] = 0;
    int i, v; long long uv;
    for(i=0; i<child[u].size(); i++) {
        v = child[u][i].X; uv = child[u][i].Y;
        P[u] = (P[u] + (Pfunc(v) + 1) * uv) % B;
    }
    return P[u];
}

long long Qfunc(int u) {
    if (Q[u] != -1) return Q[u];
    int i, v;
    long long aa = 0, bb = 0, uv, tmp = 0;
    aa = Pfunc(u); aa = (aa * aa) % B;
    for(i=0; i<child[u].size(); i++) {
        v = child[u][i].X; uv = child[u][i].Y;
        tmp = ((Pfunc(v) + 1) * uv) % B;
        bb = (bb + tmp * tmp) % B;
    }
    tmp = (aa - bb + B) % B;
    if (tmp % 2 == 1) tmp += B;
    Q[u] = (tmp / 2) % B;
    return Q[u];
}

int main()
{
    scanf("%d\n", &n);
    int i, u, v, w;
    for(i=1; i<n; i++) {
        scanf("%d %d %d\n", &u, &v, &w);
        a[u].push_back(ii(v, w));
        a[v].push_back(ii(u, w));
        P[i] = Q[i] = -1;
    }
    P[n] = Q[n] = -1;
    DFS(1);
    long long res = 0;
    for(i=1; i<=n; i++)
        res = (res + Pfunc(i) + Qfunc(i)) % B;
    printf("%lld", res);
    return 0;
}

Code mẫu của RR

{$R+,Q+}
{$M 1000000}
//{$Mode objFPC}
const
  FINP='';
  FOUT='';
  MAXN=100001;
  oo=1000000007;
type
  list=^node;
  node=record
         u,c:longint;
         next:list;
       end;
var
  f1,f2:text;
  n:longint;
  ke:array[1..MAXN] of list;
  sum,sl:array[1..MAXN] of int64;
  xet:array[1..MAXN] of longint;
  kq:int64;
procedure openF;
begin
  assign(f1,FINP); reset(f1);
  assign(f2,FOUT); rewrite(f2);
end;
procedure closeF;
begin
  close(f1); close(f2);
end;
procedure add(u,c:longint; var a:list);
var
  p:list;
begin
  new(p); p^.u:=u; p^.c:=c;
  p^.next:=a; a:=p;
end;
procedure inp;
var
  i,u,v,c:longint;
begin
  read(f1,n);
  for i:=1 to n-1 do
    begin
      read(f1,u,v,c);
      add(u,c,ke[v]);
      add(v,c,ke[u]);
    end;
end;
procedure ans;
begin
  if kq mod 2=0 then writeln(f2,kq div 2)
  else writeln(f2,(kq+oo) div 2);
end;
procedure dfs1(u:longint);
var
  v:longint;
  c:int64;
  p:list;
begin
  xet[u]:=1;
  sl[u]:=0; sum[u]:=0;
  p:=ke[u];
  while p<>nil do
    begin
      v:=p^.u; c:=p^.c; p:=p^.next;
      if xet[v]=1 then continue;
      dfs1(v);
      sl[u]:=sl[u]+sl[v]+1;
      sum[u]:=(sum[u]+c+sum[v]*c) mod oo;
    end;
end;
procedure dfs2(u:longint);
var
  v:longint;
  x,y,c:int64;
  p:list;
begin
  xet[u]:=1;
  p:=ke[u];
  while p<>nil do
    begin
      v:=p^.u; c:=p^.c; p:=p^.next;
      if xet[v]=1 then continue;
      dfs2(v);
      x:=(c*(sum[v]+1)) mod oo;
//      try
      y:=(sum[u]-(c*(sum[v]+1)) mod oo) mod oo;
//      except writeln(c,' ',sum[v],' ',sum[u]); halt; end;
      kq:=(kq+x*y) mod oo;
    end;
  kq:=(kq+sum[u]*2) mod oo;
end;
begin
  openF;
  inp;
  dfs1(1);
  fillchar(xet,sizeof(xet),0);
  dfs2(1);
  ans;
  closeF;
end.

Code mẫu của hieult

#include <vector>
#include <algorithm>
#include <utility>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <set>
#include <map>
#include <cstring>
#include <time.h>
#define rep(i,n) for(int i=0;i<n;i++)
#define pb push_back
#define Debug(x) cout<<#x<<"="<<x<<endl;
#define For(i,l,r) for(int i=l;i<=r;i++)
#define tr(e,x) for(eit e=x.begin();e!=x.end();e++)
const int inf=~0U>>1,maxn=100000,mod=1000000007;
using namespace std;
typedef long long ll;
int n;
struct Edge
{
    int t,c;
    Edge(int _t,int _c):t(_t),c(_c){}
};
vector<Edge> E[maxn];
typedef vector<Edge>::iterator eit;
void InsEdge(int s,int t,int c)
{
    E[s].pb(Edge(t,c));E[t].pb(Edge(s,c));
}
ll pow(int x,int e)
{
    if(!e)return 1;
    ll tmp=pow(x,e/2);tmp*=tmp;tmp%=mod;
    if(e&1)tmp*=x,tmp%=mod;
    return tmp;
}
ll Sum[maxn],P,ans=0;
int Q[maxn],F[maxn],h,t;
void BFS(int vs)
{
    h=t=0;
    for(Q[t++]=vs,F[vs]=-1;h<t;h++)
    {
        int x=Q[h];
        tr(e,E[x])if(e->t!=F[x])
            F[e->t]=x,Q[t++]=e->t;
    }
    for(int i=h-1;i>=0;i--)
    {
        int x=Q[i];Sum[x]=1;
        ll all,tmp,ret=0;
        tr(e,E[x])if(e->t!=F[x])
            Sum[x]+=Sum[e->t]*e->c,Sum[x]%=mod;
        all=Sum[x]+1;
        tr(e,E[x])if(e->t!=F[x])
            tmp=Sum[e->t]*e->c,tmp%=mod,ret+=(all-tmp)*tmp,ret%=mod;
        ret*=P;ret%=mod;if(ret<0)ret+=mod;ans+=ret;ans%=mod;
    }
}
int main()
{
    //freopen("in","r",stdin);
    cin>>n;int s,t,c;
    rep(i,n-1)
    {
        scanf("%d%d%d",&s,&t,&c);--s;--t;
        InsEdge(s,t,c);
    }
    P=pow(2,mod-2);
    BFS(0);
    cout<<ans<<endl;
}

Code mẫu của ll931110

#include <cstring>
#include <iostream>
#include <vector>
#define mod 1000000007
using namespace std;

int pr[100010];
int n;
long long top[100010],bot[100010];
long long ret = 0;
vector< pair<int,int> > adj[100010];

void DFS(int u)
{
    for (vector< pair<int,int> >::iterator iter = adj[u].begin(); iter != adj[u].end(); iter++)
    {
        int v = iter->first;
        if (pr[v] > -1) continue;
        pr[v] = u;
        DFS(v);
    }
}

void DFScalc(int u)
{
    for (vector< pair<int,int> >::iterator iter = adj[u].begin(); iter != adj[u].end(); iter++)
    {
        int v = iter->first;
        if (pr[u] == v) continue;
        top[v] = (1LL * (top[u] + 1) * iter->second) % mod;
        DFScalc(v);
        long long tmp = (1LL * (bot[v] + 1) * iter->second) % mod;
        ret = (ret + bot[u] * tmp) % mod;
        bot[u] = (bot[u] + tmp) % mod;
    }
}

int main()
{
//  freopen("putevi.in","r",stdin);
//  freopen("putevi.out","w",stdout);
    scanf("%d", &n);
    for (int i = 1; i < n; i++)
    {
        int x,y,c;
        scanf("%d %d %d", &x, &y, &c);
        adj[x].push_back(make_pair(y,c));
        adj[y].push_back(make_pair(x,c));
    }
    memset(pr,-1,sizeof(pr));
    memset(top,0,sizeof(top));
    memset(bot,0,sizeof(bot));
    pr[1] = 0;
    DFS(1);
    DFScalc(1);
    for (int i = 1; i <= n; i++) ret = (ret + top[i]) % mod;
    cout << ret << endl;
}

Code mẫu của skyvn97

#include<cstdio>
#include<vector>
#include<cstring>
#define MAX   100100
#define p   first
#define s   second
using namespace std;
typedef long long ll;
const ll mod=(ll)1e9+7;
typedef pair<int,ll> ii;
vector<ii> g[MAX];
int c[MAX];
int n;
ll f[MAX];
ll res;
void loadgraph(void) {
    int i;
    int u,v;
    ll cst;
    scanf("%d",&n);
    for (i=1;i<=n;i=i+1) g[i].clear();
    for (i=1;i<n;i=i+1) {
        scanf("%d",&u);
        scanf("%d",&v);
        scanf("%lld",&cst);
        g[u].push_back(ii(v,cst));
        g[v].push_back(ii(u,cst));
    }
    memset(f,0,sizeof f);
    memset(c,0,sizeof c);
    res=0;
}
void visit(const int &u) {
    int i,v;
    //printf("Visiting %d\n",u);
    for (i=0;i<g[u].size();i=i+1)
        if (c[g[u][i].p]==0) {
            v=g[u][i].p;
            c[v]=1;
            visit(v);
            //printf("f(%d)=%lld\n",v,f[v]);
            res=(res+f[v])%mod;
            res=(res+((f[v]*g[u][i].s+g[u][i].s)%mod)*f[u])%mod;
            f[u]=(f[u]+f[v]*g[u][i].s+g[u][i].s)%mod;
            //printf("res is now %lld\n",res);
        }
}
void process(void) {
    c[1]=1;
    visit(1);
    printf("%lld",(res+f[1])%mod);
}
int main(void) {
    loadgraph();
    process();
    return 0;
}

Code mẫu của khuc_tuan

//{$A8,B-,C+,D+,E-,F-,G+,H+,I+,J-,K-,L+,M-,N+,O+,P+,Q+,R+,S+,T-,U-,V+,W-,X+,Y+,Z1}
// {$APPTYPE CONSOLE}
 {$mode delphi}
{$M 16777216}

const
    modulo = 1000000007;

type
    List = class
        i, w : integer;
        n : List;
    end;

function POW(x,n : integer) : integer;
var
    t : integer;
begin
    if n=0 then begin POW := 1; exit; end;
    t := POW(x,n div 2);
    if n mod 2 = 0 then POW := int64(t) * t mod modulo
    else POW := int64(t) * t mod modulo * x mod modulo;
end;

procedure AddList(var l : List; i, w : integer);
var
    q : List;
begin
    q := List.Create;
    q.i := i;
    q.w := w;
    q.n := l;
    l := q;                
end;

var
    ke : array[1..100000] of List;
    i, u, v, w, n : integer;
    chia2 : integer;
    f, g : array[1..100000] of int64;
    father : array[1..100000] of integer;


procedure dfs(i : integer);
var
    p : List;
    z, j, w : integer;
    tong, tong2 : integer;
begin
    p := ke[i];
    tong := 0;
    tong2 := 0;
    while p<>nil do
    begin
        j := p.i;
        w := p.w;
        p := p.n;
        if father[i]<>j then
        begin
            father[j] := i;
            dfs(j);
            f[i] := (f[i] + f[j]) mod modulo;
            z := int64(w) * g[j] mod modulo;
            tong := (tong + z) mod modulo;
            tong2 := (tong2 + int64(z) * z mod modulo) mod modulo;
        end;
    end;

        g[i] := (tong + 1) mod modulo;
        f[i] := (f[i] + (int64(tong) * tong + modulo - tong2) mod modulo * chia2) mod modulo;
        f[i] := (f[i] + tong) mod modulo;
end;

begin
    chia2 := POW(2, modulo - 2);
    read(n);
    for i:=1 to n-1 do
    begin
        read(u,v,w);
        AddList(ke[u],v,w);
        AddList(ke[v],u,w);
    end;
    dfs(1);
    writeln(f[1]);
end.

Bình luận

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.