本人水平有限,题解不到为处,请多多谅解
本蒟蒻谢谢大家观看
如何让一份自己写的程序跑一遍随机造的数据,这时我们要用到
数据生成。
本文只介绍树的生成(我是不会告诉你我现在只会树)
题目:传送门
普通树的生成:(随机生成10个数据)
注意:最后第10个数据要手动调试,虽然我也不知道为什么。
以下上半部分是树,下半部分是题目要求。
code:
1 #include<iostream>
2 #include<stdlib.h>
3 #include<time.h>
4 inline int random(int x) {
5 return (rand()*RAND_MAX+rand())%x;
6 }
7 inline int rendom(int l,int r) {
8 return (rand()*RAND_MAX+rand())%(r-l+1)+l;
9 }
10 using namespace std;
11 int main(){
12 // freopen("bbb.in","r",stdin);
13 srand(time(0));
14 char si[]="bbb1.in",so[]="bbb1.out";
15 for(int i=1;i<=10;i++) {
16 freopen(si,"w",stdout);
17 si[3]=so[3]='1'+i;
18 cerr<<i<<endl;
19 int x=random(100000);
20 printf("%d\n",x);
21 for (int i=2;i<=x;i++){
22 int fa=random(i-1)+1;
23 int val=random(100000)+1;
24 //int a=random(10),b=random(10),c=random(10);
25 printf("%d %d %d\n",fa,i,val);
26 }int m=random(100000);
27 printf("%d\n",m);
28 // set<int> s;
29 for (int i=1;i<=m;i++){
30 int a=rendom(1,x);
31 int b=rendom(1,x);
32 int c=rendom(1,x);
33 int d=rendom(1,x);
34 if(a>b)swap(a,b);
35 if(c>d)swap(c,d);
36 printf("%d %d %d %d\n",a,b,c,d);
37 // while(s.size()<=4){
38 // s.insert(random(1,1e5));
39 // }
40 // while(s.size()){
41 // s.insert(random(1,1e5));
42 // }
43 }
44 }
45 return 0;
46 }
同理,随机生成树的链如下:
code:
1 #include<iostream>
2 #include<stdlib.h>
3 #include<time.h>
4 inline int random(int x) {
5 return (rand()*RAND_MAX+rand())%x;
6 }
7 inline int rendom(int l,int r) {
8 return (rand()*RAND_MAX+rand())%(r-l+1)+l;
9 }
10 using namespace std;
11 int main(){
12 // freopen("bbb.in","r",stdin);
13 srand(time(0));
14 char si[]="bbb2.in",so[]="bbb2.out";
15 // for(int i=1;i<=10;i++) {
16 freopen(si,"w",stdout);
17 // si[3]=so[3]='1'+i;
18 // cerr<<i<<endl;
19 int x=random(100000);
20 printf("%d\n",x);
21 for (int i=2;i<=x;i++){
22 int fa=rendom(max(1,i-10),i-1);
23 int val=random(10000)+1;
24 //int a=random(10),b=random(10),c=random(10);
25 printf("%d %d %d\n",fa,i,val);
26 }int m=random(100000);
27 printf("%d\n",m);
28 // set<int> s;
29 for (int i=1;i<=m;i++){
30 int a=rendom(1,x);
31 int b=rendom(1,x);
32 int c=rendom(1,x);
33 int d=rendom(1,x);
34 if(a>b)swap(a,b);
35 if(c>d)swap(c,d);
36 printf("%d %d %d %d\n",a,b,c,d);
37 // while(s.size()<=4){
38 // s.insert(random(1,1e5));
39 // }
40 // while(s.size()){
41 // s.insert(random(1,1e5));
42 // }
43 }
44 // }
45 return 0;
46 }
随机生成菊花图如下:
code:
1 #include<iostream>
2 #include<stdlib.h>
3 #include<time.h>
4 inline int random(int x) {
5 return (rand()*RAND_MAX+rand())%x;
6 }
7 inline int rendom(int l,int r) {
8 return (rand()*RAND_MAX+rand())%(r-l+1)+l;
9 }
10 using namespace std;
11 int main(){
12 // freopen("bbb.in","r",stdin);
13 srand(time(0));
14 char si[]="bbb3.in",so[]="bbb1.out";
15 // for(int i=1;i<=10;i++) {
16 freopen(si,"w",stdout);
17 // si[3]=so[3]='1'+i;
18 // cerr<<i<<endl;
19 int x=random(100000);
20 printf("%d\n",x);
21 for (int i=2;i<=x/2;i++){
22 int fa=rendom(1,min(i-1,10));
23 int val=random(10000)+1;
24 //int a=random(10),b=random(10),c=random(10);
25 printf("%d %d %d\n",fa,i,val);
26 }for (int i=x/2+1;i<=x;i++){
27 int fa=rendom(max(1,i-10),i-1);
28 int val=random(10000)+1;
29 //int a=random(10),b=random(10),c=random(10);
30 printf("%d %d %d\n",fa,i,val);
31 }int m=random(100000);
32 printf("%d\n",m);
33 // set<int> s;
34 for (int i=1;i<=m;i++){
35 int a=rendom(1,x);
36 int b=rendom(1,x);
37 int c=rendom(1,x);
38 int d=rendom(1,x);
39 if(a>b)swap(a,b);
40 if(c>d)swap(c,d);
41 printf("%d %d %d %d\n",a,b,c,d);
42 // while(s.size()<=4){
43 // s.insert(random(1,1e5));
44 // }
45 // while(s.size()){
46 // s.insert(random(1,1e5));
47 // }
48 }
49 // }
50 return 0;
51 }
以上数据生成只能生成读入的数据,并不能输出标算。
标算输出如下:
注:freopen内的数字要自己手动不断更新从1~10 。
code:
1 #include <bits/stdc++.h>
2 using namespace std;
3 typedef long long ll;
4 int n,m,first[100010]={0},tot=0;
5 int st[200010],top=0,dep[100010],pos[100010];
6 int mnp[200010][21],p[200010];
7 int seg[400010][2];
8 ll dis[100010];
9 struct edge
10 {
11 int v,next;
12 ll d;
13 }e[200010];
14
15 void insert(int a,int b,ll d)
16 {
17 e[++tot].v=b;
18 e[tot].d=d;
19 e[tot].next=first[a];
20 first[a]=tot;
21 }
22
23 void dfs(int v,int fa)
24 {
25 st[++top]=v;
26 pos[v]=top;
27
28 for(int i=first[v];i;i=e[i].next)
29 if (e[i].v!=fa)
30 {
31 dep[e[i].v]=dep[v]+1;
32 dis[e[i].v]=dis[v]+e[i].d;
33 dfs(e[i].v,v);
34 st[++top]=v;
35 }
36 }
37
38 void rmq_init()
39 {
40 for(int i=1;i<=top;i++)
41 mnp[i][0]=st[i];
42 for(int i=1;i<=20;i++)
43 for(int j=1;j+(1<<i)-1<=top;j++)
44 {
45 if (dep[mnp[j][i-1]]<dep[mnp[j+(1<<(i-1))][i-1]])
46 mnp[j][i]=mnp[j][i-1];
47 else mnp[j][i]=mnp[j+(1<<(i-1))][i-1];
48 }
49 p[1]=0;
50 for(int i=2;i<=top;i++)
51 {
52 if (1<<(p[i-1]+1)<i) p[i]=p[i-1]+1;
53 else p[i]=p[i-1];
54 }
55 }
56
57 int rmq(int l,int r)
58 {
59 int x=p[r-l+1];
60 if (dep[mnp[l][x]]<dep[mnp[r-(1<<x)+1][x]])
61 return mnp[l][x];
62 else return mnp[r-(1<<x)+1][x];
63 }
64
65 ll dist(int a,int b)
66 {
67 int g=rmq(min(pos[a],pos[b]),max(pos[a],pos[b]));
68 return dis[a]+dis[b]-2ll*dis[g];
69 }
70
71 void merge(int a1,int a2,int b1,int b2,int &s1,int &s2)
72 {
73 ll ans=0;
74 if (dist(a1,a2)>ans) ans=dist(a1,a2),s1=a1,s2=a2;
75 if (dist(a1,b1)>ans) ans=dist(a1,b1),s1=a1,s2=b1;
76 if (dist(a1,b2)>ans) ans=dist(a1,b2),s1=a1,s2=b2;
77 if (dist(a2,b1)>ans) ans=dist(a2,b1),s1=a2,s2=b1;
78 if (dist(a2,b2)>ans) ans=dist(a2,b2),s1=a2,s2=b2;
79 if (dist(b1,b2)>ans) ans=dist(b1,b2),s1=b1,s2=b2;
80 }
81
82 void pushup(int no)
83 {
84 merge(seg[no<<1][0],seg[no<<1][1],seg[no<<1|1][0],seg[no<<1|1][1],seg[no][0],seg[no][1]);
85 }
86
87 void buildtree(int no,int l,int r)
88 {
89 if (l==r)
90 {
91 seg[no][0]=seg[no][1]=l;
92 return;
93 }
94 int mid=(l+r)>>1;
95 buildtree(no<<1,l,mid);
96 buildtree(no<<1|1,mid+1,r);
97 pushup(no);
98 }
99
100 void query(int no,int l,int r,int s,int t,int &ans1,int &ans2)
101 {
102 if (l>=s&&r<=t)
103 {
104 merge(ans1,ans2,seg[no][0],seg[no][1],ans1,ans2);
105 return;
106 }
107 int mid=(l+r)>>1;
108 if (s<=mid) query(no<<1,l,mid,s,t,ans1,ans2);
109 if (t>mid) query(no<<1|1,mid+1,r,s,t,ans1,ans2);
110 }
111
112 int main()
113 {
114 freopen("bbb1.in","r",stdin);
115 freopen("bbb1.out","w",stdout);
116 scanf("%d",&n);
117 for(int i=1;i<n;i++)
118 {
119 int x,y;
120 ll z;
121 scanf("%d%d%lld",&x,&y,&z);
122 insert(x,y,z),insert(y,x,z);
123 }
124 top=0;
125 dep[1]=dis[1]=0;
126 dfs(1,0);
127 rmq_init();
128
129 buildtree(1,1,n);
130 scanf("%d",&m);
131 for(int i=1;i<=m;i++)
132 {
133 int a,b,c,d;
134 scanf("%d%d%d%d",&a,&b,&c,&d);
135 int a1=a,a2=a,b1=c,b2=c;
136 ll ans=0;
137 query(1,1,n,a,b,a1,a2);
138 query(1,1,n,c,d,b1,b2);
139 ans=max(ans,dist(a1,b1));
140 ans=max(ans,dist(a1,b2));
141 ans=max(ans,dist(a2,b1));
142 ans=max(ans,dist(a2,b2));
143 printf("%lld\n",ans);
144 }
145 return 0;
146 }
在不断按键运行程序即可
这样一份10组数据就这样造好了。