QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#482780#1062. 世界地图QZJ12345640 179ms220052kbC++149.2kb2024-07-17 21:30:162024-07-17 21:30:16

Judging History

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

  • [2024-07-17 21:30:16]
  • 评测
  • 测评结果:40
  • 用时:179ms
  • 内存:220052kb
  • [2024-07-17 21:30:16]
  • 提交

answer

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
unsigned int SA, SB, SC;int lim,n,m;
int getweight() {
    SA ^= SA << 16;
    SA ^= SA >> 5;
    SA ^= SA << 1;
    unsigned int t = SA;
    SA = SB;
    SB = SC;
    SC ^= t ^ SA;
    return SC % lim + 1;
}
ll dis[105][10005][2];
void init(){
	int i, j, w;
    for(i = 1; i <= n; i++)
        for(j = 1; j <= m; j++) {
            w = getweight();
            dis[i][j][0]=w;
//            cout<<i<<" "<<j<<" "<<0<<" "<<w<<endl;
        }
    for(i = 1; i < n; i++)
        for(j = 1; j <= m; j++) {
            w = getweight();
            dis[i][j][1]=w;
//            cout<<i<<" "<<j<<" "<<1<<" "<<w<<endl;
        }
}
struct node{
	int to;
	ll val;
	node(int to_,ll val_){
		to=to_,val=val_;
	}
};
struct bcj{
	int fath[100005];
	int get_fath(int i){
		if(i==fath[i])return i;
		return fath[i]=get_fath(fath[i]);
	}
}b;
struct edge{
	int x,y;
	ll z;
	edge(){}
	edge(int x_,int y_,ll z_){
		x=x_,y=y_,z=z_;
	}
}arr[1005];
int tt;
bool cmp(edge x,edge y){
	return x.z<y.z;
}
bool merge(int x,int y){
	int fx=b.get_fath(x),fy=b.get_fath(y);
//	cout<<x<<" "<<y<<" "<<fx<<" "<<fy<<endl;
	if(fx==fy)return 0;
	b.fath[fx]=fy;
	return 1;
}
struct MST{
	int nid[205],cnt;
	ll ans;
	vector<node>vec[405];
}suf[10005],pre[10005];
vector<node>vec1[505],vec2[505];
int fath[505][11],in[505],tim,dep[505];
ll mx[505][11];
int stk[505];
void dfs1(int now,int fa,ll val){
//	cout<<now<<" "<<fa<<" "<<val<<endl;
	fath[now][0]=fa;
	mx[now][0]=val;
	in[now]=++tim;
	for(int i=1;i<=7;i++){
		fath[now][i]=fath[fath[now][i-1]][i-1];
		mx[now][i]=max(mx[now][i-1],mx[fath[now][i-1]][i-1]);
	}
	dep[now]=dep[fa]+1;
	for(auto to:vec1[now]){
		if(to.to==fa)continue;
		dfs1(to.to,now,to.val);
	}
}
int lca(int x,int y){
	if(dep[x]<dep[y])swap(x,y);
	for(int i=7;i>=0;i--){
		if(dep[fath[x][i]]>=dep[y])x=fath[x][i];
	}
	if(x==y)return x;
	for(int i=7;i>=0;i--){
		if(fath[x][i]!=fath[y][i])x=fath[x][i],y=fath[y][i];
	}
	return fath[x][0];
}
ll Getdis(int x,int y){
	ll res=0;
	if(dep[x]<dep[y])swap(x,y);
	for(int i=7;i>=0;i--){
		if(dep[fath[x][i]]>=dep[y])res=max(res,mx[x][i]),x=fath[x][i];
	}
	if(x==y)return res;
	for(int i=7;i>=0;i--){
		if(fath[x][i]!=fath[y][i]){
			res=max(res,mx[x][i]),x=fath[x][i];
			res=max(res,mx[y][i]),y=fath[y][i];
		}
	}
	res=max(res,mx[x][0]),res=max(res,mx[y][0]);
	return res;
}
int a[205],tot,c[505],dy[505],st[505],pos[505];
bool cmp1(int x,int y){
	return in[x]<in[y];
}
int main(){
//	freopen("data.in","r",stdin);
//	freopen("WA.out","w",stdout);
	scanf("%d%d%u%u%u%d", &n, &m, &SA, &SB, &SC, &lim);
	init();
	pre[1].cnt=n;
	for(int i=1;i<=n;i++){
		pre[1].nid[i]=pre[1].nid[i+n]=i;
		if(i!=n){
			pre[1].vec[i].push_back(node(i+1,dis[i][1][1]));
			pre[1].vec[i+1].push_back(node(i,dis[i][1][1]));
			pre[1].ans+=dis[i][1][1];
		}
	}
	for(int i=2;i<=m;i++){
		tt=0;
		pre[i].ans=pre[i-1].ans;
		for(int j=1;j<n;j++)arr[++tt]=edge(pre[i-1].cnt+j,pre[i-1].cnt+j+1,dis[j][i][1]),pre[i].ans+=dis[j][i][1];
		for(int j=1;j<=n;j++)arr[++tt]=edge(pre[i-1].cnt+j,pre[i-1].nid[j+n],dis[j][i-1][0]),pre[i].ans+=dis[j][i-1][0];
		for(int j=1;j<=pre[i-1].cnt;j++){
			for(auto to:pre[i-1].vec[j]){
				if(j<to.to)arr[++tt]=edge(j,to.to,to.val);
			}
		}
		sort(arr+1,arr+1+tt,cmp);
		for(int j=1;j<=pre[i-1].cnt+n;j++){
			pos[j]=0;
			vec1[j].clear();
			b.fath[j]=j;
			for(int k=0;k<=7;k++)fath[j][k]=0,mx[j][k]=0;
		}
		for(int j=1;j<=tt;j++){
//			cout<<arr[j].z<<" "<<arr[j].x<<" "<<arr[j].y<<endl;
			if(merge(arr[j].x,arr[j].y)){
				vec1[arr[j].x].push_back(node(arr[j].y,arr[j].z));
				vec1[arr[j].y].push_back(node(arr[j].x,arr[j].z));
				continue;
			}
			pre[i].ans-=arr[j].z;
		}
//		cout<<endl;
		tim=0;
		dfs1(1,0,0);tot=0;
//		cout<<endl;
		for(int j=1;j<=n;j++){
			a[++tot]=pre[i-1].nid[j];
			pos[a[tot]]=j;
			a[++tot]=pre[i-1].cnt+j;
		}
		sort(a+1,a+1+tot,cmp1);
		int tp=0;
		st[++tp]=1;
		for(int j=1;j<=pre[i-1].cnt+n;j++)c[j]=0,vec2[j].clear(),dy[j]=0;
		for(int j=1;j<=tot;j++){
			int l=lca(st[tp],a[j]);
//			cout<<"lca:"<<st[tp]<<" "<<a[j]<<" "<<l<<endl;
			if(c[l]!=i)c[l]=i;
			while(1){
				if(dep[st[tp-1]]<=dep[l]){
					if(l!=st[tp]){
						vec2[l].push_back(node(st[tp],Getdis(st[tp],l)));
						vec2[st[tp]].push_back(node(l,Getdis(st[tp],l)));
					}
					tp--;
					if(st[tp]!=l)st[++tp]=l;
					break;
				}
				vec2[st[tp-1]].push_back(node(st[tp],Getdis(st[tp-1],st[tp])));
				vec2[st[tp]].push_back(node(st[tp-1],Getdis(st[tp-1],st[tp])));
				tp--;
			}
			if(st[tp]!=a[j])st[++tp]=a[j];
		}
		for(int j=1;j<tp;j++){
			vec2[st[j]].push_back(node(st[j+1],Getdis(st[j+1],st[j])));
			vec2[st[j+1]].push_back(node(st[j],Getdis(st[j+1],st[j])));
		}
//		for(int j=1;j<=4;j++){
//			for(auto to:vec2[j])cout<<j<<" "<<to.to<<' '<<to.val<<endl;
//		}
//		cout<<endl;
		for(int j=1;j<=pre[i-1].cnt+n;j++){
			for(auto to:vec2[j]){
				if(!dy[j]){
					dy[j]=++pre[i].cnt;
					if(j>pre[i-1].cnt)pre[i].nid[j-pre[i-1].cnt+n]=pre[i].cnt;
					if(pos[j])pre[i].nid[pos[j]]=pre[i].cnt;
				}
				if(!dy[to.to]){
					dy[to.to]=++pre[i].cnt;
					if(to.to>pre[i-1].cnt)pre[i].nid[to.to-pre[i-1].cnt+n]=pre[i].cnt;
					if(pos[to.to])pre[i].nid[pos[to.to]]=pre[i].cnt;
				}
				pre[i].vec[dy[j]].push_back(node(dy[to.to],to.val));
			}
		}
	}
	
	suf[m].cnt=n;
	for(int i=1;i<=n;i++){
		suf[m].nid[i]=suf[m].nid[i+n]=i;
		if(i!=n){
			suf[m].vec[i].push_back(node(i+1,dis[i][m][1]));
			suf[m].vec[i+1].push_back(node(i,dis[i][m][1]));
			suf[m].ans+=dis[i][m][1];
		}
	}
	for(int i=m-1;i;i--){
//		cout<<i<<" ";
		tt=0;
		suf[i].ans=suf[i+1].ans;
		for(int j=1;j<n;j++)arr[++tt]=edge(suf[i+1].cnt+j,suf[i+1].cnt+j+1,dis[j][i][1]),suf[i].ans+=dis[j][i][1];
		for(int j=1;j<=n;j++)arr[++tt]=edge(suf[i+1].cnt+j,suf[i+1].nid[j+n],dis[j][i][0]),suf[i].ans+=dis[j][i][0];
		for(int j=1;j<=suf[i+1].cnt;j++){
			for(auto to:suf[i+1].vec[j]){
				if(j<to.to)arr[++tt]=edge(j,to.to,to.val);
			}
		}
		sort(arr+1,arr+1+tt,cmp);
		for(int j=1;j<=suf[i+1].cnt+n;j++){
			pos[j]=0;
			vec1[j].clear();
			b.fath[j]=j;
			for(int k=0;k<=7;k++)fath[j][k]=0,mx[j][k]=0;
		}
		for(int j=1;j<=tt;j++){
//			if(i==m-1)cout<<arr[j].x<<" "<<arr[j].y<<" "<<arr[j].z<<endl;
			if(merge(arr[j].x,arr[j].y)){
				vec1[arr[j].x].push_back(node(arr[j].y,arr[j].z));
				vec1[arr[j].y].push_back(node(arr[j].x,arr[j].z));
				continue;
			}
			suf[i].ans-=arr[j].z;
		}
		tim=0;
		dfs1(1,0,0);tot=0;
		for(int j=1;j<=n;j++){
			a[++tot]=suf[i+1].nid[j];
			pos[a[tot]]=j;
			a[++tot]=suf[i+1].cnt+j;
		}
		sort(a+1,a+1+tot,cmp1);
		int tp=0;
		st[++tp]=1;
		for(int j=1;j<=suf[i+1].cnt+n;j++)c[j]=0,vec2[j].clear(),dy[j]=0;
		for(int j=1;j<=tot;j++){
			int l=lca(st[tp],a[j]);
			if(c[l]!=i)c[l]=i;
			while(1){
				if(dep[st[tp-1]]<=dep[l]){
					if(l!=st[tp]){
						vec2[l].push_back(node(st[tp],Getdis(st[tp],l)));
						vec2[st[tp]].push_back(node(l,Getdis(st[tp],l)));
					}
					tp--;
					if(st[tp]!=l)st[++tp]=l;
					break;
				}
				vec2[st[tp-1]].push_back(node(st[tp],Getdis(st[tp-1],st[tp])));
				vec2[st[tp]].push_back(node(st[tp-1],Getdis(st[tp-1],st[tp])));
				tp--;
			}
			if(st[tp]!=a[j])st[++tp]=a[j];
		}
		for(int j=1;j<tp;j++){
			vec2[st[j]].push_back(node(st[j+1],Getdis(st[j+1],st[j])));
			vec2[st[j+1]].push_back(node(st[j],Getdis(st[j+1],st[j])));
		}
		for(int j=1;j<=suf[i+1].cnt+n;j++){
			for(auto to:vec2[j]){
				if(!dy[j]){
					dy[j]=++suf[i].cnt;
					if(j>suf[i+1].cnt)suf[i].nid[j-suf[i+1].cnt+n]=suf[i].cnt;
					if(pos[j])suf[i].nid[pos[j]]=suf[i].cnt;
				}
				if(!dy[to.to]){
					dy[to.to]=++suf[i].cnt;
					if(to.to>suf[i+1].cnt)suf[i].nid[to.to-suf[i+1].cnt+n]=suf[i].cnt;
					if(pos[to.to])suf[i].nid[pos[to.to]]=suf[i].cnt;
				}
				suf[i].vec[dy[j]].push_back(node(dy[to.to],to.val));
			}
		}
	}
//	for(int i=1;i<=m;i++){
//		cout<<pre[i].ans<<endl;
//		for(int j=1;j<=n;j++)cout<<pre[i].nid[j]<<" ";puts("");
//		for(int j=1;j<=pre[i].cnt;j++){
//			for(auto to:pre[i].vec[j]){
//				cout<<j<<" "<<to.to<<" "<<to.val<<endl;
//			}
//		}
//		cout<<endl;
//	}
//	puts("---------");
//	for(int i=m;i;i--){
//		cout<<suf[i].ans<<endl;
//		for(int j=1;j<=n;j++)cout<<suf[i].nid[j]<<" ";puts("");
//		for(int j=1;j<=suf[i].cnt;j++){
//			for(auto to:suf[i].vec[j]){
//				cout<<j<<" "<<to.to<<" "<<to.val<<endl;
//			}
//		}
//		cout<<endl;
//	}
	int q;
	scanf("%d",&q);
	while(q--){
		int l,r;
		scanf("%d%d",&l,&r);
		tt=0;
		ll ans=pre[l-1].ans+suf[r+1].ans;
		for(int i=1;i<=n;i++){
			ans+=dis[i][m][0];
			arr[++tt]=edge(suf[r+1].nid[i]+pre[l-1].cnt,pre[l-1].nid[i],dis[i][m][0]);
		}
//		cout<<ans<<" ";
		for(int i=1;i<=pre[l-1].cnt;i++){
			for(auto to:pre[l-1].vec[i]){
				if(to.to<i){
					arr[++tt]=edge(i,to.to,to.val);
				}
			}
		}
		for(int i=1;i<=suf[r+1].cnt;i++){
			for(auto to:suf[r+1].vec[i]){
				if(to.to<i){
					arr[++tt]=edge(i+pre[l-1].cnt,to.to+pre[l-1].cnt,to.val);
				}
			}
		}
		for(int i=1;i<=pre[l-1].cnt+suf[r+1].cnt;i++)b.fath[i]=i;
		sort(arr+1,arr+1+tt,cmp);
		for(int i=1;i<=tt;i++){
			if(merge(arr[i].x,arr[i].y))continue;
			ans-=arr[i].z;
		}
		printf("%lld\n",ans);
	}
	return 0;
}

详细

Test #1:

score: 10
Accepted
time: 38ms
memory: 220052kb

input:

50 50 858397672 21575781 421714252 50
50
10 30
25 41
10 44
41 45
47 47
39 42
20 38
28 47
12 15
26 32
9 25
18 26
7 15
5 8
7 31
8 37
41 42
18 21
32 32
14 35
6 22
12 26
42 45
9 23
14 14
5 6
8 24
25 43
37 38
15 46
26 43
35 48
22 30
20 45
21 49
11 12
6 46
15 45
21 43
4 40
4 18
28 37
32 38
18 26
32 32
10 ...

output:

21046
24218
11414
32468
35179
33298
22126
22012
33300
30838
23977
29055
29918
33069
18185
14871
34615
32954
35312
20094
24226
25181
33130
25535
35374
34492
24067
22758
34675
13257
23443
26215
29241
17292
15165
34743
7157
13953
19672
9730
25603
29117
31267
29055
35312
8400
2536
14565
27209
33993

result:

ok 50 lines

Test #2:

score: 0
Memory Limit Exceeded

input:

100 10000 753738892 852022308 109208427 5
10000
6068 9618
3347 9710
3237 5987
428 8918
183 2017
3654 8017
6218 8094
1812 4054
783 4265
638 6139
1780 6091
1559 1706
6627 8952
2958 6234
6213 8049
1860 9764
988 8148
4992 5669
7214 9591
4245 8494
5417 9671
2840 4466
5799 8328
5436 7160
1136 1170
3134 38...

output:

1211623
682743
1361117
283679
1533910
1058719
1526089
1457348
1224581
844519
1068307
1850478
1441600
1262311
1533505
393355
533670
1750612
1431335
1079803
1078983
1572722
1403657
1554603
1871623
1742851
796103
1436810
1618909
1627701
824187
1689150
1552343
1846414
1756497
505159
1260003
174270
83303...

result:


Test #3:

score: 0
Memory Limit Exceeded

input:

100 10000 252296658 470686114 738681417 5
10000
19 9941
4573 8431
1956 8010
6495 7523
1584 9576
3805 7368
945 8568
753 6106
3261 6017
4137 4690
8260 8284
3732 7371
2222 9531
174 6288
4011 4548
7675 8100
787 5858
3504 4912
5358 9086
492 8450
4746 5765
2833 5471
6990 8945
4020 8049
2168 5355
4144 7941...

output:

14776
1154093
741074
1685175
377030
1209281
446018
873015
1360987
1773494
1873502
1195181
505818
729771
1776734
1797785
925822
1613267
1178272
383399
1687330
1382812
1510227
1121331
1279314
1165058
781005
726730
964577
989349
1175799
1824181
1485743
1279135
1225339
594598
1482362
1727286
655503
1852...

result:


Test #4:

score: 10
Accepted
time: 134ms
memory: 213300kb

input:

1 10000 171380702 78283356 95463589 1000000000
300000
2866 9527
1368 3641
8547 9622
1710 5284
3041 9484
984 9571
2839 3647
5663 8848
8026 8600
7300 9784
510 4151
3111 9321
4378 4895
990 5806
2438 3661
1680 4894
1629 3165
1982 5285
2889 7265
387 3227
669 1395
5546 6488
74 3424
270 6207
509 518
279 91...

output:

1603289365972
3725016792897
4289545851500
3090001725177
1707389603747
677676134474
4428828830089
3243732939555
4519318185589
3605953230641
3076099184075
1812557746149
4530044194578
2505624713463
4229007401433
3264345621855
4057299323184
3225483188449
2697490604818
3434409901613
4438097816271
4329018...

result:

ok 300000 lines

Test #5:

score: 10
Accepted
time: 176ms
memory: 216384kb

input:

2 10000 274134852 279286565 744539633 1000000000
300000
1457 3215
5541 7081
6313 7973
670 4949
3425 8087
6139 6619
695 3800
7532 8343
5959 7017
6912 8042
7533 8728
1224 2877
359 6569
5752 5906
1720 3244
2070 3553
4732 8576
179 551
515 8656
1962 7775
2022 9067
690 2846
2047 2671
1137 8559
1349 7168
4...

output:

5477001280973
5611523257417
5537315630440
3794711171610
3535471770801
6323223914309
4580772497023
6102708394766
5945876722548
5885604544265
5849217345115
5546619600870
2512881639605
6527329416108
5637011461020
5663080665892
4091018500635
6399362487560
1230705483628
2774960893445
1966805369253
520653...

result:

ok 300000 lines

Test #6:

score: 10
Accepted
time: 179ms
memory: 216044kb

input:

2 10000 734766235 309378503 610268282 1000000000
300000
8879 9378
26 9684
6078 8954
7926 8887
4050 7388
951 5130
1991 3091
375 5194
242 1706
1669 1727
9485 9972
5638 8314
4679 5883
4955 6823
4621 7586
348 2348
420 2340
1001 8241
5672 6005
5238 6510
1604 9325
4921 7060
20 3348
3576 9918
7655 8802
286...

output:

6316508944189
218298135044
4735457476186
6027486790948
4424182259889
3886123944524
5937796481642
3454065317288
5664230993454
6614047676609
6333322924341
4879394088851
5855623275532
5402516827740
4680300834131
5311810257921
5369465136126
1833940845223
6440262666077
5794652391437
1521847364172
5224681...

result:

ok 300000 lines

Test #7:

score: 0
Memory Limit Exceeded

input:

100 10000 784936363 827067061 800454511 1000000000
10000
2056 2962
5233 5350
1346 2099
8529 8825
2358 3371
3217 6419
1175 9635
2998 7699
1494 9244
2710 5459
1647 8372
6360 8398
1256 9955
1252 1473
4171 4704
4867 7373
3208 7839
2949 8996
4731 7531
8915 9536
2199 5546
2265 6448
1463 9131
2358 2383
625...

output:

218107916833770
236956297236591
221611594649234
232654372445039
215511117763537
163015473624889
37013079700783
127182022450125
54041351200568
173843674045542
78674875729514
191084774917088
31305721956998
234464326245872
227032500475120
179858820611878
128837146174236
94963670830748
172797399335623
2...

result:


Test #8:

score: 0
Memory Limit Exceeded

input:

100 10000 72129929 485897764 129463885 1000000000
10000
383 7372
2861 4738
5799 7101
3570 9122
3175 4173
1444 7532
6191 9348
3164 6316
2122 4663
1589 2869
4784 7741
3529 5974
4792 7378
6016 8170
864 1289
1647 7570
293 1602
1054 8521
6193 9882
4543 5121
956 5006
1858 7086
4117 7517
9736 9847
7917 865...

output:

72090982299191
194600560760132
208326087759066
106457378837533
215695913806908
93645900885474
163942628341738
164031689768437
178662309764579
208841353815076
168610752734842
180880159627225
177470699352697
187964294311616
229294854382327
97557084520879
208227727138432
60656821171511
151175099594593
...

result:


Test #9:

score: 0
Memory Limit Exceeded

input:

100 10000 963446001 261040754 78671748 1000000000
10000
1308 8621
2948 6287
2647 3069
103 5392
3204 9085
7669 8375
2823 5662
6455 7017
530 4194
567 9892
2436 9869
3149 6625
3015 7571
1051 1155
30 5077
1138 9673
8598 9184
5453 8895
902 7796
2749 5653
334 2677
4818 7123
2693 8574
1945 2913
6278 7799
6...

output:

64264200768233
159631014825609
229412046850098
112894812377726
98703295232189
222675254882181
171598041130418
226137587624448
151655725634932
16103717296049
61433187417017
156336180363989
130459314798835
237120775693771
118682572200864
34995983081351
225547690108471
157054836420411
74239996440524
17...

result:


Test #10:

score: 0
Memory Limit Exceeded

input:

100 10000 64237141 422265017 577403465 1000000000
10000
1335 3887
3017 4150
13 5940
619 9252
2124 8016
6189 8581
3524 6793
5826 9716
880 1859
6383 6421
1312 3139
4259 6148
1005 2744
1353 8445
6463 9223
6923 9215
901 1803
1202 1820
1053 6563
3677 7206
7691 9391
4533 8068
4360 7698
4769 8394
1629 5350...

output:

178476322146618
212581735474540
97664015826725
32720953154164
98586242468815
182463260674934
161421747872055
146457120526990
216189917671016
238821446345616
195878926340178
194435416584804
198022374418219
69770884358102
173557137328055
184789377313284
218050741659725
224873943256047
107596574583740
...

result: