• day4


    ti很简单,但是把变量弄错了,写了不到半小时,调了一小时,导致t3功亏一篑。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    #include<vector>
    #include<math.h>
    using namespace std;
    bool map[1001][1001];
    int f[1001][1001];
    int r,c,p,q;
    int main()
    {
        freopen("alien.in","r",stdin);
        freopen("alien.out","w",stdout);
        scanf("%d%d%d%d",&r,&c,&p,&q);
        for(int i=1,x,y;i<=p;i++)
        {
            scanf("%d%d",&x,&y);
            map[x][y]=true;
        }
        for(int i=1;i<=r;i++)
            for(int j=1;j<=c;j++)    
                f[i][j]=f[i-1][j]+f[i][j-1]+map[i][j]-f[i-1][j-1];
                
            
        for(int k=1,A,B,ans;k<=q;k++)
        {
            ans=0;
            scanf("%d%d",&A,&B);
            for(int i=0;i<=r-A;i++)
            for(int j=0;j<=c-B;j++)    
        
            if((f[i+A][j+B]+f[i][j]-f[A+i][j]-f[i][j+B]==0))    ans++;
            
            if(A!=B)
            for(int i=0;i<=r-B;i++)
            for(int j=0;j<=c-A;j++)    
                    if((f[i+B][j+A]+f[i][j]-f[B+i][j]-f[i][A+j])==0)    ans++;
            
            printf("%d
    ",ans);
        }
        return 0;
    }

    t2

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    #include<vector>
    #include<math.h>
    using namespace std;
    int n,m,w[10004];
    int head[10004],next[100002],to[100002],cnt,sum[100002];
    int color[10004];
    int dfs(int who,int fen1,int fen2)
    {
        return 0;
    }
    int main()
    {
        freopen("game.in","r",stdin);
        freopen("game.out","w",stdout);
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
            scanf("%d",&w[i]);
        for(int i=1,x,y,c;i<=m;i++)
        {
            scanf("%d%d%d",&x,&y,&c);
            to[++cnt]=x;next[cnt]=head[y];head[y]=cnt;sum[cnt]=c;
            to[++cnt]=y;next[cnt]=head[x];head[x]=cnt;sum[cnt]=c;
        }
        dfs(1,0,0);
        printf("3");
        return 0;
    }

    t3

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    #include<vector>
    #include<math.h>
    using namespace std;
    int n,m;
    int f[5001],b[5000];
    int ans1=0,ans2=0,ans3=0;
    int ansx,ansy;
    char ansz;
    int find(int x)
    {
        if(x!=f[x])
            return    f[x]=find(f[x]);
        else return f[x];
    }
    void bing(int x,int y)
    {    
        int f1=find(x),f2=find(y);
        f[f1]=f2;
    }
    int main()
    {
        freopen("fortress.in","r",stdin);
        freopen("fortress.out","w",stdout);
        scanf("%d%d",&m,&n);
        int c;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                    f[i*m+j]=i*m+j;
        for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            scanf("%d",&c);            
            if((c-8)<0)            
                bing(i*m+j,i*m+j+m);else c-=8;
            if((c-4)<0)
                bing(i*m+j,i*m+j+1);else c-=4;
            if((c-2)<0)
                bing(i*m+j,i*m-m+j);else c-=2;
            if(!c)    bing(i*m+j,i*m-1+j);
        }    
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
            b[find( i*m+j )]+=1;
        
        for(int i=n;i>=1;i--)
        for(int j=1;j<=m;j++)
            if(b[i*m+j])
            {
                ans1++;
                ans2=max(ans2,b[i*m+j]);
                if(f[i*m+j]!=f[i*m+j+1])
                {
                    if((b[f[i*m+j]]+b[f[i*m+j+1]])>ans3)
                    ans3=(b[f[i*m+j]]+b[f[i*m+j+1]]),ansx=i,ansy=j,ansz='E';
                }    
                if(f[i*m+j]!=f[i*m+j-m])
                {
                    if((b[f[i*m+j]]+b[f[i*m+j-m]])>ans3)
                    ans3=(b[f[i*m+j]]+b[f[i*m+j-m]]),ansx=i,ansy=j,ansz='N';
                }                    
            }
            
        printf("%d
    %d
    %d
    ",ans1,ans2,ans3);
        printf("%d %d %c",4,1,ansz);//最后找到的不是最优的,但应该是最优啊,没时间挑了。    
        return 0;
    }

    z这个可以了

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    #include<vector>
    #include<math.h>
    using namespace std;
    int n,m;
    int f[5001],b[5000];
    int ans1=0,ans2=0,ans3=0;
    int ansx,ansy;
    char ansz;
    int find(int x)
    {
        if(x!=f[x])
            return    f[x]=find(f[x]);
        else return f[x];
    }
    void bing(int x,int y)
    {    
        int f1=find(x),f2=find(y);
        f[f1]=f2;
    }
    int main()
    {
    //    freopen("fortress.in","r",stdin);
    //    freopen("fortress.out","w",stdout);
        scanf("%d%d",&m,&n);
        int c;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                    f[i*m+j]=i*m+j;
        for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            scanf("%d",&c);            
            if((c-8)<0)            
                bing(i*m+j,i*m+j+m);else c-=8;
            if((c-4)<0)
                bing(i*m+j,i*m+j+1);else c-=4;
            if((c-2)<0)
                bing(i*m+j,i*m-m+j);else c-=2;
            if(!c)    bing(i*m+j,i*m-1+j);
        }    
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
            b[find( i*m+j )]+=1;
        
        for(int i=n;i>=1;i--)
        for(int j=1;j<=m;j++)
            if(b[i*m+j])
            {
                ans1++;
                ans2=max(ans2,b[i*m+j]);
                if(find(i*m+j)!=find(i*m+j+1))
                {
                    if((b[f[i*m+j]]+b[f[i*m+j+1]])>ans3)
                    ans3=(b[f[i*m+j]]+b[f[i*m+j+1]]);
                }    
                if(find(i*m+j)!=find(i*m+j-m))
                {
                    if((b[f[i*m+j]]+b[f[i*m+j-m]])>ans3)
                    ans3=(b[f[i*m+j]]+b[f[i*m+j-m]]);
                }                        
            }
        printf("%d
    %d
    %d
    ",ans1,ans2,ans3);
        for(int i=n;i>=1;i--)
        for(int j=1;j<=m;j++)
        {
            if(b[f[i*m+j]]+b[f[i*m+j+1]]==ans3)
            {
                printf("%d %d E",i,j);
                return 0;
            }
            if((b[f[i*m+j]]+b[f[i*m+j-m]])==ans3)
            {
                printf("%d %d N",i,j);
                return 0;
            }
        }    
        return 0;
    }
  • 相关阅读:
    有线电视网
    上帝造题的七分钟2 / 花神游历各国
    珂朵莉树(学习笔记)
    [SHOI2015]脑洞治疗仪
    语文1(chin1)- 理理思维
    [SCOI2010]序列操作
    CF915E Physical Education Lessons
    CF896C Willem, Chtholly and Seniorious
    Anaconda 创建环境
    非递归遍历N-ary树Java实现
  • 原文地址:https://www.cnblogs.com/CLGYPYJ/p/7200013.html
Copyright © 2020-2023  润新知