QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#629273#7502. Painting the Roadslsj2009TL 60ms6264kbC++202.3kb2024-10-11 10:11:222024-10-11 10:11:25

Judging History

你现在查看的是最新测评结果

  • [2024-10-11 10:11:25]
  • 评测
  • 测评结果:TL
  • 用时:60ms
  • 内存:6264kb
  • [2024-10-11 10:11:22]
  • 提交

answer

#include<bits/stdc++.h>
//#pragma GCC optimize(3,"Ofast","inline")
//#define int long long
#define i128 __int128
#define ll long long
#define ull unsigned long long
#define uint unsigned int
#define ld double
#define PII pair<int,int>
#define INF 0x3f3f3f3f
#define INFLL 0x3f3f3f3f3f3f3f3f
#define chkmax(a,b) a=max(a,b)
#define chkmin(a,b) a=min(a,b)
#define rep(k,l,r) for(int k=l;k<=r;++k)
#define per(k,r,l) for(int k=r;k>=l;--k)
#define cl(f,x) memset(f,x,sizeof(f))
#define pcnt(x) __builtin_popcount(x)
#define lg(x) (31-__builtin_clz(x))
using namespace std;
void file_IO() {
//	system("fc .out .ans");
	freopen(".in","r",stdin);
	freopen(".out","w",stdout);
}
bool M1;
const int N=1e4+5;
int head[N],len;
struct node {
	int to,c,w,nxt;
}; node edge[N<<1];
void add_edge(int u,int v,int c,int w) {
	edge[++len]={v,c,w,head[u]}; head[u]=len;
}
int f[N][N],tmp[N],siz[N],n,m;
int cnt[N];
void dfs(int u,int fa) {
	rep(i,-n,0)
		f[u][n+i+cnt[u]]=0;
	siz[u]=1;
	for(int i=head[u];i;i=edge[i].nxt) {
		int v=edge[i].to,c=edge[i].c,w=edge[i].w;
		if(v!=fa) {
			dfs(v,u);
			rep(i,-n,+n) {
				tmp[n+i]=f[u][n+i];
				f[u][n+i]=INF;
			}
			rep(i,-n,+n) {
				rep(j,-n,+n) {
					if((abs(j)&1)==c)
						chkmin(f[u][n+i+j],tmp[n+i]+f[v][n+j]+abs(j)*w);
				}
			}
			siz[u]+=siz[v];
		}
	}
}
/*
5
3 2
1 2 1 1
2 3 2 1
1 3
4 2
1 2 3 1
2 3 1 0
3 4 4 1
1 2
5 4
1 2 3 0
2 3 1 1
3 4 2 0
4 5 2 1
1 1 1 1
5 2
1 2 2 1
1 3 3 0
1 5 2 1
3 4 1 1
1 2
10 5
1 2 10 1
2 3 3 1
3 4 4 0
4 5 4 1
5 6 2 1
2 7 8 0
2 8 9 1
4 9 1 0
1 10 4 0
10 10 2 1 8
*/
void solve() {
	len=0;
	rep(i,1,n)
		head[i]=cnt[i]=0;
	rep(i,1,n) {
		rep(j,0,n+n)
			f[i][j]=INF;
	}
	scanf("%d%d",&n,&m);
	rep(i,1,n) {
		rep(j,0,n+n)
			f[i][j]=INF;
	}
	rep(i,2,n) {
		int u,v,w,c;
		scanf("%d%d%d%d",&u,&v,&w,&c);
		add_edge(u,v,c,w);
		add_edge(v,u,c,w);
	}
	while(m--) {
		int x;
		scanf("%d",&x);
		++cnt[x];
	}
	dfs(1,0);
	printf("%d\n",f[1][n]>=INF? -1:f[1][n]);
}
bool M2;
signed main() {
	//file_IO();
	int testcase=1;
	scanf("%d",&testcase);
	while(testcase--)
		solve();
	fprintf(stderr,"used time = %ldms\n",1000*clock()/CLOCKS_PER_SEC);
	fprintf(stderr,"used memory = %lldMB\n",(&M2-&M1)/1024/1024);
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 1ms
memory: 3972kb

input:

5
3 2
1 2 1 1
2 3 2 1
1 3
4 2
1 2 3 1
2 3 1 0
3 4 4 1
1 2
5 4
1 2 3 0
2 3 1 1
3 4 2 0
4 5 2 1
1 1 1 1
5 2
1 2 2 1
1 3 3 0
1 5 2 1
3 4 1 1
1 2
10 5
1 2 10 1
2 3 3 1
3 4 4 0
4 5 4 1
5 6 2 1
2 7 8 0
2 8 9 1
4 9 1 0
1 10 4 0
10 10 2 1 8

output:

3
9
21
-1
42

result:

ok 5 number(s): "3 9 21 -1 42"

Test #2:

score: 0
Accepted
time: 0ms
memory: 6112kb

input:

1000
5 5
1 2 4 1
2 3 9 0
3 4 10 1
3 5 8 1
1 5 2 5 1
5 3
1 2 7 1
1 3 7 0
2 4 9 0
3 5 4 1
3 4 3
5 3
1 2 7 1
2 3 1 0
1 4 7 1
4 5 5 1
4 4 3
5 1
1 2 3 1
1 3 6 0
2 4 10 0
2 5 7 0
1
5 3
1 2 10 1
1 3 10 0
1 4 1 1
3 5 4 0
2 5 2
5 5
1 2 7 0
1 3 5 0
2 4 8 1
2 5 10 0
2 2 3 5 4
5 4
1 2 6 1
1 3 4 0
3 4 4 0
1 5 5 ...

output:

22
-1
19
3
11
8
11
7
8
0
10
1
1
7
5
28
12
-1
19
16
12
13
-1
32
9
18
16
14
10
12
16
0
11
-1
17
-1
9
14
27
8
11
-1
6
6
15
18
46
0
14
9
-1
5
8
22
-1
-1
17
-1
25
6
0
24
6
15
21
15
22
-1
6
0
65
20
5
28
20
0
20
19
18
-1
10
0
16
9
19
6
21
11
11
4
6
20
11
0
8
8
31
8
23
-1
8
-1
11
-1
9
13
-1
-1
19
9
20
19
6
...

result:

ok 1000 numbers

Test #3:

score: 0
Accepted
time: 7ms
memory: 6104kb

input:

250
20 10
1 2 10 1
1 3 3 1
2 4 6 0
4 5 8 0
2 6 5 0
4 7 1 1
1 8 6 0
4 9 2 1
3 10 9 1
3 11 1 0
6 12 10 0
6 13 8 0
13 14 7 0
14 15 10 1
1 16 4 0
12 17 2 0
17 18 8 1
18 19 3 0
2 20 4 1
15 14 20 20 9 17 4 4 13 13
20 6
1 2 4 1
1 3 10 1
2 4 10 1
3 5 1 1
2 6 6 0
4 7 5 1
3 8 8 1
7 9 7 0
6 10 3 1
6 11 4 1
8 1...

output:

47
-1
84
68
61
112
39
-1
-1
48
71
-1
-1
77
-1
-1
59
97
-1
-1
74
52
-1
-1
-1
84
48
-1
68
60
57
-1
79
68
-1
79
51
-1
33
48
62
-1
-1
113
84
44
-1
79
-1
76
64
-1
-1
110
42
40
56
81
-1
73
68
-1
74
125
67
44
-1
103
-1
-1
-1
89
64
-1
85
-1
50
-1
64
-1
-1
94
46
75
-1
-1
-1
101
67
61
-1
-1
18
100
57
102
-1
-...

result:

ok 250 numbers

Test #4:

score: 0
Accepted
time: 60ms
memory: 6264kb

input:

100
50 43
1 2 7 1
1 3 5 0
2 4 9 0
1 5 8 0
2 6 5 1
6 7 8 1
1 8 10 0
5 9 2 1
1 10 4 0
2 11 3 0
11 12 6 0
2 13 9 1
7 14 5 0
12 15 7 0
2 16 5 0
15 17 4 1
1 18 6 1
16 19 5 1
5 20 7 1
10 21 6 1
14 22 2 0
14 23 3 1
18 24 2 1
22 25 8 1
12 26 6 0
5 27 1 0
21 28 1 1
27 29 9 1
25 30 7 0
22 31 9 0
9 32 7 0
26 3...

output:

149
233
-1
204
-1
145
164
-1
-1
-1
185
182
-1
145
252
-1
-1
160
186
163
-1
256
182
173
202
238
410
-1
169
-1
259
-1
103
117
171
-1
-1
-1
163
-1
-1
265
-1
-1
-1
162
136
140
-1
-1
217
211
193
114
246
251
133
176
-1
-1
219
139
195
-1
214
180
-1
223
132
153
-1
-1
-1
172
310
102
-1
200
-1
-1
195
-1
-1
20...

result:

ok 100 numbers

Test #5:

score: -100
Time Limit Exceeded

input:

10
500 815
1 2 8 1
1 3 1 0
1 4 4 1
4 5 5 0
4 6 8 0
3 7 7 0
5 8 2 1
4 9 9 1
2 10 9 1
1 11 3 1
1 12 9 0
2 13 2 0
5 14 1 1
3 15 1 1
3 16 4 0
5 17 8 0
4 18 9 0
4 19 4 0
2 20 7 0
4 21 7 1
5 22 9 1
2 23 10 1
3 24 7 0
1 25 7 0
1 26 2 0
4 27 4 1
1 28 9 0
3 29 3 1
2 30 6 0
3 31 10 1
1 32 3 1
1 33 2 1
3 34 2 ...

output:


result: