QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#761317#9533. Classical Counting Problemscallionsong0 915ms21804kbC++145.8kb2024-11-18 22:00:582024-11-18 22:00:58

Judging History

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

  • [2024-11-18 22:00:58]
  • 评测
  • 测评结果:0
  • 用时:915ms
  • 内存:21804kb
  • [2024-11-18 22:00:58]
  • 提交

answer

bool M1;
#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/hash_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
#define uint unsigned int
#define ll long long
#define ull unsigned long long
#define LL __int128
#define db double
#define LD long double
#define Pii pair<int,int>
#define Pll pair<ll,ll>
#define Pull pair<ull,ull>
#define Pdb pair<db,db>
#define fir first
#define sec second
#define vec vector<int>
#define pb push_back
#define qlr cerr<<"qlr\n"
#define dyh cerr<<"dyh\n"
#define pc(x) __builtin_popcount(x)
#define uni(x,y) uniform_int_distribution<int>(x,y)(rng)
#define unl(x,y) uniform_int_distribution<ll>(x,y)(rng)
#define unr(x,y) uniform_real_distribution<double>(x,y)(rng)
#define F(i,a,b) for(int i=a,i##end=b;i<=i##end;i++)
#define UF(i,a,b) for(int i=a,i##end=b;i>=i##end;i--)
#define look_memory cerr<<'\n'<<abs(&M1-&M2)/1024.0/1024<<'\n'
#define look_time cerr<<'\n'<<clock()*1.0/CLOCKS_PER_SEC<<'\n'
mt19937 rng(time(0)^(*new int));
const int INF=0x3f3f3f3f;
const int Mod=998244353;
template<typename T>
inline void inc(T &a,T b){
	if(b<0) b+=Mod;
	a+=b;
	if(a>=Mod) a-=Mod;
}
template<typename T>
inline void dec(T &a,T b){
	if(b<0) b+=Mod;
	a-=b;
	if(a<0) a+=Mod;
}
template<typename T>
inline void muc(T &a,T b){
	a=a*b%Mod;
}
template<typename T>
inline bool chkmin(T &a,T b){
	if(a<=b) return false;
	a=b;
	return true;
}
template<typename T>
inline bool chkmax(T &a,T b){
	if(a>=b) return false;
	a=b;
	return true;
}
int T,n;
uint ans;
vec e[100010];
struct Dsu{
	#define N 100000
	int fa[N+10];
	void init(int n){
		F(i,1,n) fa[i]=i;
	}
	int fd(int x){
		return fa[x]==x?x:fa[x]=fd(fa[x]);
	}
	void merge(int x,int y){
		x=fd(x),y=fd(y);
		fa[x]=y;
	}
	#undef N
}dsu;
struct Tree{
	#define N 100000
	int n,rt;
	int fth[N+10],siz[N+10],son[N+10],top[N+10],dfn[N+10];
	vec e[N+10];
	void dfs1(int u,int fa){
		fth[u]=fa;
		siz[u]=1;
		son[u]=0;
		for(auto v:e[u]){
			if(v==fa) continue;
			dfs1(v,u);
			siz[u]+=siz[v];
			if(siz[v]>siz[son[u]]) son[u]=v;
		}
	}
	void dfs2(int u,int fa,int topf){
		top[u]=topf;
		dfn[u]=++dfn[0];
		if(son[u]) dfs2(son[u],u,topf);
		for(auto v:e[u]){
			if(v==fa||v==son[u]) continue;
			dfs2(v,u,v);
		}
	}
	void build(){
		dfs1(rt,0);
		dfs2(rt,0,rt);
		dfn[0]=0;
	}
	vec get_chain(int x){
		vec res;
		while(x){
			res.pb(x);
			x=son[x];
		}
		return res;
	}
	#undef N
}T1,T2;
struct Seg{
	#define N 100000
	#define ls k*2
	#define rs k*2+1
	uint a[N+10];
	uint w1[N*4+10],w2[N*4+10],w3[N*4+10],tag[N*4+10];//b,a*c,a*b*c
	void update(int k){
		w1[k]=w1[ls]+w1[rs];
		w2[k]=w2[ls]+w2[rs];
		w3[k]=w3[ls]+w3[rs];
	}
	void down(int k){
		if(tag[k]){
			w1[ls]+=tag[k];
			w3[ls]+=w2[ls]*tag[k];
			tag[ls]+=tag[k];
			w1[rs]+=tag[k];
			w3[rs]+=w2[rs]*tag[k];
			tag[rs]+=tag[k];
			tag[k]=0;
		}
	}
	void build(int k,int L,int R){
		w1[k]=0,w2[k]=0,tag[k]=0;
		if(L==R) return;
		int mid=(L+R)>>1;
		build(ls,L,mid);
		build(rs,mid+1,R);
	}
	void change1(int k,int L,int R,int x,int y){
		if(L==R){
			w2[k]=a[L]*y;
			w3[k]=w1[k]*w2[k];
			return;
		}
		down(k);
		int mid=(L+R)>>1;
		if(x<=mid) change1(ls,L,mid,x,y);
		else change1(rs,mid+1,R,x,y);
		update(k);
	}
	void change2(int k,int L,int R,int x,int y,int z){
		if(L==R){
			w3[k]+=w2[k]*z;
			tag[k]+=z;
			return;
		}
		down(k);
		int mid=(L+R)>>1;
		if(x<=mid) change2(ls,L,mid,x,y,z);
		if(y>mid) change2(rs,mid+1,R,x,y,z);
		update(k);
	}
	uint query(int k,int L,int R,int x,int y){
		if(L>=x&&R<=y) return w3[k];
		down(k);
		int mid=(L+R)>>1;
		if(y<=mid) return query(ls,L,mid,x,y);
		else if(x>mid) return query(rs,mid+1,R,x,y);
		else return query(ls,L,mid,x,y)+query(rs,mid+1,R,x,y);
	}
	#undef N
	#undef ls
	#undef rs
}seg;
void add(int x){
	seg.change1(1,1,n,T2.dfn[x],1);
	while(x){
		seg.change2(1,1,n,T2.dfn[T2.top[x]],T2.dfn[x],1);
		x=T2.fth[T2.top[x]];
	}
}
void del(int x){
	seg.change1(1,1,n,T2.dfn[x],0);
	while(x){
		seg.change2(1,1,n,T2.dfn[T2.top[x]],T2.dfn[x],-1);
		x=T2.fth[T2.top[x]];
	}
}
void dfs1(int u,int fa){
	add(u);
	for(auto v:T1.e[u]){
		if(v==fa) continue;
		dfs1(v,u);
	}
}
void dfs2(int u,int fa){
	del(u);
	for(auto v:T1.e[u]){
		if(v==fa) continue;
		dfs2(v,u);
	}
}
uint query(int x){
	uint res=0;
	while(x){
		res+=seg.query(1,1,n,T2.dfn[T2.top[x]],T2.dfn[x]);
		x=T2.fth[T2.top[x]];
	}
	return res;
}
void solve(){
	cin>>n;
	F(i,1,n) e[i].clear();
	F(i,1,n-1){
		int x,y;
		cin>>x>>y;
		e[x].pb(y);
		e[y].pb(x);
	}
	T1.n=n,T1.rt=1;
	F(i,1,n) T1.e[i].clear();
	dsu.init(n);
	UF(i,n,1){
		for(auto j:e[i]){
			if(j<i) continue;
			T1.e[i].pb(dsu.fd(j));
			dsu.merge(j,i);
		}
	}
	T2.n=n,T2.rt=n;
	F(i,1,n) T2.e[i].clear();
	dsu.init(n);
	F(i,1,n){
		for(auto j:e[i]){
			if(j>i) continue;
			T2.e[i].pb(dsu.fd(j));
			dsu.merge(j,i);
		}
	}
	T1.build();
	T2.build();
	ans=0;
	F(i,1,n) seg.a[T2.dfn[i]]=i;
	seg.build(1,1,n);
	F(i,1,n){
		if(T1.top[i]!=i) continue;
		vec V=T1.get_chain(i);
		reverse(V.begin(),V.end());
		for(auto j:V){
			add(j);
			for(auto k:T1.e[j]){
				if(k!=T1.fth[j]&&k!=T1.son[j]) dfs1(k,j);
			}
			ans+=j*query(j);
		}
		for(auto j:V){
			del(j);
			for(auto k:T1.e[j]){
				if(k!=T1.fth[j]&&k!=T1.son[j]) dfs2(k,j);
			}
		}
	}
	cout<<ans<<'\n';
}
bool M2;
int main(){
//	freopen("ex_a4.in","r",stdin);
//	freopen("monotone.out","w",stdout);
	srand(time(0)^(*new int));
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>T;
	while(T--) solve();
	look_memory;
	look_time;
	return 0;
}
/*
1
3
1 3
2 3

6
3
1 2
2 3
3
1 3
2 3
7
2 1
3 1
4 1
5 1
6 5
7 6
6
2 1
3 1
4 1
5 4
6 1
9
2 1
3 2
4 3
5 1
6 4
7 5
8 2
9 3
9
2 1
3 2
4 3
5 4
6 5
7 2
8 3
9 5
*/

