• 【19.11.9】雅礼集团联考


    题目 

    *一个不是很好理解的DP

    *考虑过数学和DP,感觉应该是数学但推不出,所以DP没怎么想,但这题的DP的状态转移不是很好想

    #include<bits/stdc++.h>
    #define ri register int
    #define ll long long
    #define For(i,l,r) for(ri i=l;i<=r;i++)
    #define Dfor(i,r,l) for(ri i=r;i>=l;i--)
    using namespace std;
    const int M=1e5+5;
    int n,a[M],b[M];
    ll f[M][2];
    ll p=1000000007;
    inline ll read(){
        ll f=1,sum=0;
        char ch=getchar();
        while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
        while(isdigit(ch)){sum=(sum<<1)+(sum<<3)+(ch^48);ch=getchar();}
        return f*sum;
    }
    int main(){
        freopen("choose.in","r",stdin);
        freopen("choose.out","w",stdout);
        n=read();
        For(i,1,n){
            a[i]=read();
        }
        For(i,1,n-1){
            b[i]=read();
        }
        f[0][0]=1;
        For(i,1,n){
            f[i][1]=(f[i-1][0]*b[i]%p+f[i-1][1]*b[i]%p)%p;
            f[i][0]=((f[i-1][1]*((a[i]+b[i-1]-1)%p)%p)+(f[i-1][0]*((a[i]+b[i-1])%p)%p))%p;
        }
        printf("%lld
    ",(f[n][0]+p)%p);
        return 0;
    }

     

    *

    #include<bits/stdc++.h>
    using namespace std;
    #define MAXN 100010
    #define int long long
    int n,ans,cur,sets[MAXN];
    
    inline int read(){
        int x=0, f=1;
        char ch=getchar();
        while(ch<'0' || ch>'9'){
            if(ch=='-') f=-1;
            ch=getchar();
        }
        while(ch>='0' && ch<='9'){
            x=x*10+ch-48;
            ch=getchar();
        }
        return x*f;
    }
    
    struct EData{
        int a, b, w;
    }es[10*MAXN];
    
    struct Node{
        int id, x, y, z;
    }a[MAXN];
    
    bool cmp1(Node a, Node b){
        return a.x < b.x;
    }
    
    bool cmp2(Node a, Node b){
        return a.y < b.y;
    }
    
    bool cmp3(Node a, Node b){
        return a.z < b.z;
    }
    
    bool cmp4(EData a, EData b){
        return a.w < b.w;
    }
    
    void add_e(int a, int b, int w){
        cur++;
        es[cur].a = a;
        es[cur].b = b;
        es[cur].w = w;
    }
    
    int find_root(int x){
        if(sets[x] == x) return x;
        int root = find_root(sets[x]);
        sets[x] = root;
        return root;
    }
    
    bool sets_union(int x, int y){
        int x_root = find_root(x);
        int y_root = find_root(y);
        if(x_root == y_root) return 0;
        sets[x_root] = y_root;
        return 1;
    }
    
    signed main(){
        freopen("planet.in","r",stdin);
        freopen("planet.out","w",stdout);
        n=read();
        for(int i=1; i<=n; i++){
            a[i].id = i;
            a[i].x = read();
            a[i].y = read();
            a[i].z = read();
        }
        sort(a+1,a+n+1,cmp1);
        for(int i=1; i<n; i++){
            add_e(a[i].id, a[i+1].id, abs(a[i].x-a[i+1].x));
        }
        sort(a+1,a+n+1,cmp2);
        for(int i=1; i<n; i++){
            add_e(a[i].id, a[i+1].id, abs(a[i].y-a[i+1].y));
        }
        sort(a+1,a+n+1,cmp3);
        for(int i=1; i<n; i++){
            add_e(a[i].id, a[i+1].id, abs(a[i].z-a[i+1].z));
        }
        sort(es+1,es+cur+1,cmp4);
        for(int i=1; i<=n; i++){
            sets[i] = i;
        }
        for(int i=1; i<=cur; i++){
            if(sets_union(es[i].a, es[i].b)) ans += es[i].w;
        }
        printf("%lld",ans);
        return 0;
    }

     

     *预处理每个点与最近的树木的距离

    #include<bits/stdc++.h>
    using namespace std;
    #define MAXN 2010
    const int bas=1000;
    int hang,lie,cnt,mp[MAXN][MAXN],d[MAXN][MAXN],dist[MAXN][MAXN],vis[MAXN][MAXN],sx,sy,tx,ty;
    const int INF=10000000;
    int dirx[5]={0,0,-1,1}, diry[5]={1,-1,0,0};
    char s[MAXN];
    inline int read(){
        int x=0,f=1;
        char ch=getchar();
        while(ch<'0'||ch>'9'){
            if(ch=='-') f=-1;
            ch=getchar();
        }
        while(ch>='0'&&ch<='9'){
            x=x*10+ch-48;
            ch=getchar();
        }
        return x*f;
    }
    struct Tree{
        int x, y;
    }tr[MAXN*MAXN];
    struct FData{
        int x,y,g,h;
        bool operator < (const FData &t) const{
            return g+h>t.g+t.h;
        }
    }fs[MAXN][MAXN];
    priority_queue <FData> q;
    int check(int x,int y,int r){
        int minx=min(2000,x+r);
        int miny=min(2000,y+r);
        int maxx=max(1,x-r);
        int maxy=max(1,y-r);
        return d[maxx][maxy]-d[maxx][miny-1]-d[minx-1][maxy]+d[minx-1][miny-1];
    }
    int Deal(int x, int y){
        int l=0,r=2000,rt=0;
        while(l<=r){
            int mid=l+r>>1;
            if(check(x,y,mid)){
                rt=mid;
                r=mid-1;
            }else{
                l=mid+1;
            }
        }
        return rt;
    }
    int H(int x, int y){
        return abs(x-tx)+abs(y-ty);
    }
    int D_min_dist(int lim){
        memset(vis,0,sizeof(vis));
        for(int i=1;i<=hang;i++){
            for(int j=1;j<=lie;j++){
                fs[i][j].x=i;
                fs[i][j].y=j;
                fs[i][j].g=INF;
                fs[i][j].h=0;
            }
        }
        fs[sx][sy].g=0;
        fs[sx][sy].h=H(sx,sy);
        q.push(fs[sx][sy]);
        while(!q.empty()){
            int x=q.top().x;
            int y=q.top().y;
            q.pop();
            if(vis[x][y]) continue;
            vis[x][y]=1;
            for(int i=0;i<4;i++){
                int cx=x+dirx[i];
                int cy=y+diry[i];
                if(cx<1||cx>hang||cy<1||cy>lie) continue;
                if(dist[cx][cy]<lim) continue;
                if(vis[cx][cy]) continue;
                int dis=fs[x][y].g+1;
                if(fs[cx][cy].g>dis){
                    fs[cx][cy].g=dis;
                    fs[cx][cy].h=H(cx,cy);
                    q.push(fs[cx][cy]);
                }
            }
        }
        if(fs[tx][ty].g==INF) return 0;
        else return 1;
    }
    int main(){
        freopen("path.in","r",stdin);
        freopen("path.out","w",stdout);
        hang=read();lie=read();
        for(int i=1;i<=hang;i++){
            scanf("%s",s+1);
            for(int j=1;j<=lie;j++){
                if(s[j]=='V'){
                    sx=i,sy=j;
                    mp[i][j]=2;
                }
                else if(s[j]=='J'){
                    tx=i,ty=j;
                    mp[i][j]=3;
                }
                else if(s[j]=='+'){
                    cnt++;
                    tr[cnt].x=i+j+bas;
                    tr[cnt].y=i-j+bas;
                    d[i+j+bas][i-j+bas]=1;
                    mp[i][j]=-1;
                }
            }
        }
        for(int i=1;i<=2000;i++){
            for(int j=1;j<=2000;j++){
                d[i][j]+=d[i][j-1]+d[i-1][j]-d[i-1][j-1];
            }
        }
        for(int i=1;i<=hang;i++){
            for(int j=1;j<=lie;j++){
                dist[i][j]=Deal(i+j+bas,i-j+bas)-1;
                if(mp[i][j]==-1) dist[i][j]++;
            }
        }
        int l=0,r=dist[sx][sy],rt=0;
        while(l<=r){
            int mid=l+r>>1;
            if(D_min_dist(mid)){
                rt=mid;
                l=mid+1;
            }else{
                r=mid-1;
            }
        }
        printf("%d",rt);
        return 0;
    }
  • 相关阅读:
    HDU 1863 畅通工程
    基于Platinum库的DMS实现(android)
    编写一个程序,输入月份号,输出该月的中文名和英文名。
    Android系统移植与调试之------->如何修改Android设备的开机第一阶段Logo
    利用面向对象解母牛生小牛问题
    Java String.replace()方法
    Android系统移植与调试之------->如何修改Android设备的开机第二阶段Logo
    Linux网络设备驱动架構學習(三)
    把给定的字符串解析为Date对象
    git使用三把斧
  • 原文地址:https://www.cnblogs.com/jian-song/p/11826232.html
Copyright © 2020-2023  润新知