本人水平有限,题解不到为处,请多多谅解
本蒟蒻谢谢大家观看
如何让一份自己写的程序跑一遍随机造的数据,这时我们要用到
数据生成。
本文只介绍树的生成(我是不会告诉你我现在只会树)
题目:传送门
普通树的生成:(随机生成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组数据就这样造好了。