Details

Tip: Click on the bar to expand more detailed information

Subtask #1:

score: 0
Wrong Answer

Test #1:

score: 0
Wrong Answer
time: 35ms
memory: 21244kb

input:

10000
10
10 2
5 2
7 2
1 7
4 10
6 2
3 7
9 7
8 5
10
6 5
1 6
9 5
4 6
3 1
7 5
2 4
8 4
10 5
10
7 6
1 6
4 1
3 4
5 1
9 1
8 7
10 6
2 8
10
8 7
5 7
9 7
3 5
4 3
2 4
6 8
1 7
10 4
10
10 3
2 3
9 2
1 2
4 2
6 4
5 4
7 4
8 4
10
6 1
3 6
7 6
5 6
9 7
2 5
4 1
10 9
8 6
10
3 5
6 5
1 6
10 3
4 1
7 1
8 1
9 3
2 10
10
9 10
3 9
...

output:

1312
1581
1137
2292
1055
3707
840
2594
1008
3113
739
1646
1368
2019
1187
1236
2185
2238
1631
1989
1842
3264
1801
955
1543
3445
2041
1396
1738
857
1373
2082
1701
2325
1022
1491
1438
1782
1232
1650
2007
1786
2183
1096
1248
1637
785
1007
1734
1223
2595
785
3433
1403
1533
1774
3420
1890
2161
2616
1315
1...

