codeforce Hello 2018 913 ABCDEFG SOL

A:

  我们发现2^n增长很快,n>30时便没有贡献了。

#include<bits/stdc++.h>
using namespace std;
int n,m;
int main () {
    scanf("%d%d",&n,&m);
    if (n>29) {printf("%d\n",m);return 0;}
    int l=1<<n; l--;
    printf("%d\n",m&l);
}

B

  我们dfs一边就好了。

#include<bits/stdc++.h>
using namespace std;
#define sight(c) ('0'<=c&&c<='9')
#define N 10007
inline void read(int &x){
    static char c;
    for (c=getchar();!sight(c);c=getchar());
    for (x=0;sight(c);c=getchar())x=x*10+c-48;
}
int n,fa,son[N],tot,tog;
int fall[N],net[N],head[N];
inline void add(int x,int y){
   fall[++tot]=y; net[tot]=head[x]; head[x]=tot;
}
bool dfs(int x){
    int r=0;
    for (int i=head[x];i;i=net[i])  {
        if (!head[fall[i]]) r++;
        else if (!dfs(fall[i])) return 0;
    }
    if (r<3) return 0; return 1;
}
int main () {
    read(n);
    for (int i=2;i<=n;i++) 
     read(fa),add(fa,i);
    puts(dfs(1)?"Yes":"No");
}

C :

我们采取贪心的策略,我们先用A[i]去更新其后面的数据:

举个例子 a[1]=10 ,a[2]=100,那么我们发现a[2]永远比a[1] 劣,那么我们用a[1]的两倍更新a[2].

我们再从高位向下做,我们发现对于每一个ai,(更新过的),我们要么取一个(L在这一位上有1),或是再多取一个,从而不取之后的数据,采取这种策略O(N)扫一遍就好了。

D :sol点这里 (整理在一起太长了。)

E :sol点这里

F :sol点这里

G:sol点这里

posted @ 2018-01-15 20:22  泪寒之雪  阅读(152)  评论(0编辑  收藏  举报