标签:max mst eof math 内存 using == 预处理 iostream
只打了两道题,第一题题忘记判断浮点运算了,被坑了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 }
标签:max mst eof math 内存 using == 预处理 iostream
原文地址:http://www.cnblogs.com/fengzhiyuan/p/7554048.html