result:

wrong answer 1st lines differ - expected: '1592', found: '1312'

Subtask #2:

score: 0
Wrong Answer

Test #2:

score: 0
Wrong Answer
time: 54ms
memory: 20148kb

input:

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

output:

19906
24302
32103
17764
13163
17271
43913
39052
15529
17543
18263
17892
19638
12424
11443
15766
17207
28490
10835
42747
10379
28174
9356
29569
9864
11860
34763
26714
15696
18970
25924
17918
16129
17344
14493
12360
22273
14592
13593
14979
9108
16373
13836
42802
20906
10801
23852
11312
12218
14944
212...

result:

wrong answer 1st lines differ - expected: '20721', found: '19906'

Subtask #3:

score: 0
Wrong Answer

Test #4:

score: 0
Wrong Answer
time: 71ms
memory: 21804kb

input:

2500
40
29 30
24 29
36 29
7 24
18 36
4 18
21 24
17 21
1 17
14 30
19 24
34 19
12 34
11 30
23 30
16 34
38 14
35 24
27 29
20 34
3 17
22 17
31 21
26 14
5 14
2 20
15 16
39 4
37 38
10 3
25 22
33 29
32 10
13 35
9 18
8 2
6 23
40 34
28 7
40
32 10
33 32
2 32
7 10
22 7
21 10
31 22
40 32
37 32
25 22
16 22
39 10...

