百度之星2018 复赛 体验记

毒瘤卡常啊我勒个去

A 题被卡常我要骂人了

C 题写了一个常数大的做法,被卡到怀疑人生(后来重写才 AC 的mdzz)。

还好 B 和 D 比较善良

题解不想写了

直接放代码QAQ

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=100005;
LL read(){
    LL x=0,f=1;
    char ch=getchar();
    while (!isdigit(ch)&&ch!=‘-‘)
        ch=getchar();
    if (ch==‘-‘)
        f=-1,ch=getchar();
    while (isdigit(ch))
        x=(x<<1)+(x<<3)+ch-48,ch=getchar();
    return x*f;
}
int n,A[N],fa[N];
int a1[N],b1[N],a2[N],b2[N];
int main(){
    int T=read();
    while (T--){
        n=read();
        memset(a1,0,sizeof a1);
        memset(a2,0,sizeof a2);
        memset(b1,0,sizeof b1);
        memset(b2,0,sizeof b2);
        for (int i=2;i<=n;i++)
            fa[i]=read();
        for (int i=1;i<=n;i++)
            A[i]=read();
        for (int i=2;i<=n;i++){
            int v=A[i],f=fa[i];
            if (v>=a1[f])
                a2[f]=a1[f],a1[f]=v;
            else
                a2[f]=max(a2[f],v);
            if (v<=b1[f])
                b2[f]=b1[f],b1[f]=v;
            else
                b2[f]=min(b2[f],v);
        }
        LL Max=0,Min=0;
        for (int i=1;i<=n;i++){
            Max+=a1[i];
            Min+=b1[i];
        }
        LL ans1=Max,ans2=Min;
        for (int i=1;i<=n;i++){
            ans1=max(ans1,Max+a2[i]);
            ans2=min(ans2,Min+b2[i]);
        }
        printf("%I64d %I64d\n",ans1+max(A[1],0),ans2+min(A[1],0));
    }
    return 0;
}

A

#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=105,V=10005,mod=1e9+7;
int T,n,L[N],R[N],inv[N];
int Pow(int x,int y){
    int ans=1;
    for (;y;y>>=1,x=1LL*x*x%mod)
        if (y&1)
            ans=1LL*ans*x%mod;
    return ans;
}
int calc(int x){
    return x*(x+1)/2;
}
int main(){
    scanf("%d",&T);
    while (T--){
        scanf("%d",&n);
        int MaxL=0,MaxR=0;
        for (int i=1;i<=n;i++){
            scanf("%d%d",&L[i],&R[i]);
            MaxL=max(MaxL,L[i]);
            MaxR=max(MaxR,R[i]);
            inv[i]=Pow(R[i]-L[i]+1,mod-2);
        }
        int ans=0;
        for (int i=MaxL;i<=MaxR;i++){
            int v0=1,v1=0;
            for (int j=1;j<=n;j++){
                if (R[j]<i){
                    v0=1LL*v0*(calc(i-L[j]+1)-calc(i-R[j]))%mod;
                    v1=1LL*v1*(calc(i-L[j]+1)-calc(i-R[j]))%mod;
                }
                else {
                    v1=(1LL*v1*calc(i-L[j]+1)%mod+1LL*v0%mod)%mod;
                    v0=1LL*v0*(calc(i-L[j]+1)-1)%mod;
                }
                v1=1LL*v1*inv[j]%mod;
                v0=1LL*v0*inv[j]%mod;
            }
            ans=(ans+v1)%mod;
//            printf("%d %d\n",v0,v1);
        }
        printf("%d\n",ans);
    }
    return 0;
}

B

