Codeforces Round #168 (Div. 2)

  A.模拟。

  B.数据小,模拟。

  C.给定一个数组,要求使得数组中不存在两个数相差k倍,问数组中最大的数的个数。先排序,然后从前往后找倍数相差为k的数,二分查找。

View Code
 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 #include<math.h>
 5 #include<algorithm>
 6 #include<string>
 7 #include<queue>
 8 #include<stack>
 9 #include<vector>
10 #include<map>
11 using namespace std;
12 #define LL __int64
13 #define pii pair<int,int>
14 #define Max(a,b) ((a)>(b)?(a):(b))
15 #define Min(a,b) ((a)<(b)?(a):(b))
16 #define mem(a,b) memset(a,b,sizeof(a))
17 #define lson l,mid,rt<<1
18 #define rson mid+1,r,rt<<1|1
19 const int N=100010,INF=1000000000;
20 
21 int n,k;
22 int num[N],fa[N],cou[N];
23 
24 int binary(int a,int up)
25 {
26     int l=0,r=up,mid;
27     while(l<r){
28         mid=l+(r-l)/2;
29         if(num[mid]==a)return mid;
30         else if(num[mid]<a)l=mid+1;
31         else r=mid;
32     }
33     return -1;
34 }
35 
36 int main()
37 {
38  //   freopen("in.txt","r",stdin);
39     int i,j,w,ans;
40     while(~scanf("%d%d",&n,&k))
41     {
42         ans=0;
43         mem(cou,0);
44         for(i=0;i<n;i++)scanf("%d",&num[i]);
45         sort(num,num+n);
46 
47         for(i=0;i<n;i++){
48             if(k!=1 && num[i]%k==0 && (w=binary(num[i]/k,i+1))!=-1)
49                 fa[i]=fa[w];
50             else fa[i]=i;
51             cou[fa[i]]++;
52         }
53         for(i=0;i<n;i++)
54             if(cou[i])ans+=((cou[i]+1)/2);
55 
56         printf("%d\n",ans);
57     }
58     return 0;
59 }

  D.DFS,记录每个节点下面的所有子节点的操作的最大值和最下值然后更新即可。

View Code
 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 #include<math.h>
 5 #include<algorithm>
 6 #include<string>
 7 #include<queue>
 8 #include<stack>
 9 #include<vector>
10 #include<map>
11 using namespace std;
12 #define LL __int64
13 #define pii pair<int,int>
14 #define Max(a,b) ((a)>(b)?(a):(b))
15 #define Min(a,b) ((a)<(b)?(a):(b))
16 #define mem(a,b) memset(a,b,sizeof(a))
17 #define lson l,mid,rt<<1
18 #define rson mid+1,r,rt<<1|1
19 #define abs(a) ((a)>0?(a):-(a))
20 const int N=100010,INF=1000000000;
21 
22 struct Edge{
23     int u,v;
24 }e[N*2];
25 
26 int first[N],next[N*2],vis[N];
27 int n,mt;
28 LL ans,l[N][2],w[N];
29 
30 void adde(int a,int b)
31 {
32     e[mt].u=a,e[mt].v=b;
33     next[mt]=first[a],first[a]=mt++;
34     e[mt].u=b,e[mt].v=a;
35     next[mt]=first[b],first[b]=mt++;
36 }
37 
38 void dfs(int u)
39 {
40     int i,v;
41     l[u][0]=Max(w[u],l[u][0]);
42     l[u][1]=Min(w[u],l[u][1]);
43     for(i=first[u];i!=-1;i=next[i]){
44         v=e[i].v;
45         if(!vis[v]){
46             vis[v]=1;
47             dfs(v);
48             l[u][0]=Max(l[v][0],l[u][0]);
49             l[u][1]=Min(l[v][1],l[u][1]);
50         }
51     }
52     w[u]-=l[u][0]+l[u][1];
53     if(w[u]>0)l[u][0]+=w[u];
54     else l[u][1]+=w[u];
55 }
56 
57 int main()
58 {
59  //   freopen("in.txt","r",stdin);
60     int i,j,a,b;
61     while(~scanf("%d",&n))
62     {
63         ans=mt=0;
64         mem(first,-1);
65         for(i=1;i<n;i++){
66             scanf("%d%d",&a,&b);
67             adde(a,b);
68         }
69         for(i=1;i<=n;i++)scanf("%I64d",&w[i]);
70 
71         mem(vis,0);
72         mem(l,0);
73         vis[1]=1;
74         dfs(1);
75 
76         printf("%I64d\n",l[1][0]-l[1][1]);
77     }
78     return 0;
79 }

  E.待续

posted @ 2013-03-11 21:09  zhsl  阅读(216)  评论(0编辑  收藏  举报