Codeforces Round #606 (Div. 1, based on Technocup 2020 Elimination Round 4)
24941 단어 codeforces
A, B, C 즉 div 2 의 C, E, F 입 니 다. div 2 를 보십시오. 링크
D. Tree Elimination 제목 링크 는 n 개의 수 를 가지 고 있 습 니 다. 초기 대기 열 은 비어 있 습 니 다. 뒤쪽 n - 1 줄 마다 x, y x, y, 대표 x, y x, y x, y 사이 에 가장자리 가 있 습 니 다. 마지막 으로 하나의 나 무 를 구성 할 수 있 습 니 다. 한 변 의 두 노드 가 대기 열 에 없 으 면 그 중 하 나 를 대기 열 에 넣 을 수 있 습 니 다. 마지막 으로 몇 개의 다른 대기 열 을 얻 을 수 있 는 지 물 어 볼 수 있 습 니 다.데이터 범위 2 ≤ n ≤ 2 * 8727 ° 1 0 5 2 \ \ leq n \ \ \ leq 2 * 10 ^ 5 2 ≤ n ≤ 2 * 8727 ° 105, 1 ≤ x i, y i ≤ n 1 \ \ \ leq xi,y_i \ \ leq n 1 ≤ xi, yi ≤ n 분해 트 리 dp, d p [i] [0] dp [i] [0] dp [i] [0] dp [i] [0] 대표 i i 는 아버지 노드 와 비교 하기 전에 대열 에 가입 되 었 고, d p [i] [1] dp [i] [1] dp [i] [1] 대표 i 는 아버지 노드 와 비교 할 때 대열 에 가입 되 었 으 며, d p [i] [2] dp [i] [2] dp [i] [2] 대표 i i 는 아버지 노드 와 비교 한 후에 대열 에 가입 되 었 거나 가입 되 지 않 았 다.l 을 이 노드 로 연 결 된 하위 노드 길이, k 를 부모 노드 의 위치 로 설정 합 니 다.
d p [v] [0] dp [v] [0] dp [v] [0] 는 v 가 가 입 된 위치 (k 앞) 를 매 거 할 수 있 고, 이전의 하위 노드 는 반드시 가입 되 어야 한다. 즉, ∏ (d p [u j] [0] + d p [uj] [1]) \ prod (dp [u j] [0] + dp [u j] [1]] [1]) ∏ (dp [uj] [0] + dp [uj] [0] + dp [uj] [0] [uj] [0] [0] + dp [uj] [1]]] [2] dp [u j] [2] dp[uj] [uj] [2]] [uj]]]] [2]], 뒤의 노드 가 만족 2] 상황또는 이미 대기 열 에 있 는 0 상황 이 므 로 8719 ° (d p [u j] [0] + d p [u j] [2]) \ prod (dp [u j] [0] + dp [u j] [2]) 8719 ° (dp [uj] [0] + dp [uj] [2])
d. p [v] [1] dp [v] [1] dp [v] [1] 은 부모 노드 와 비교 할 때 대기 열 에 가입 되 기 때문에 앞의 노드 는 v 와 비교 할 때 가입 되 고 1 을 만족 시 키 거나 이미 가입 되 었 으 며 0 을 만족 시 켰 다. 즉, 8719 ° (d p [u j] [0] + d p [u j] [1]) \ \ prod (dp [u j] [0] + dp [u j] [1]) 8719 ° (dp [uj] [0] + dp [uj] [1]);뒤의 노드 는 부모 노드 가 가입 되 고 만족 2 또는 비교 전에 이미 가입 되 었 습 니 다. 만족 0, 즉 8719 ° (d p [u j] [0] + d p [u j] [2]) \ prod (dp [u j] [0] + dp [u j] [2]) 8719 ° (dp [uj] [0] + dp [uj] [2])
d p [v] [2] dp [v] [2] dp [v] [2] 부모 노드 가 추가 되 고 v 가 가입 되 는 위치 (k 후) 를 매 거 할 수 있 으 며, 이전의 하위 노드 는 반드시 가입 되 어야 한다. 즉, ∏ (d p [u j] [0] + d p [u j] [1] \ prod (dp [u j] [0]] + dp [u j] [0] + dp [u j] [1]) ∏ (dp [uj] [0] + dp [0] + dp [uj] [uj] [1]]]] [1]]]]]] \ \ \ prod [u j] [2] dp [u j] [2] [u j] [2] [2] [uj] [2] [2,뒤에 있 는 노드 가 2 상황 을 만족 시 켰 거나 이미 대기 열 에 있 는 0 상황 이 므 로 8719 (d p [u j] [0] + d p [u j] [2]] [2]] \ prod (dp [u j] [0] + dp [u j] [2]] [2]] 8719 (dp [uj] [0]] + dp [uj] [2]]] [2]]]]] \ prod (d p [v j] [0]] [0] + d p [j] [0] + d p [u j] [u j] [1]]]]]]]]]]]] [0] + p [j]] [0] + d p [u j] [u j] [1]]]]]]] [1]]]]]]]] + dp [uj] [1])
이동 공식 d p [v] [0] [0] = ∑ i = 1k (∏ j = 1 i − 1 (d p [u j] [0] + d p [u j] [1]) ∗ d p [u i] [u i] [2] ∗ ∗ j = k + 1 l (d p [u j]] [0] + d p [u j] [u j]] [2]] dp [v]]] [0]]]]] [0]]]] △ sum {i = \ \ {k {k} (\ \ prod {j = 1} ^ {i - 1} (dp[u j]]] [0] + d p [u j] [u j]] [2]]]]]] dp [v]]]]) * dp [u i] [2] * \ prod {j = k + 1} ^ {l} (dp [u j] [0] + dp [u j] [2]) dp [v] [0] = ∑ i = 1k(∏j=1i−1(dp[uj][0]+dp[uj][1])∗dp[ui][2]∗∏j=k+1l(dp[uj][0]+dp[uj][2]) d p [ v ] [ 1 ] = ∏ j = 1 k ( d p [ u j ] [ 0 ] + d p [ u j ] [ 1 ] ) ∗ ∏ j = k + 1 l ( d p [ v j ] [ 0 ] + d p [ v j ] [ 2 ] ) dp[v][1]=\prod_{j=1}^k(dp[u_j][0]+dp[u_j][1])*\prod_{j=k+1}^{l}(dp[v_j][0]+dp[v_j][2]) dp[v][1]=∏j=1k(dp[uj][0]+dp[uj][1])∗∏j=k+1l(dp[vj][0]+dp[vj][2]) d p [ v ] [ 2 ] = ∑ i = k + 1 l ( ∏ j = 1 i − 1 ( d p [ u j ] [ 0 ] + d p [ u j ] [ 1 ] ) ∗ d p [ u i ] [ 2 ] ∗ ∏ j = k + 1 l ( d p [ u j ] [ 0 ] + d p [ u j ] [ 2 ] ) ) + ∏ i = 1 l ( d p [ u j ] [ 0 ] + d p [ u j ] [ 1 ] ) dp[v][2]=\sum_{i=k+1}^{l}(\prod_{j=1}^{i-1}(dp[u_j][0]+dp[u_j][1])*dp[u_i][2]*\prod_{j=k+1}^{l}(dp[u_j][0]+dp[u_j][2]))+\prod_{i=1}^{l}(dp[u_j][0]+dp[u_j][1]) dp[v][2]=∑i=k+1l(∏j=1i−1(dp[uj][0]+dp[uj][1])∗dp[ui][2]∗∏j=k+1l(dp[uj][0]+dp[uj][2]))+∏i=1l(dp[uj][0]+dp[uj][1])
마지막 답 은 1 가입 상황 + 1 가입 되 지 않 은 경우 + 1 가입 되 지 않 은 경우 d p [1] [0] + d p [1] [1] [1] [1] dp [1] [0] + dp [1] [1] + dp [1] [1] + dp [1] [1] [1] [1] [1] dp [1] [1] [1] + dp [1] [0] + dp [1] [1] + dp [1] [1] + dp [1] [1] + dp [1] [0] + d p [1] [0] + d p [u] [1] [1] + dp [0] + p [u] [0] + [0] + dp[1] + dp [u] [1] [1]] + dp[1] [1]] [1 u] [0] + d p [u] [2] dp[u] [0] + dp [u] [2] dp [u] [0] + dp [u] [2] 의 접미사 적 구. 복잡 도 O (n) O (n) O (n)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<ll>v[200005];
ll dp[200005][3];
ll f[200005];
ll g[200005];
const int mod=998244353;
void dfs(int p,int u)
{
//printf("%d %d
",p,u);
for(auto x:v[u]){
if(x!=p){
dfs(u,x);
}
}
//printf("%d %d
",p,u);
int l=v[u].size()-(p?1:0);
if(l==0){
dp[u][0]=0;dp[u][1]=1;dp[u][2]=1;
return;
}
int k=0;
while(k<v[u].size()&&v[u][k]!=p)k++;
int cnt=1;
f[0]=1;
for(int i=0;i<v[u].size();i++){
int tmp=v[u][i];
if(tmp==p)continue;
f[cnt]=f[cnt-1]*(dp[tmp][0]+dp[tmp][1])%mod;
cnt++;
}
cnt=l;
g[l+1]=1;
for(int i=v[u].size()-1;i>=0;i--){
int tmp=v[u][i];
if(tmp==p)continue;
g[cnt]=g[cnt+1]*(dp[tmp][0]+dp[tmp][2])%mod;
cnt--;
}
for(int i=1;i<=k;i++){
dp[u][0]=(dp[u][0]+f[i-1]*g[i+1]%mod*dp[v[u][i-1]][2])%mod;
}
dp[u][1]=f[k]*g[k+1]%mod;
for(int i=k+1;i<=l;i++){
dp[u][2]=(dp[u][2]+f[i-1]*g[i+1]%mod*dp[v[u][i]][2])%mod;
}
dp[u][2]=(dp[u][2]+f[l])%mod;
}
void work()
{
int n;
scanf("%d",&n);
for(int i=1;i<n;i++){
int x,y;
scanf("%d%d",&x,&y);
v[x].push_back(y);
v[y].push_back(x);
}
dfs(0,1);
//printf("%lld %lld %lld
",dp[1][0],dp[1][1],dp[1][2]);
printf("%lld
",(dp[1][0]+dp[1][1])%mod);
}
int main()
{
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int T;
//scanf("%d",&T);
//cin>>T;
T=1;
while(T--){
work();
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Codeforces Round #715 Div. 2C The Sports Festival: 구간 DP전형구간 DP의 초전형. 이하, 0-indexed. 입력을 정렬하여 어디서나 시작하고 최적으로 좌우로 계속 유지하면 좋다는 것을 알 수 있습니다. {2000})$의 주문이 된다. 우선, 입력을 소트하여 n개의 요소를 $...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.