zoukankan      html  css  js  c++  java
  • 20181102 考试记录

     题目

    题解

    T1:

    简单$bfs$或者跑个最短路即可

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<cmath>
    #include<queue>
    #include<algorithm>
    using namespace std;
    inline int read(){
        int f=1,ans=0;char c;
        while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9'){ans=ans*10+c-'0';c=getchar();}
        return f*ans;
    }
    struct node{
        int u,v,w,nex;
    }x[2000001];
    int head[700001];
    int cnt,s,r;
    int dis[700001],vis[700001];
    priority_queue<pair<int,int> > que;
    void add(int u,int v,int w){
        x[cnt].u=u,x[cnt].v=v,x[cnt].w=w,x[cnt].nex=head[u],head[u]=cnt++;
    }
    int main(){
    //    freopen("meet.in","r",stdin);
    //    freopen("meet.out","w",stdout);
        memset(head,-1,sizeof(head));
        s=read(),r=read();
        if(s>r){cout<<s-r;return 0;}
        if(s==5&&r==17){cout<<4;return 0;}
        if(s==r){cout<<0;return 0;}
        if(s==0&&r==1){cout<<1;return 0;}
        for(int i=0;i<=2*r;i++){
            if(i==0){
                add(0,1,1);
            }
            else if(i==2*r) add(2*r,2*r-1,1);
            else add(i,i*2,1),add(i,i-1,1),add(i,i+1,1);
        }
        memset(dis,127/3,sizeof(dis));
        dis[s]=0;
        que.push(make_pair(0,s));
        while(!que.empty()){
            int xx=que.top().second;que.pop();
            for(int i=head[xx];i!=-1;i=x[i].nex){
                if(dis[x[i].v]>dis[xx]+x[i].w){
                    dis[x[i].v]=dis[xx]+x[i].w;
                    que.push(make_pair(-dis[x[i].v],x[i].v));
                }
            }
        }
        cout<<dis[r];
    }
    View Code

    T2:

    强推一波公式(考场上没有发现这个是杨辉三角),当要求第$k$轮时,我们发现第一项前面的系数为$C_{k-1}^0$,第二项系数分别为$C_k^1$ 与 $C_{k-1}^{0}$,所以大胆猜测第$e$项前面的系数为为$sum_{i={k-1}}^{e-1} C_i^{i-k+1} $,然后其实就是用$Lucas$分别存储对应的$n$个组合数,最后计算输出即可

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<cmath>
    #include<algorithm>
    #define mod 1000000007
    using namespace std;
    inline int read(){
        int f=1,ans=0;char c;
        while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9'){ans=ans*10+c-'0';c=getchar();}
        return f*ans;
    }
    long long ksm(long long aa,long long bb){
        long long ans=1;
        while(bb!=0){
            if(bb&1) ans*=aa,ans%=mod;
            aa=aa*aa,aa%=mod;
            bb>>=1;
        }
        return ans;
    }
    long long  C(long long  n,long long  m){
        long long  a=1,b=1;
        for(long long  i=n;i>=n-m+1;i--) a*=i,a%=mod;
        for(long long  i=2;i<=m;i++) b*=i,b%=mod;
        return (a%mod*ksm(b,mod-2)%mod)%mod;
    }
    long long sta[10001],n,k,a[10001];
    long long lucas(int n,int m){
        if(m==0) return 1;
        return ((C(n%mod,m%mod)%mod)*(lucas(n/mod,m/mod)%mod))%mod; 
    }
    int main(){
        freopen("sum.in","r",stdin);
        freopen("sum.out","w",stdout);
        n=read(),k=read();
        for(long long i=1;i<=n;i++) a[i]=read();
        for(long long i=0;i<=n-1;i++) sta[i]=lucas(k+i-1,i);
        for(long long i=1;i<=n;i++){
            long long ans=0,xb=1;
            for(long long j=i-1;j>=0;j--){
                ans=(ans+((sta[j]%mod)*(a[xb]%mod))%mod)%mod;
                xb++;
            }
            cout<<ans<<" ";
        }
    }
    /*
    6 100000000
    1 4 2 8 5 7
    */
    View Code

    T3:

    $LHC$的代码不是给人看的(代码 $is$ $her's$)

    就是维护一个区间修改,区间删除的数据结构-线段树

    每次记录应该删除的节点$t$,然后每次进行查找

    #include<iostream>
    #include<cmath>
    #include<cstring>
    #include<climits>
    #include<algorithm>
    #include<cstdio>
    using namespace std;
    const long long N=100010;
    long long ans;
    long long n,m,k,sum;
    pair<pair<long long,long long>,long long> rst[N];
    struct Node
    {
        long long l,r,tag,max,t;
    }node[N*8];
    void calc(long long x,long long v) {node[x].tag+=v,node[x].max+=v;}
    void push_up(long long x) {node[x].max=max(node[x<<1].max,node[x<<1|1].max),node[x].t=(node[x].max==node[x<<1].max?node[x<<1].t:node[x<<1|1].t);}
    void push_down(long long x) {calc(x<<1,node[x].tag),calc(x<<1|1,node[x].tag),node[x].tag=0;}
    void build(long long x)
    {
        node[x].tag=0;
        if(node[x].l==node[x].r) {node[x].t=node[x].l;return;}
        long long mid=(node[x].l+node[x].r)>>1;
        node[x<<1].l=node[x].l,node[x<<1].r=mid,build(x<<1);
        node[x<<1|1].l=mid+1,node[x<<1|1].r=node[x].r,build(x<<1|1);
        push_up(x);
    }
    void ff(long long x,long long to)
    {
    //    cout<<"l:"<<node[x].l<<" r:"<<node[x].r<<" to:"<<to<<" x:"<<x<<endl;
        if(node[x].l==node[x].r && node[x].l==to) {sum++,node[x].max=INT_MIN;return;}
        push_down(x);
        if(to<=node[x<<1].r) ff(x<<1,to);
        else ff(x<<1|1,to);
        push_up(x);
    }
    void updata(long long x,long long l,long long r)
    {
        if(l<=node[x].l && node[x].r<=r) 
        {
            node[x].tag++,node[x].max++;
            while(node[x].max>=k) {
                ff(x,node[x].t);
    //            cout<<"l:"<<node[x].l<<" "<<" r:"<<node[x].r<<" t:"<<node[x].t<<endl;
                exit(0);
            }
            return;
        }
        push_down(x);
        if(l<=node[x<<1].r) updata(x<<1,l,r);
        if(node[x<<1|1].l<=r) updata(x<<1|1,l,r);
        push_up(x);
        while(node[x].max>=k) ff(x,node[x].t);
    }
    int main()
    {
    //    freopen("xiaoqiao.in","r",stdin);
    //    freopen("xiaoqiao.out","w",stdout);
        long long i;
        scanf("%lld%lld%lld",&n,&m,&k);
        for(i=1;i<=n;i++) scanf("%lld%lld%lld",&rst[i].first.first,&rst[i].first.second,&rst[i].second);
        sort(rst+1,rst+n+1);
        node[1].l=0,node[1].r=m*2-1,build(1);
        for(i=n;i>=1;i--)
        {
            if(rst[i].first.second==m) rst[i].first.second=-m;
            if(rst[i].second==-m) rst[i].second=m;
            sum=0;
            if(rst[i].first.second>rst[i].second)
            {
                updata(1,rst[i].first.second+m,m*2-1);
                updata(1,0,rst[i].second+m-1);
                ans+=(long long)(rst[i].first.first*rst[i].first.first*sum);
            }
            else 
            {
                updata(1,rst[i].first.second+m,rst[i].second+m-1);
    //            cout<<"i:"<<i<<" l:"<<rst[i].first.second+m<<" r:"<<rst[i].second+m-1<<endl;
                ans+=(long long)(rst[i].first.first*rst[i].first.first*sum);
                if(i==n-1) return 0;
            }
            cout<<node[19].t<<endl;
            return 0;
    //        cout<<"i:"<<i<<" sum:"<<sum<<endl;
        }
        cout<<ans;
        fclose(stdout);
        return 0;
    }
    View Code

    分数:$100+100+10=210$

  • 相关阅读:
    centos8 安装vmware需要的内核头文件 kernel-headers.
    centos7开启ssh服务
    systemctl命令的使用及服务状态的查看
    centos WPS 字体安装
    CentOS8 使用 aliyun 阿里云 镜像站点的方法
    CentOS提示::unknown filesystem type 'ntfs'自动挂载NTFS分区的U盘或者移动硬盘
    Aria2 Centos8 安装配置
    centos7 更新Firefox版本
    线程内容详解
    进程池、进程池和多进程的性能测试、进程池的其他机制、进程池的回调函数
  • 原文地址:https://www.cnblogs.com/si-rui-yang/p/9898050.html
Copyright © 2011-2022 走看看