2018 “百度之星”程序设计大赛 - 复赛

1001 没有兄弟的舞会

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const int maxn = 100005;
int t,n;
int a[maxn],fa[maxn];
struct node
{
    int to,w;
    node(){}
    node(int _to,int _w)
    {
        to=_to;w=_w;
    }
    bool operator < (const node & _node)
    {
        return w <_node.w;
    }
};
vector<node> M[maxn];

int main()
{
    int t;scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)M[i].clear();
        for(int i=2;i<=n;i++)
        {
            scanf("%d",&fa[i]);
        }
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
        }
        for(int i=2;i<=n;i++)
        {
            M[fa[i]].push_back(node(i,a[i]));
        }
        for(int i=1;i<=n;i++)
        {
            sort(M[i].begin(),M[i].end());
        }
        long long ans1=0,ans2=0;
        long long sum=0,sum1=0;
        for(int i=1;i<=n;i++)
        {
            if(M[i].size()==0)continue;
            else if(M[i].size()==1)
            {
                ans1 += max((ll)0,(ll)M[i][0].w);
                ans2 += min((ll)0,(ll)M[i][0].w);
            }
            else{
                int len = M[i].size();
                ans1 += max((ll)0,(ll)M[i][len-1].w);
                ans2 += min((ll)0,(ll)M[i][0].w);
                sum = max(sum,(ll)M[i][len-2].w);
                sum1 = min(sum1,(ll)M[i][1].w);
            }
           // cout<<ans1<<" "<<ans2<<endl;
        }
        if(a[1]<0)ans2+=a[1];
        else ans1+=a[1];
        cout<<ans1+sum<<" "<<ans2+sum1<<endl;
    }

    return 0;
}

1002 序列期望

#include <bits/stdc++.h>
using namespace std;
int l[105],r[105];
int mx,mi;
long long mod = 1e9 + 7;
long long ans = 0;
long long cnt;

long long power(long long a,long long k){
    long long ret = 1;
    a = a % mod;
    while(k){
        if(k & 1) ret = ret * a % mod;
        a = a * a % mod;
        k >>= 1;
    }
    return ret;
}

long long calc(long long beg,long long end){
    if(beg > end) return 0;
    long long ret = (beg+end)*(end-beg+1)/2;
    return ret;
}

int main()
{
    int T;
    scanf("%d",&T);
    while(T--){
        int n;
        scanf("%d",&n);
        mx = 0,mi = 0;
        ans = 0;
        long long tot = 1;
        for(int i = 1;i <= n;++i){
            scanf("%d%d",&l[i],&r[i]);
            mx = max(mx,r[i]);
            mi = max(l[i],mi);
            tot = tot * (r[i]-l[i]+1) % mod;
        }

        long long up,tmp,tmp2,up2;
        for(int i = mi;i <= mx;++i){
            tmp = 1;
            tmp2 = 1;
            for(int j = 1;j <= n;++j){
                up = min(r[j],i);
                up2 = min(i-1,r[j]);
                tmp2 = tmp2 * calc(i-up2+1,i-l[j]+1) % mod;
                tmp = tmp * calc(i-up+1,i-l[j]+1) % mod;
            }
            ans = ans + tmp - tmp2 + mod;
            ans %= mod;
        }
        ans = ans * power(tot,mod-2)%mod;
        printf("%I64d\n",ans);
    }
    return 0;
}

1003 带劲的and和

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const int maxn = 100005;
const int mod = 1e9+7;
int n,m;
int t;
int v[maxn];
ll ans = 0;
int par[maxn];
ll poww[35];
int ta[maxn][35],tb[maxn][35];
struct number
{
    int x,id;
    bool operator < (const number & _number)
    {
        if(id == _number.id)
        {
            return x < _number.x;
        }
        return id < _number.id;
    }
}tu[maxn];

void init(int n)
{
    for (int i = 0; i <= n; i++) {
        par[i] = i;
    }
}
int fin(int x) {
    if (par[x] == x) {
        return x;
    }
    else {
        return par[x] = fin(par[x]);
    }
}

void unite(int x, int y) {
    x = fin(x);
    y = fin(y);
    if (x == y) return;
    par[x] = y;

}

bool same(int x, int y) {
    return fin(x) == fin(y);
}
void bi(int pos,int num)
{
    int i=0;
    while(num)
    {
        ta[pos][i]=(num%2);i++;
        num/=2;
    }
}
ll ask(int l,int r)
{

    for(int i=l;i<=r;i++)
    {
        bi(i,tu[i].x);
    }
    for(int i=0;i<=31;i++)
    {
        tb[l][i]=ta[l][i];
    }
    for(int i=l+1;i<=r;i++)
    {
        for(int j=0;j<=31;j++)
        {
            tb[i][j] = tb[i-1][j] + ta[i][j];
        }
    }

    ll ret = 0;

    for(int i=l+1;i<=r;i++)
    {
        for(int j=0;j<=31;j++)
        {
            if(ta[i][j])
                ret = (ret + (ll)(tu[i].x*poww[j])%mod*tb[i-1][j])%mod;
        }
    }

    ret%=mod;

    return ret;
}
int main()
{
    poww[0]=1;
    for(int i=1;i<=31;i++)
    {
        poww[i]=poww[i-1]*2;
    }
    scanf("%d",&t);
    while(t--)
    {
        ans = 0;
        scanf("%d%d",&n,&m);
        init(n);
        for(int i=1;i<=n;i++)scanf("%d",&v[i]);
        for(int i=1;i<=m;i++)
        {
            int u,uu;
            scanf("%d%d",&u,&uu);
            unite(u,uu);
        }
        for(int i=1;i<=n;i++)
        {
            tu[i].id=fin(i);
            tu[i].x=v[i];
        }
        sort(tu+1,tu+n+1);
        int l=1,r=1;
        memset(ta,0,sizeof(ta));

        for(int i=2;i<=n;i++)
        {
            if(tu[i].id == tu[i-1].id)r++;
            else
            {
                ans = (ans+ask(l,r))%mod;
                l = r = i;
            }
            //cout<<ans<<endl;
        }
       // cout<<l<<" fjsdkfldk   "<<r<<endl;
        ans = (ans+ask(l,r))%mod;
        cout<<ans<<endl;
    }

}

