zoukankan      html  css  js  c++  java
  • Codeforces 348

    题解移步至:http://blog.csdn.net/huzecong/article/details/12174359 (斜眼笑)

    A:

     1 #include<cstdio>
     2 #include<cstdlib>
     3 #include<cstring>
     4 
     5 using namespace std;
     6 
     7 int n;
     8 
     9 int main()
    10 {
    11     scanf("%d",&n);
    12     int max=0;
    13     long long sum=0;
    14     for (int a=1;a<=n;a++)
    15     {
    16         int v;
    17         scanf("%d",&v);
    18         if (v>max) max=v;
    19         sum+=v;
    20     }
    21     sum=(sum-1)/(n-1)+1;
    22     if (sum>max) printf("%I64d
    ",sum);
    23     else printf("%d
    ",max);
    24 
    25     return 0;
    26 }
    View Code

    B:

     1 #include<cstdio>
     2 #include<cstdlib>
     3 #include<cstring>
     4 #include<algorithm>
     5 
     6 using namespace std;
     7 
     8 const int maxn=100010;
     9 const long long INF=100000000000000ll;
    10 
    11 int n,en,q[maxn],f[maxn];
    12 
    13 long long z[maxn],minv[maxn],least[maxn];
    14 
    15 struct edge
    16 {
    17     int e;
    18     edge *next;
    19 }*v[maxn],ed[maxn<<1];
    20 
    21 void add_edge(int s,int e)
    22 {
    23     en++;
    24     ed[en].next=v[s];v[s]=ed+en;v[s]->e=e;
    25 }
    26 
    27 long long gcd(long long a,long long b)
    28 {
    29     if (!b) return a;
    30     else return gcd(b,a%b);
    31 }
    32 
    33 int main()
    34 {
    35     scanf("%d",&n);
    36     long long ans=0;
    37     for (int a=1;a<=n;a++)
    38         scanf("%I64d",&z[a]),ans+=z[a];
    39     for (int a=1;a<n;a++)
    40     {
    41         int s,e;
    42         scanf("%d%d",&s,&e);
    43         add_edge(s,e);
    44         add_edge(e,s);
    45     }
    46     int front=1,tail=1;
    47     q[1]=1;
    48     for (;front<=tail;)
    49     {
    50         int now=q[front++];
    51         for (edge *e=v[now];e;e=e->next)
    52             if (e->e!=1 && !f[e->e])
    53             {
    54                 f[e->e]=now;
    55                 q[++tail]=e->e;
    56             }
    57     }
    58     for (int a=n;a>=1;a--)
    59     {
    60         int now=q[a];
    61         minv[now]=INF;
    62         least[now]=1;
    63         int tot=0;
    64         for (edge *e=v[now];e;e=e->next)
    65             if (e->e!=f[now])
    66             {
    67                 tot++;
    68                 minv[now]=min(minv[now],minv[e->e]*least[e->e]);
    69                 least[now]=least[now]/gcd(least[now],least[e->e])*least[e->e];
    70             }
    71         if (!tot) 
    72         {
    73             minv[now]=z[now];
    74             continue;
    75         }
    76         if (least[now]) minv[now]=minv[now]/least[now];
    77         else minv[now]=0;
    78         least[now]*=tot;
    79     }
    80     printf("%I64d
    ",ans-least[1]*minv[1]);
    81 
    82     return 0;
    83 }
    View Code

    C:

     1 #include<cstdio>
     2 #include<cstdlib>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<algorithm>
     6 #include<vector>
     7 
     8 using namespace std;
     9 
    10 const int maxn=100010;
    11 const int maxs=350;
    12 
    13 int n,m,q,delta[maxn][maxs],num[maxn],to[maxn];
    14 
    15 long long z[maxn],res[maxs],col[maxs];
    16 
    17 bool use[maxs][maxn];
    18 
    19 char s[4];
    20 
    21 vector<int> y[maxn];
    22 
    23 int main()
    24 {
    25     scanf("%d%d%d",&n,&m,&q);
    26     for (int a=1;a<=n;a++)
    27         scanf("%I64d",&z[a]);
    28     int limit=0;
    29     for (int a=1;a<=m;a++)
    30     {
    31         scanf("%d",&num[a]);
    32         for (int b=1;b<=num[a];b++)
    33         {
    34             int v;
    35             scanf("%d",&v);
    36             y[a].push_back(v);
    37         }
    38         limit+=num[a];
    39     }
    40     limit=(int)(sqrt(limit));
    41     int cnt=0;
    42     for (int a=1;a<=m;a++)
    43         if (num[a]>limit)
    44         {
    45             to[a]=++cnt;
    46             for (int b=0;b<num[a];b++)
    47                 use[cnt][y[a][b]]=true,res[cnt]+=z[y[a][b]];
    48         }
    49     for (int a=1;a<=m;a++)
    50         for (int b=1;b<=cnt;b++)
    51             for (int c=0;c<num[a];c++)
    52                 delta[a][b]+=use[b][y[a][c]];
    53     for (int a=1;a<=q;a++)
    54     {
    55         scanf("%s",s);
    56         if (s[0]=='?')
    57         {
    58             int p;
    59             scanf("%d",&p);
    60             long long ans=0;
    61             if (num[p]<=limit)
    62             {
    63                 for (int b=0;b<num[p];b++)
    64                     ans+=z[y[p][b]];
    65                 for (int b=1;b<=cnt;b++)
    66                     ans+=col[b]*delta[p][b];
    67             }
    68             else
    69             {
    70                 ans=res[to[p]];
    71                 for (int b=1;b<=cnt;b++)
    72                     ans+=col[b]*delta[p][b];
    73             }
    74             printf("%I64d
    ",ans);
    75         }
    76         else
    77         {
    78             int p,x;
    79             scanf("%d%d",&p,&x);
    80             if (num[p]<=limit)
    81             {
    82                 for (int b=0;b<num[p];b++)
    83                     z[y[p][b]]+=x;
    84                 for (int b=1;b<=cnt;b++)
    85                     res[b]+=(long long)x*delta[p][b];
    86             }
    87             else col[to[p]]+=x;
    88         }
    89     }
    90 
    91     return 0;
    92 }
    View Code

    D:

     1 #include<cstdio>
     2 #include<cstdlib>
     3 #include<cstring>
     4 
     5 using namespace std;
     6 
     7 #define inc(a,b) {a+=b;if (a>=mo) a-=mo;}
     8 
     9 const int maxn=3010;
    10 const int mo=1000000007;
    11 
    12 int n,m,f[maxn][maxn];
    13 
    14 char s[maxn][maxn];
    15 
    16 int solve(int x1,int y1,int x2,int y2)
    17 {
    18     memset(f,0,sizeof(f));
    19     f[x1][y1]=1;
    20     for (int a=x1;a<=x2;a++)
    21         for (int b=y1;b<=y2;b++)
    22             if (s[a][b]=='.')
    23             {
    24                 inc(f[a+1][b],f[a][b]);
    25                 inc(f[a][b+1],f[a][b]);
    26             }
    27             else f[a][b]=0;
    28     return f[x2][y2];
    29 }
    30 
    31 int main()
    32 {
    33     scanf("%d%d",&n,&m);
    34     for (int a=1;a<=n;a++)
    35         scanf("%s",s[a]+1);
    36     printf("%d
    ",(int)((((long long)solve(1,2,n-1,m)*solve(2,1,n,m-1)-(long long)solve(1,2,n,m-1)*solve(2,1,n-1,m))%mo+mo)%mo));
    37 
    38     return 0;
    39 }
    View Code
  • 相关阅读:
    02-单臂路由实验
    线程高级篇-读写锁ReentrantReadWriteLock
    线程高级篇-Lock锁和Condition条件
    002 flutter的路由管理--命名路由
    fluuter的路由管理--普通路由
    003 文档的操作
    002 索引的操作
    001 elasticsearch的核心概念
    002 使用nacos完成服务的注册和发现
    001 Nacos的基础内容
  • 原文地址:https://www.cnblogs.com/zhonghaoxi/p/3350315.html
Copyright © 2011-2022 走看看