#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=100005,mod=1e9+7;
int read(){
    int x=0;
    char ch=getchar();
    while (!isdigit(ch))
        ch=getchar();
    while (isdigit(ch))
        x=(x<<1)+(x<<3)+ch-48,ch=getchar();
    return x;
}
struct Gragh{
    static const int M=N*2;
    int cnt,y[M],nxt[M],fst[N];
    void add(int a,int b){
        y[++cnt]=b,nxt[cnt]=fst[a],fst[a]=cnt;
    }
}g;
int n,m,v[N],fa[N],id[N],p[N];
vector <int> vs[N];
int getf(int x){
    return fa[x]==x?x:fa[x]=getf(fa[x]);
}
bool cmp(int a,int b){
    return v[a]<v[b];
}
int main(){
    int T=read();
    while (T--){
        n=read(),m=read();
        for (int i=1;i<=n;i++)
            v[i]=read(),id[i]=i;
        sort(id+1,id+n+1,cmp);
        for (int i=1;i<=n;i++)
            p[id[i]]=i,fa[i]=i;
        g.cnt=0;
        memset(g.fst,0,sizeof(int)*(n+1));
        for (register int i=1;i<=m;i++){
            int a=read(),b=read();
            fa[getf(a)]=getf(b);
        }
        for (int i=1;i<=n;i++)
            vs[i].clear();
        for (int i=1;i<=n;i++)
            vs[getf(id[i])].push_back(v[id[i]]);
        int ans=0;
        for (int i=1;i<=n;i++){
            if (vs[i].size()<1)
                continue;
            for (int d=0;d<30;d++){
                int cnt=0;
                for (vector <int> :: iterator p=vs[i].begin();
                                p!=vs[i].end();p++){
                    if (!(((*p)>>d)&1))
                        continue;
                    ans=((1LL<<d)*cnt%mod*(*p)+ans)%mod;
                    cnt++;
                }
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

C

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1005,mod=1e9+7;
LL read(){
    LL x=0;
    char ch=getchar();
    while (!isdigit(ch))
        ch=getchar();
    while (isdigit(ch))
        x=(x<<1)+(x<<3)+ch-48,ch=getchar();
    return x;
}
struct Pos{
    int p[5];
}s[N*6];
int n,k,cnt,p[5],in[N*6];
vector <int> v[5][N],e[N*6];
bool check(Pos a,Pos b){
    for (int i=0;i<k;i++)
        if (a.p[i]>=b.p[i])
            return 0;
    return 1;
}
void dfs(int val,int d){
    if (d>=k){
        cnt++;
        for (int i=0;i<k;i++)
            s[cnt].p[i]=p[i];
        return;
    }
    for (int i=0;i<v[d][val].size();i++){
        p[d]=v[d][val][i];
        dfs(val,d+1);
    }
}
int q[N*6],head,tail;
int dp[N*6];
int main(){
    int T=read();
    while (T--){
        k=read(),n=read();
        for (int i=0;i<k;i++)
            for (int j=1;j<=n;j++)
                v[i][j].clear();
        for (int i=0;i<k;i++)
            for (int j=1;j<=n;j++)
                v[i][read()].push_back(j);
        cnt=0;
        for (int i=1;i<=n;i++)
            dfs(i,0);
        for (int i=1;i<=cnt;i++)
            e[i].clear();
        memset(in,0,sizeof in);
        for (int i=1;i<=cnt;i++)
            for (int j=1;j<=cnt;j++)
                if (check(s[i],s[j]))
                    e[i].push_back(j),in[j]++;
        head=tail=0;
        for (int i=1;i<=cnt;i++)
            if (!in[i])
                q[++tail]=i;
        for (int i=1;i<=cnt;i++)
            dp[i]=1;
        int ans=0;
        while (head<tail){
            int x=q[++head];
            ans=(ans+dp[x])%mod;
            for (int i=0;i<e[x].size();i++){
                int y=e[x][i];
                dp[y]=(dp[y]+dp[x])%mod;
                in[y]--;
                if (!in[y])
                    q[++tail]=y;
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

D

原文地址:https://www.cnblogs.com/zhouzhendong/p/Baidu-Star-2018-Rematch.html

时间: 2024-11-08 08:33:17

百度之星2018 复赛 体验记的相关文章

【百度之星2014~复赛)解题报告】The Query on the Tree

声明 笔者最近意外的发现 笔者的个人网站http://tiankonguse.com/ 的很多文章被其它网站转载,但是转载时未声明文章来源或参考自 http://tiankonguse.com/ 网站,因此,笔者添加此条声明. 郑重声明:这篇记录<[百度之星2014~复赛)解题报告]The Query on the Tree>转载自 http://tiankonguse.com/ 的这条记录:http://tiankonguse.com/record/record.php?id=673 前言

【百度之星2014~复赛 解题报告~正解】The Query on the Tree

声明 笔者近期意外的发现 笔者的个人站点http://tiankonguse.com/ 的非常多文章被其他站点转载.可是转载时未声明文章来源或參考自 http://tiankonguse.com/ 站点,因此.笔者加入此条声明. 郑重声明:这篇记录<[百度之星2014~复赛 解题报告~正解]The Query on the Tree>转载自 http://tiankonguse.com/的这条记录:http://tiankonguse.com/record/record.php?id=674

百度之星2014复赛 - 1001 - Find Numbers

先上题目: Find Numbers Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 26    Accepted Submission(s): 20Special Judge Problem Description 给n个非负整数,满足对于某正整数k,n=2^k-1.从中选出(n+1)/2个数,使得它们的和是(n+1)/2的倍数. I

百度之星2014复赛 - 1002 - The Query on the Tree

先上题目: The Query on the Tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 54    Accepted Submission(s): 18 Problem Description 度度熊最近沉迷在和树有关的游戏了,他一直认为树是最神奇的数据结构.一天他遇到这样一个问题: 有一棵树,树的每个点有点权,每次有三种

百度之星2018资格赛1002题解

作为退役的老人家来光顾光顾百度之星. 据说资格赛水过一道题就行...就写那个签到题吧.orz 题目糊上,,, 度度熊的字符串课堂开始了!要以像度度熊一样的天才为目标,努力奋斗哦! 为了检验你是否具备不听课的资质,度度熊准备了一个只包含大写英文字母的字符串 A[1,n]=a1a2?anA[1,n]=a?1??a?2???a?n??,接下来他会向你提出 qq 个问题 (l,r)(l,r),你需要回答字符串 A[l,r]=alal+1?arA[l,r]=a?l??a?l+1???a?r?? 内有多少个

百度之星 2015 复赛 1001 (数长方形)

数长方形 Accepts: 595 Submissions: 1225 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Description 小度熊喜欢玩木棒.一天他在玩木棒的时候,发现一些木棒会形成长方形.小度熊可能是处女座吧,他只会将木棒横竖摆放,这样会形成很多长方形.现在给你一些横竖摆放的木棒,请你帮小度熊数一数形成了多少个长方形. 为了简化题目,一个木棒的端

【比赛】百度之星2017 复赛

第一题 模拟 #include<cstdio> #include<cstring> #include<cctype> #include<cmath> #include<algorithm> #define ll long long using namespace std; int read() { char c;int s=0,t=1; while(!isdigit(c=getchar()))if(c=='-')t=-1; do{s=s*10+c

百度之星2018资格赛t6三原色图(MST minimum spanning tree)

ac代码: #include<bits/stdc++.h> #define per(i,a,b) for(int i=a;i<=b;i++) using namespace std; typedef long long ll; const int mod=998244353; const int inf =0x3f3f3f3f; const double eps=1e-8; #define siz 110 int n,m,Enum,ans[siz]; struct Edge { int

百度之星2018初赛Bt4 P1m2(二分答案)

src:http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=826&pid=1004 可以用某值来判断是否满足题意时 可以用二分答案的方法! 代码: #include<bits/stdc++.h> using namespace std; #define per(i,a,b) for(int i=a;i <= b;i++) #define Max(a,b) a=max(a,b) #define Min(