NC214095. RikkawithGenerals
描述
输入描述
The first line contains a single integer , representing the number of test cases.
For each test case, the first line contains a single integer , representing the number of cities.
Then n-1 lines follow, each line with two integers , representing a road between city u and city v.
The last line contains n integers , representing the initial award plan.
The input guarantees that is a permutation of length n, and .
输出描述
For each test case, output a single line with a single integer, the number of possible award plans. The answer may be very large, you are only required to output the answer module 998244353.
示例1
输入:
1 5 1 2 1 3 3 4 3 5 2 1 5 4 3
输出:
7
说明:
For simplicity, we use to represent an award plan, where represents the city of the i-th general. There are 7 possible award plans:C++(clang++11) 解法, 执行用时: 451ms, 内存消耗: 43328K, 提交时间: 2021-03-31 20:15:04
#include<bits/stdc++.h> #define fi first #define se second using namespace std; const int N=2e5+100, P=998244353; int T, n, a[N], p[N], las[N], vis[N]; vector< int > nxt[N]; map<int, int > f[N]; void upd(int &x) {x += (x >> 31 & P);} int main() { cin >> T; while(T--) { cin >> n; for(int i=1;i < n;++i) { int x, y; cin >> x >> y; nxt[x].push_back(y); nxt[y].push_back(x); } for(int i=1;i <= n;++i) cin >> p[i], a[p[i]]=i; for(int i=1;i <= n;++i) { for(auto t:nxt[i]) vis[p[t]]=1; las[i]=p[i]; while(vis[las[i]-1]) --las[i]; for(auto t:nxt[i]) vis[p[t]]=0; for(auto &t:nxt[i]) t=p[t]; sort(nxt[i].begin(), nxt[i].end()); } f[1][a[1]]=1; for(int i=1;i < n;++i) for(auto it:f[i]) { int x=it.fi, val=it.se; upd(f[i+1][a[i+1]] += val-P); auto t=upper_bound(nxt[x].begin(), nxt[x].end(), i); if(t != nxt[x].end()) { if(*t == i+1) upd(f[i+1][x] += val-P); else if(las[a[*t]] <= i+1) upd(f[*t][a[*t-1]] += val-P); } } int ans=0; for(auto it:f[n]) upd(ans += it.se-P); printf("%d\n", ans); for(int i=1;i <= n;++i) nxt[i].clear(), f[i].clear(); } return 0; }