Codeforces Round #263 (Div. 2)

来源:互联网 发布:淘宝店铺被恶意举报 编辑:程序博客网 时间:2024/05/29 02:38

好久没写题解了。。。。。。

A.水题

直接搞

B.排序一下直接算.....

不过要注意用long long

当时搞了个大数据 hack了一发

AC代码如下:

#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;char s[100100];__int64 N, K;__int64 num[30];int main(){    scanf( "%I64d%I64d", &N, &K );    scanf( "%s", s );    memset( num, 0, sizeof( num ) );    for( int i = 0; i < N; i++ ){        num[s[i]-'A']++;    }    sort( num, num + 26 );    __int64 ans = 0;    for( int i = 25; i >= 0; i-- ){        if( num[i] >= K ){            ans += K * K;            break;        }else{            ans += num[i] * num[i];            K -= num[i];        }    }    printf( "%I64d\n", ans );    return 0;}


C.排序一下,然后每次分开最小的一个,这样能够使大的尽可能多次的被加

哈哈 当时也搞了个大数据hack了一个没用long long的

233333333

AC代码如下:

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;__int64 N, num[400000];__int64 ans;int main(){    scanf( "%I64d", &N );    for( int i = 1; i <= N; i++ ){        scanf( "%I64d", &num[i] );    }    if( N == 1 ){        ans = num[1];    }else{        sort( num + 1, num + 1 + N );        for( int i = N - 1; i >= 1; i-- ){            num[i] += num[i+1];        }        ans = num[1];        for( int i = 1; i < N; i++ ){            ans += num[i];        }    }    printf( "%I64d\n", ans );    return 0;}

D.树形DP

dp【i】【0】表示以i为根的子树没有1的种类数

dp【i】【1】表示以i为根的子树有1的种类数

树dp实在是太弱了,当时半小时写了前三题,还有一个半小时不敢做这题......T_T.....哎.....还是蒟蒻

AC代码如下:

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const __int64 MOD = 1e9 + 7;struct Edge{    int to, next;};int N;Edge edge[4*100000+10];int head[100000+5], tot;int col[100000+5];__int64 dp[100000+5][2];bool mark[100000+5];void add_edge( int a, int b ){    edge[tot].to = b;    edge[tot].next = head[a];    head[a] = tot++;    edge[tot].to = a;    edge[tot].next = head[b];    head[b] = tot++;}void DFS( int pos ){    dp[pos][col[pos]] = 1;    mark[pos] = true;    for( int i = head[pos]; i != -1; i = edge[i].next ){        int to = edge[i].to;        if( mark[to] )  continue;        DFS( to );        dp[pos][1] = ( dp[pos][1] * ( dp[to][0] + dp[to][1] ) % MOD + dp[pos][0] * dp[to][1] % MOD ) % MOD;    //    int t = dp[pos][1];        dp[pos][0] = dp[pos][0] * ( dp[to][0] + dp[to][1] ) % MOD;    //    int t1 = dp[pos][0];    }}int main(){    scanf( "%d", &N );    tot = 0;    memset( head, -1, sizeof( head ) );    for( int i = 1; i < N; i++ ){        int temp;        scanf( "%d", &temp );        add_edge( i, temp );    }    for( int i = 0; i < N; i++ ){        scanf( "%d", &col[i] );    }    memset( dp, 0, sizeof( dp ) );    memset( mark, false, sizeof( mark ) );    DFS( 0 );    printf( "%I64d\n", dp[0][1] );    return 0;}


0 0