output:

495194
285393
93176
166378
155042
365317
495027
111197
190310
84806
168172
210961
379670
125003
381652
105293
207293
278300
175330
157307
199275
114144
102629
289257
285319
210791
284875
111604
320311
90330
159872
293403
198787
167044
297911
300373
302631
315902
146816
156698
321405
356356
232619
29...

result:

wrong answer 1st lines differ - expected: '810633', found: '495194'

Subtask #4:

score: 0
Wrong Answer

Test #8:

score: 0
Wrong Answer
time: 146ms
memory: 20552kb

input:

500
200
63 7
145 63
78 145
103 63
163 7
97 163
57 7
186 78
30 145
25 57
56 97
112 25
50 7
162 50
105 112
126 57
32 126
95 105
188 105
124 112
86 186
82 162
143 162
194 95
183 97
101 82
197 82
200 186
96 143
146 124
164 197
54 95
195 57
131 143
130 146
193 112
36 97
16 163
62 193
93 124
121 96
1 96
1...

output:

81520674
60752260
33528594
178372891
157395321
100953574
71915361
91277324
152020937
66292577
196139564
69047929
71795551
161486330
128892583
79411884
90455851
168218287
89228040
102778175
108591128
80862264
90859459
102541558
220767642
99768495
128065429
63165016
53914467
112557695
60521022
9983533...

result:

wrong answer 1st lines differ - expected: '126443395', found: '81520674'

Subtask #5:

score: 0
Wrong Answer

Test #13:

score: 0
Wrong Answer
time: 915ms
memory: 20968kb

input:

33
3000
1322 1797
2442 1797
626 2442
1979 2442
485 1979
1428 1979
2196 1979
1499 1797
1936 2442
2921 1979
751 1499
2182 2921
979 1499
935 1979
1136 485
1880 1797
1084 2921
349 751
482 349
1009 979
1003 349
2056 482
2959 1136
1288 751
496 2442
1693 935
2045 1499
868 1009
1264 1428
2891 868
1045 1288
...

output:

3484656904
3375594481
3986040462
2683925645
2603897830
2911674516
3766223533
940844005
3485967305
3167583245
1836716657
562214061
513670860
3780663808
1921690830
2454258849
2524042330
3068109349
3234493125
2942968394
2863681163
1898307844
568242919
2557561907
682419267
936683860
4285631096
254197217...

result:

wrong answer 1st lines differ - expected: '3914500827', found: '3484656904'

Subtask #6:

score: 0
Time Limit Exceeded

Test #18:

score: 0
Time Limit Exceeded

input:

1
98303
65520 65521
65521 65519
65519 65522
65522 65517
65517 65518
65518 65516
65516 65523
65523 65513
65513 65514
65514 65512
65512 65515
65515 65510
65510 65511
65511 65509
65509 65524
65524 65505
65505 65506
65506 65504
65504 65507
65507 65502
65502 65503
65503 65501
65501 65508
65508 65498
6549...

output:


result:


Subtask #7:

score: 0
Time Limit Exceeded

Test #22:

score: 0
Time Limit Exceeded

input:

1
100000
16150 88283
9425 88283
87988 88283
52935 88283
69816 88283
51311 88283
6910 9425
59991 87988
54743 6910
19614 52935
22926 69816
91163 88283
17233 19614
64177 19614
92097 91163
57414 9425
96321 6910
17859 54743
59810 69816
66565 17859
9948 96321
84506 59810
3928 64177
63031 54743
6214 87988
...

output:


result: