★★ 输入文件:
时间限制:1 s 内存限制:128 MB
linkb.in
输出文件:
linkb.out
简单对比时间限制:1 s 内存限制:128 MB
【题目描述】
爆搜60(cogs),然而在luogu all TLE:
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cmath> 5 #include<cstring> 6 #define ll long long 7 8 using namespace std; 9 const int N=2000100; 10 const int mod=10007; 11 12 int head[N]; 13 int now=1; 14 ll Answer; 15 ll AnsMax=-1; 16 ll va[N]; 17 18 struct node{ 19 int u,v,nxt; 20 }E[N]; 21 22 inline int read() 23 { 24 int x=0,f=1; 25 char c=getchar(); 26 while(c<'0'||c>'9') {if(c=='-')f=-1; c=getchar();} 27 while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar(); 28 return x*f; 29 } 30 31 inline void add(int u,int v) 32 { 33 E[now].u=u; 34 E[now].v=v; 35 E[now].nxt=head[u]; 36 head[u]=now; 37 now++; 38 } 39 40 inline void bfs(int x) 41 { 42 for(int i=head[x];i!=-1;i=E[i].nxt) 43 { 44 int v=E[i].v; 45 for(int j=head[v];j!=-1;j=E[j].nxt) 46 { 47 if(E[j].v==x)continue ; 48 AnsMax=max(AnsMax,va[x]*va[E[j].v]); 49 Answer+=(va[x]%mod*va[E[j].v]%mod)%mod; 50 } 51 } 52 } 53 54 int main() 55 { 56 57 freopen("linkb.in","r",stdin); 58 freopen("linkb.out","w",stdout); 59 int n=read(); 60 61 for(int i=1;i<=n;i++) 62 head[i]=-1; 63 64 for(int i=1;i<=n-1;i++) 65 { 66 int u=read(); 67 int v=read(); 68 add(u,v); 69 add(v,u); 70 } 71 72 for(int i=1;i<=n;i++) 73 va[i]=read(); 74 75 for(int i=1;i<=n;i++) 76 bfs(i); 77 78 printf("%lld %lld",AnsMax,Answer%mod); 79 return 0; 80 }
AC 牛B 代码:
看不懂,甚至语法:
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<iomanip> 7 #include<cstdlib> 8 #include<vector> 9 #include<queue> 10 11 using namespace std; 12 const int SIZEN=200010,MOD=10007; 13 14 int N; 15 vector<int> c[SIZEN]; 16 vector<int> son[SIZEN]; 17 int W[SIZEN]; 18 int fa[SIZEN]= {0}; 19 vector<int> Blis; 20 21 class PAIR { 22 public: 23 int mx; 24 int s; 25 void print(void) { 26 cout<<"("<<mx<<" "<<s<<")"; 27 } 28 void clear(void) { 29 mx=s=0; 30 } 31 PAIR(void) { 32 mx=s=0; 33 } 34 }; 35 36 PAIR mkpr(int x,int y) { 37 PAIR a; 38 a.mx=x,a.s=y; 39 return a; 40 } 41 PAIR operator + (PAIR a,PAIR b) { 42 PAIR c; 43 c.mx=max(a.mx,b.mx); 44 c.s=(a.s+b.s)%MOD; 45 return c; 46 } 47 48 PAIR P[SIZEN]; 49 PAIR sp[SIZEN]; 50 void update_1(int x) { //子之子 51 for(int i=0; i<son[x].size(); i++) { 52 int u=son[x][i]; 53 P[x]=P[x]+sp[u]; 54 sp[x]=sp[x]+mkpr(W[u],W[u]); 55 } 56 } 57 PAIR pre[SIZEN],suf[SIZEN]; 58 void update_2(int x) { //x兄弟之间 59 if(son[x].size()<=1) return; 60 int u=son[x].front(); 61 pre[0]=mkpr(W[u],W[u]); 62 for(int i=1; i<son[x].size(); i++) { 63 u=son[x][i]; 64 pre[i]=pre[i-1]+mkpr(W[u],W[u]); 65 P[u]=P[u]+pre[i-1]; 66 } 67 u=son[x].back(); 68 suf[son[x].size()-1]=mkpr(W[u],W[u]); 69 for(int i=son[x].size()-2; i>=0; i--) { 70 u=son[x][i]; 71 suf[i]=suf[i+1]+mkpr(W[u],W[u]); 72 P[u]=P[u]+suf[i+1]; 73 } 74 } 75 queue<int> Q; 76 bool vis[SIZEN]= {0}; 77 int f[SIZEN]; 78 void BFS(int S) { 79 memset(fa,0,sizeof(fa)); 80 memset(vis,0,sizeof(vis)); 81 while(!Q.empty()) Q.pop(); 82 for(int i=1; i<=N; i++) son[i].clear(); 83 Blis.clear(); 84 vis[S]=true; 85 Q.push(S); 86 f[S]=0; 87 while(!Q.empty()) { 88 int x=Q.front(); 89 Q.pop(); 90 Blis.push_back(x); 91 for(int i=0; i<c[x].size(); i++) { 92 int u=c[x][i]; 93 if(u==fa[x]) continue; 94 fa[u]=x; 95 son[x].push_back(u); 96 f[u]=f[x]+1; 97 Q.push(u); 98 } 99 } 100 } 101 void work_big(void) { 102 BFS(1); 103 for(int i=1; i<=N; i++) { //父之父 104 if(fa[fa[i]]!=0) { 105 int u=fa[fa[i]]; 106 P[i]=P[i]+mkpr(W[u],W[u]); 107 } 108 } 109 for(int i=Blis.size()-1; i>=0; i--) update_1(Blis[i]); //子之子 110 for(int i=0; i<Blis.size(); i++) update_2(Blis[i]); //兄弟 111 int mx=0,sum=0; 112 for(int i=1; i<=N; i++) { 113 mx=max(mx,W[i]*P[i].mx); 114 sum+=(W[i]*P[i].s)%MOD; 115 sum%=MOD; 116 } 117 printf("%d %d\n",mx,sum); 118 } 119 void work_small(void) { //其实这个傻叉了 120 int mxw=0,wsum=0; 121 for(int i=1; i<=N; i++) { 122 BFS(i); 123 for(int j=1; j<=N; j++) { 124 if(f[j]==2) { 125 int now=W[i]*W[j]; 126 mxw=max(mxw,now); 127 wsum+=now; 128 wsum%=MOD; 129 } 130 } 131 } 132 printf("%d %d\n",mxw,wsum); 133 } 134 void read(void) { 135 scanf("%d",&N); 136 int a,b; 137 for(int i=1; i<N; i++) { 138 scanf("%d%d",&a,&b); 139 c[a].push_back(b); 140 c[b].push_back(a); 141 } 142 for(int i=1; i<=N; i++) scanf("%d",&W[i]); 143 } 144 int main() { 145 freopen("linkb.in","r",stdin); 146 freopen("linkb.out","w",stdout); 147 read(); 148 work_big(); 149 return 0; 150 }
高:
1 #include<cstdio> 2 #include<iostream> 3 4 using namespace std; 5 6 const int N=2e5+5,mo=10007; 7 8 struct cs{ 9 int to,nxt; 10 }a[N*2]; 11 12 int head[N],ll,v[N]; 13 int n,ans,x,y,maxans; 14 15 void init(int x,int y) 16 { 17 a[++ll].to=y; 18 a[ll].nxt=head[x]; 19 head[x]=ll; 20 } 21 22 void work(int x) 23 { 24 int sum=0,ma=0,m=0; 25 for(int k=head[x];k;k=a[k].nxt) 26 { 27 if(v[a[k].to]>ma){m=ma;ma=v[a[k].to];}else 28 if(v[a[k].to]>m)m=v[a[k].to]; 29 ans=(ans+sum*v[a[k].to])%mo; 30 sum=(sum+v[a[k].to])%mo; 31 } 32 maxans=max(maxans,ma*m); 33 } 34 int main() 35 { 36 freopen("linkb.in","r",stdin); 37 freopen("linkb.out","w",stdout); 38 scanf("%d",&n); 39 for(int i=1;i<n;i++) 40 { 41 scanf("%d%d",&x,&y); 42 init(x,y); init(y,x); 43 } 44 45 for(int i=1;i<=n;i++)scanf("%d",&v[i]); 46 for(int i=1;i<=n;i++)work(i); 47 printf("%d %d",maxans,(ans*2)%mo); 48 return 0; 49 }