原文地址:https://www.cnblogs.com/solvit/p/9559663.html

时间: 2024-10-10 05:25:59

2018 “百度之星”程序设计大赛 - 复赛的相关文章

2018“百度之星”程序设计大赛 - 复赛

没有兄弟的舞会 Accepts: 928 Submissions: 2446 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem Description 度度熊.光羽.带劲三个人是好朋友. 度度熊有一棵nn个点的有根树,其中1号点为树根.除根节点之外,每个点都有父节点,记ii号点的父节点为fa[i]fa[i]. 度度熊称点ii和点jj是兄弟(其中i \neq ji≠j)当

2017&quot;百度之星&quot;程序设计大赛 - 复赛1005&amp;&amp;HDU 6148 Valley Numer【数位dp】

Valley Numer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 311    Accepted Submission(s): 165 Problem Description 众所周知,度度熊非常喜欢数字. 它最近发明了一种新的数字:Valley Number,像山谷一样的数字. 当一个数字,从左到右依次看过去数字没有出现先递增接

2017&quot;百度之星&quot;程序设计大赛 - 复赛1003&amp;&amp;HDU 6146 Pok&#233;mon GO【数学,递推,dp】

Pokémon GO Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 171    Accepted Submission(s): 104 Problem Description 众所周知,度度熊最近沉迷于 Pokémon GO. 今天它决定要抓住所有的精灵球! 为了不让度度熊失望,精灵球已经被事先放置在一个2*N的格子上,每一个格子上都

2017&quot;百度之星&quot;程序设计大赛 - 复赛1001&amp;&amp;HDU 6144 Arithmetic of Bomb【java大模拟】

Arithmetic of Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 129    Accepted Submission(s): 94 Problem Description 众所周知,度度熊非常喜欢数字. 它最近在学习小学算术,第一次发现这个世界上居然存在两位数,三位数……甚至N位数! 但是这回的算术题可并不简单,由于

2018&quot;百度之星&quot;程序设计大赛 - 资格赛 - 题集

1001 $ 1 \leq m \leq 10 $ 像是状压的复杂度. 于是我们(用二进制)枚举留下的问题集合 然后把这个集合和问卷们的答案集合 $ & $ 一下 就可以只留下被选中的问题的答案了. 之后扫一遍随便判一下重. 1002 非空子串中字典序最小的子串长度一定是 $ 1 $ . 咱们就记录一下每一个字母出现次数的前缀和, 每次询问就找到出现过的最先的那个字符就星了. 1003 整数规划好像是个NPC问题, 所以我们肯定不能直接上整数规划. 咱们来尝试把问题转换一下. n=2 x1---

2018 “百度之星”程序设计大赛 - 初赛(A)

第二题还算手稳+手快?最后勉强挤进前五百(期间看着自己从两百多掉到494名) 1001  度度熊拼三角    (hdoj 6374) 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6374 签到题 题意:给n根木棒 求可以拼出的周长最长的三角形 可以用贪心的思想做 对所有的木棒长度进行排序 取最长的三根进行判断是否可以组成三角形 若不能 舍去最长的一根 每次都选择相邻的三根 for一遍就好 复杂度为O(nlogn) 代码如下 #include <ios

2018 “百度之星”程序设计大赛 - 初赛(A)1004 / hdu6377 度度熊看球赛 dp递推

度度熊看球赛 Problem Description 世界杯正如火如荼地开展!度度熊来到了一家酒吧. 有 N 对情侣相约一起看世界杯,荧幕前正好有 2×N 个横排的位置. 所有人都会随机坐在某个位置上. 当然,如果某一对情侣正好挨着坐,他们就会有说不完的话,影响世界杯的观看. 一般地,对于一个就座方案,如果正好有 K 对情侣正好是挨着坐的,就会产生 DK 的喧闹值. 度度熊想知道随机就座方案的期望喧闹值. 为了避免输出实数,设答案为 ans,请输出 ans×(2N)! mod P 的值.其中 P

2018&quot;百度之星&quot;程序设计大赛 - 资格赛

调查问卷 Accepts: 1546 Submissions: 6596 Time Limit: 6500/6000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) Problem Description 度度熊为了完成毕业论文,需要收集一些数据来支撑他的论据,于是设计了一份包含 mm 个问题的调查问卷,每个问题只有 'A' 和 'B' 两种选项. 将问卷散发出去之后,度度熊收到了 nn 份互不相同的问卷,在整理结果的时候

2018 “百度之星”程序设计大赛 - 初赛(B)

degree Accepts: 1581 Submissions: 3494 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Problem Description 度度熊最近似乎在研究图论.给定一个有 NN 个点 (vertex) 以及 MM 条边 (edge) 的无向简单图 (undirected simple graph),此图中保证没有任何圈 (cycle) 存在. 现在