题解:2018中国大学生程序设计竞赛 - 网络选拔赛

版权声明:本文为博主原创文章,欢迎转载并注明来源。 https://blog.csdn.net/w_weilan/article/details/82054896

怒草评测姬

Buy and Resell

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct Node
{
    ll val,last;
    bool operator<(const Node &u)const
    {
        return val!=u.val?val>u.val:last>u.last;
    }
};
int t,n;
int main()
{
    for(scanf("%d",&t); t--;)
    {
        scanf("%d",&n);
        priority_queue<Node> q;
        long long ans=0,cnt=0;
        for(int i=0,w; i<n; ++i)
        {
            scanf("%d",&w);
            if(q.empty())
            {
                q.push(Node {w,1});
                continue;
            }
            Node u=q.top();
            if(u.last>0)
            {
                if(w>u.val)
                {
                    ans+=w-u.val;
                    cnt+=2;
                    q.pop();
                    q.push(Node {w,-1});
                }
                else
                {
                    q.push(Node {w,1});
                }
            }
            else
            {
                if(w<=u.val)q.push(Node {w,1});
                else
                {
                    q.pop();
                    ans+=w-u.val;
                    q.push(Node {u.val,1});
                    q.push(Node {w,-1});
                }
            }
        }
        printf("%lld %lld\n",ans,cnt);
    }
}

Dream

#include<stdio.h>
int t,p;
int main()
{
    for(scanf("%d",&t); t--;)
    {
        scanf("%d",&p);
        for(int k=0; k<2; ++k)
            for(int i=0; i<p; ++i,printf("\n"))
                for(int j=0; j<p; ++j)
                    printf("%d ",i*j%p);
    }
}

Find Integer

#include<bits/stdc++.h>
using namespace std;
int T,n,a;
int main()
{
    scanf("%d",&T);
    while (T--)
    {
        scanf("%d%d",&n,&a);
        if (n==1) printf("%d %d\n",1,a+1);
        if (n>2 || n==0) printf("-1 -1\n");
        if (n==2)
        {
            int cnt=0;
            while(a%2==0)++cnt,a>>=1;
            int b=a*a/2,c=a*a/2+1;
            while(cnt--)b<<=1,c<<=1;
            printf("%d %d\n",b,c);
        }
    }
}

Tree and Permutation

#include<bits/stdc++.h>
#define mul(a,b,c) (1LL*(a)*(b)%(c))
#define inv(a,b) pow(a,(b)-2,b)
using namespace std;
int T,n,a;
const int M=1e9+7;
const int N=200010;
typedef int ll;
ll pow(ll a,ll b,ll m)
{
    ll r=1;
    for(a%=m; b; b>>=1,a=mul(a,a,m))
        if(b&1)r=mul(r,a,m);
    return r;
}
struct Factorial//预处理阶乘及对应的逆元
{
    vector<ll> fac,ifac;
    ll M;
    Factorial(int N,ll M):fac(N,1),ifac(N,1),M(M)
    {
        for(int i=1; i<N; ++i)fac[i]=mul(fac[i-1],i,M);
        ifac[N-1]=inv(fac[N-1],M);
        for(int i=N-1; i; --i)ifac[i-1]=mul(ifac[i],i,M);
    }
    ll c(int n,int m)
    {
        return mul(mul(fac[n],ifac[m],M),ifac[n-m],M);
    }
    ll lucas(ll n,ll m)//卢卡斯定理求C(n,m)%M,适用于模数M小于N的情况,或者m较小的时候也可以暴力求
    {
        return !m?1:
               n<m||n%M<m%M?0:
               n<M&&m<M?c(n,m):
               mul(lucas(n/M,m/M),lucas(n%M,m%M),M);
    }
} f(N,M);
int edg[N],to[N],nex[N],head[N];
int tot;

void Insert(int x,int y,int z)
{
    edg[++tot]=z;
    to[tot]=y;
    nex[tot]=head[x];
    head[x]=tot;
}

int siz[N],fa[N];
int ans;

void build(int x)
{
    siz[x]=1;
    for (int i=head[x]; i; i=nex[i])
    {
        if (to[i]==fa[x]) continue;
        fa[to[i]]=x;
        build(to[i]);
        siz[x]+=siz[to[i]];
    }
}

void DFS(int x)
{
    for (int i=head[x]; i; i=nex[i])
    {
        if (to[i]==fa[x]) continue;
        ans=(ans+mul(mul(edg[i],siz[to[i]],M),n-siz[to[i]],M))%M;
        DFS(to[i]);
    }
}

int main()
{
    while (~scanf("%d",&n))
    {
        if(n==1)
        {
            printf("0\n");
            continue;
        }
        ans=0;
        memset(siz,0,sizeof(siz));
        memset(fa,0,sizeof(fa));
        memset(head,0,sizeof(head));
        tot=0;
        for (int i=1; i<n; ++i)
        {
            int x,y,l;
            scanf("%d%d%d",&x,&y,&l);
            Insert(x,y,l);
            Insert(y,x,l);
        }
        build(1);
        DFS(1);
        ans=mul(ans,mul(f.fac[2],f.fac[n-1],M),M);
        printf("%d\n",ans);
    }
}

YJJ’s Salesman

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int maxn=100000+10;

struct point
{
    int x,y,v;
}p[maxn];

bool cmp(point a,point b){return a.x==b.x?a.y>b.y:a.x<b.x;}

struct node
{
    int l,r,v;
}t[maxn*4];

int T,n,cnt,ans;
int tmp[maxn];

void build(int cur,int l,int r)
{
    t[cur].l=l; t[cur].r=r; t[cur].v=0;
    if (l==r) return ;
    int mid=(l+r)/2;
    build(cur*2,l,mid);
    build(cur*2+1,mid+1,r);
}

int query(int cur,int l,int r)
{
    if ((t[cur].l==l)&&(t[cur].r==r)) return t[cur].v;
    int mid=(t[cur].l+t[cur].r)/2;
    if (r<=mid) return query(cur*2,l,r);
     else if (l>mid) return query(cur*2+1,l,r);
      else return max(query(cur*2,l,mid),query(cur*2+1,mid+1,r));
}

void update(int cur,int pos,int val)
{
    if (t[cur].l==t[cur].r)
    {
        t[cur].v=max(t[cur].v,val);
        return ;
    }
    int mid=(t[cur].l+t[cur].r)/2;
    if (pos<=mid) update(cur*2,pos,val);
     else update(cur*2+1,pos,val);
    t[cur].v=max(t[cur*2].v,t[cur*2+1].v);
}

int main()
{
    scanf("%d",&T);
    while (T--)
    {
        scanf("%d",&n);
        for (int i=1;i<=n;i++)
        {
            scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].v);
            tmp[i]=p[i].y;
        }
        sort(tmp+1,tmp+n+1);
        cnt=unique(tmp+1,tmp+n+1)-tmp;
        sort(p+1,p+n+1,cmp);
        build(1,0,n);
        ans=0; 
        for (int i=1;i<=n;i++)
        {
            int y=lower_bound(tmp+1,tmp+n+1,p[i].y)-tmp;
            int val=query(1,0,y-1)+p[i].v;
            ans=max(ans,val);
            update(1,y,val);
        }
        printf("%d\n",ans);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/w_weilan/article/details/82054896
今日推荐