cogs luogu 1804. [NOIP2014]联合权值 WD

★★   输入文件: 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 }

 

转载于:https://www.cnblogs.com/lyqlyq/p/6904789.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值