QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#704780 | #8938. Crawling on a Tree | chenxinyang2006 | WA | 1ms | 4020kb | C++20 | 2.6kb | 2024-11-02 21:00:57 | 2024-11-02 21:00:57 |
Judging History
answer
#include <bits/stdc++.h>
#define rep(i,j,k) for(int i=(j);i<=(k);i++)
#define per(i,j,k) for(int i=(j);i>=(k);i--)
#define uint unsigned int
#define ll long long
#define ull unsigned long long
#define db double
#define ldb long double
#define pii pair<int,int>
#define pll pair<ll,ll>
#define mkp make_pair
#define eb emplace_back
#define SZ(S) (int)S.size()
//#define mod 998244353
//#define mod 1000000007
#define inf 0x3f3f3f3f
#define linf 0x3f3f3f3f3f3f3f3f
using namespace std;
template <class T>
void chkmax(T &x,T y){
if(x < y) x = y;
}
template <class T>
void chkmin(T &x,T y){
if(x > y) x = y;
}
inline int popcnt(int x){
return __builtin_popcount(x);
}
inline int ctz(int x){
return __builtin_ctz(x);
}
/*ll power(ll p,int k = mod - 2){
ll ans = 1;
while(k){
if(k % 2 == 1) ans = ans * p % mod;
p = p * p % mod;
k /= 2;
}
return ans;
}*/
int n,m;
int a[10005];
int cnt;
int head[10005];
struct eg{
int to,nxt,w,k;
}edge[20005];
void make(int u,int v,int w,int k){
edge[++cnt].to = v;
edge[cnt].w = w;
edge[cnt].k = k;
edge[cnt].nxt = head[u];
head[u] = cnt;
}
ll ssum;
int fa[10005],_l[10005],_r[10005],_val[10005];
void dfs(int u,int f){
int sum = 0;
fa[u] = f;
for(int i = head[u];i;i = edge[i].nxt){
int v = edge[i].to;
if(v == f) continue;
dfs(v,u);
_val[v] = edge[i].w;
ssum += 2ll * _val[v] * a[v];
_l[v] = 2 * a[v] - edge[i].k;
_r[v] = a[v];
sum += a[v];
}
chkmax(a[u],sum);
}
ll dp[1005][1005],temp[1005];
void dfs2(int u){
fill(dp[u],dp[u] + m + 1,-linf);
dp[u][0] = 0;
for(int i = head[u];i;i = edge[i].nxt){
int v = edge[i].to;
if(v == fa[u]) continue;
dfs2(v);
fill(temp,temp + m + 1,-linf);
rep(j,0,m){
rep(k,0,m - j) chkmax(temp[j + k],dp[u][j] + dp[v][k]);
}
copy(temp,temp + m + 1,dp[u]);
}
/* printf("node %d\n",u);
rep(i,0,m) printf("%lld ",dp[u][i]);
printf("\n");*/
rep(i,1,m) chkmax(dp[u][i],dp[u][i - 1]);
rep(i,0,m){
dp[u][i] += 1ll * i * _val[u];
if(i < _l[u] || i > _r[u]) dp[u][i] = -linf;
}
// rep(i,0,m) printf("%lld ",dp[u][i]);
// printf("\n");
}
int main(){
// freopen("test.in","r",stdin);
scanf("%d%d",&n,&m);
rep(i,1,n - 1){
int u,v,w,k;
scanf("%d%d%d%d",&u,&v,&w,&k);
make(u,v,w,k);make(v,u,w,k);
}
rep(u,2,n) scanf("%d",&a[u]);
dfs(1,0);
_l[1] = 0;_r[1] = m;
// rep(u,1,n) printf("%d ",a[u]);
// printf("\n");
// rep(u,1,n) printf("[%d,%d]\n",_l[u],_r[u]);
dfs2(1);
rep(i,1,m){
chkmax(dp[1][i],dp[1][i - 1]);
if(dp[1][i] == -linf) printf("-1\n");
else printf("%lld\n",ssum - dp[1][i]);
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 3836kb
input:
4 2 1 2 3 2 2 3 2 1 2 4 5 1 1 1 1
output:
-1 13
result:
ok 2 number(s): "-1 13"
Test #2:
score: 0
Accepted
time: 0ms
memory: 3840kb
input:
4 2 1 2 3 2 2 3 2 1 2 4 5 1 2 2 2
output:
-1 -1
result:
ok 2 number(s): "-1 -1"
Test #3:
score: 0
Accepted
time: 0ms
memory: 3824kb
input:
2 1 2 1 1 1 1
output:
1
result:
ok 1 number(s): "1"
Test #4:
score: 0
Accepted
time: 0ms
memory: 3912kb
input:
2 50 2 1 1 1 50
output:
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
result:
ok 50 numbers
Test #5:
score: 0
Accepted
time: 0ms
memory: 4020kb
input:
2 50 2 1 1 50 50
output:
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 50
result:
ok 50 numbers
Test #6:
score: -100
Wrong Answer
time: 1ms
memory: 3972kb
input:
2 50 1 2 1 100000 50
output:
99 98 97 96 95 94 93 92 91 90 89 88 87 86 85 84 83 82 81 80 79 78 77 76 75 74 73 72 71 70 69 68 67 66 65 64 63 62 61 60 59 58 57 56 55 54 53 52 51 50
result:
wrong answer 1st numbers differ - expected: '-1', found: '99'