码迷,mamicode.com
首页 > 其他好文 > 详细

冯志远0918

时间:2017-09-19 23:08:51      阅读:225      评论:0      收藏:0      [点我收藏+]

标签:max   mst   eof   math   内存   using   ==   预处理   iostream   

数列

时间限制: 1 Sec  内存限制: 256 MB
提交: 32  解决: 27
[提交][状态][讨论版]

题目描述

 

输入

 

输出

 

样例输入

3 5

样例输出

5

提示

 

技术分享

宝藏

时间限制: 1 Sec  内存限制: 256 MB
提交: 65  解决: 43
[提交][状态][讨论版]

题目描述

技术分享

输入

技术分享

输出

技术分享

样例输入

6 1 2 1 2 3 3 3 4 36 3 6 13 3 5 2 6 8 9 10 13 1

样例输出

30 29 28 10 30 16

提示

 

技术分享

 只打了两道题,第一题题忘记判断浮点运算了,被坑了10分.

第一题发现,新的数就是大数不断减小数而产生的数,因此可以发现去模,然后就可以了.

第二题一眼可以看出是树上dp,这道题,预处理关于该点位根的子树,离开,或者停留.

然后,分情况讨论,在找最小点的时候,需要寻找两个点,这个应该许多树上dp都是有的,

情况需要仔细,向上的情况,整棵树的情况,这些都需要细细考虑,有一些明显可以贪心的

应该直接优化,而不是浪费多余的代码,尝试了读入优化,从上面过来时,需要将上面加入或者不去上面,注意

最后去哪里,这个和双倍花费很有关系,一般做这些题的时候可以发现,三次经过时绝对不需要的,因此暴力可以

优化许多.

T1  

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cmath>
 5 #include<cstring>
 6  
 7 using namespace std;
 8  
 9 long long x,y,z,ans;
10  
11 int main()
12 {
13      
14     scanf("%lld%lld",&x,&y);
15     ans=0;
16     while (x%y!=0)
17     {
18         if (x<y) swap(x,y);
19         ans=ans+x/y;
20         z=x,x=y,y=z%y;
21         if (y==0) break;
22     }
23     if (y!=0) ans=ans+x/y+1;
24     else ans+=1;
25     printf("%lld",ans);
26 }

T2

  1 #include<cstdio>
  2 #include<iostream>
  3 #include<algorithm>
  4 #include<cstring>
  5 #include<cmath>
  6 
  7 #define ll long long
  8 #define N 300007
  9 #define inf 1e9+7
 10 using namespace std;
 11 
 12 int n,a[N];
 13 int cnt,head[N],next[N*2],rea[N*2],cost[N*2];
 14 ll f[N],g[N],ckt[N],ckg[N],upd[N],up[N];
 15 bool boo[N];
 16 
 17 inline int read()
 18 {
 19     int x=0;char ch=getchar();
 20     while(ch>9||ch<0) ch=getchar();
 21     while(ch>=0&&ch<=9)
 22     {
 23         x=x*10+ch-0;
 24         ch=getchar();
 25     }
 26     return x;
 27 }
 28 void add(int x,int y,int z)
 29 {
 30     cnt++;
 31     next[cnt]=head[x];
 32     rea[cnt]=y;
 33     cost[cnt]=z;
 34     head[x]=cnt;
 35 }
 36 void dfs_init(int x,int fa)
 37 {
 38     f[x]=g[x]=a[x]; 
 39     ll s=0;
 40     for(int i=head[x];i!=-1;i=next[i])
 41     {
 42         int v=rea[i],fee=cost[i]; 
 43         if(v!=fa)
 44         {
 45                dfs_init(v,x);
 46             s=s+max(0LL,f[v]-2*fee);
 47         }
 48     }
 49     upd[x]=s,f[x]=s+a[x]; 
 50     for(int i=head[x];i!=-1;i=next[i])
 51     {
 52         int v=rea[i],fee=cost[i];
 53         if(v!=fa) 
 54         {
 55                ll left=s-max(0LL,f[v]-2*fee); 
 56             g[x]=max(g[x],left+max(g[v],f[v])-fee+a[x]);
 57         }
 58     }
 59 }
 60 void dfs_solve(int x,int fa)
 61 {
 62     ll s=0,left=0;
 63     for(int i=head[x];i!=-1;i=next[i])
 64     {
 65         int v=rea[i],fee=cost[i];
 66         if(v!=fa) s=s+max(0LL,f[v]-2*fee);      
 67     }
 68     s=s+max(0LL,ckt[x]);
 69     for(int i=head[x];i!=-1;i=next[i])
 70     {
 71         int v=rea[i],fee=cost[i];
 72         if(v!=fa) 
 73         {
 74                left=s-max(0LL,f[v]-2*fee);
 75             up[v]=max(up[v],left-2*fee);
 76             ckt[v]=max(ckt[v],left-2*fee+a[v]);
 77         }
 78     }
 79     ll s1=0,s2=0,p1=0,p2=0;
 80     for(int i=head[x];i!=-1;i=next[i])
 81     {
 82         int v=rea[i],fee=cost[i]; 
 83         if(v!=fa) 
 84         {
 85                left=s-max(0LL,f[v]-2*fee)+g[v]-fee;
 86             if(left>s1) s2=s1,p2=p1,s1=left,p1=v;
 87             else if(left>s2) s2=left,p2=v;
 88         }
 89     }
 90     left=s-max(0LL,ckt[x])+ckg[x];
 91     if(left>s1) s2=s1,p2=p1,s1=left,p1=x;
 92     else if(left>s2) s2=left,p2=x;
 93     for(int i=head[x];i!=-1;i=next[i])
 94     {
 95         int v=rea[i],fee=cost[i];
 96         if(v!=fa) 
 97         {
 98             if(p1==v) ckg[v]=max(ckg[v],s2-fee+a[v]-max(0LL,f[v]-2*fee));
 99             else ckg[v]=max(ckg[v],s1-fee+a[v]-max(0LL,f[v]-2*fee));
100         }
101     }
102     for(int i=head[x];i!=-1;i=next[i])
103     {
104         int v=rea[i];
105         if (v==fa) continue;
106         dfs_solve(rea[i],x);
107     }
108 }
109 void prepare()
110 {
111     n=read();
112     memset(head,-1,sizeof(head));
113     for(int i=1;i<n;i++)
114     {
115         int x=read(),y=read(),z=read();
116         add(x,y,z),add(y,x,z);
117     }
118     for(int i=1;i<=n;i++) 
119     {
120         a[i]=read();
121         ckt[i]=ckg[i]=a[i];
122     }
123     dfs_init(1,0);
124 }
125 int main()
126 {
127     freopen("treasure.in","r",stdin);
128     freopen("treasure.out","w",stdout);
129     
130     prepare();
131     dfs_solve(1,0);
132     
133     for(int i=1;i<=n;i++)
134     {
135         ll x=max(ckt[i]+f[i]-a[i],g[i]+up[i]),y=ckg[i]+upd[i];
136         printf("%lld\n",max(x,y));
137     }
138 }

 

冯志远0918

标签:max   mst   eof   math   内存   using   ==   预处理   iostream   

原文地址:http://www.cnblogs.com/fengzhiyuan/p/7554048.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!