• 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
    ",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
    ",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 }
  • 相关阅读:
    Java程序运行机制及开发环境
    Redis源码分析(八)--- t_hash哈希转换
    Redis源码分析(八)--- t_hash哈希转换
    Redis源码分析(八)--- t_hash哈希转换
    Redis源码分析(九)--- t_list,t_string的分析
    Redis源码分析(九)--- t_list,t_string的分析
    Redis源码分析(九)--- t_list,t_string的分析
    Redis源码分析(十)--- testhelp.h小型测试框架和redis-check-aof.c日志检测
    Redis源码分析(十)--- testhelp.h小型测试框架和redis-check-aof.c日志检测
    Redis源码分析(十)--- testhelp.h小型测试框架和redis-check-aof.c日志检测
  • 原文地址:https://www.cnblogs.com/lyqlyq/p/6904789.html
Copyright © 2020-2023  润新知