2017 济南综合班 Day 4

T1 外星人

二维前缀和

#include<cstdio>
#define N 1001
using namespace std;
bool v[N][N];
int sum[N][N];
int main()
{
    freopen("alien.in","r",stdin);
    freopen("alien.out","w",stdout);
    int r,c,p,q;
    scanf("%d%d%d%d",&r,&c,&p,&q);
    int x,y;
    for(int i=1;i<=p;i++)
    {
        scanf("%d%d",&x,&y);
        v[x][y]=true;
    }
    for(int i=1;i<=r;i++)
     for(int j=1;j<=c;j++)
      sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+v[i][j];
    int ans=0;
    while(q--)
    {
        scanf("%d%d",&x,&y);
        for(int i=1;i<=r;i++)
         for(int j=1;j<=c;j++) 
         {
             if(i-x>=0 && j-y>=0 && sum[i][j]-sum[i-x][j]-sum[i][j-y]+sum[i-x][j-y]==0) ans++;
             if(x==y) continue;
             if(i-y>=0 && j-x>=0 && sum[i][j]-sum[i-y][j]-sum[i][j-x]+sum[i-y][j-x]==0) ans++;
         }
        printf("%d
",ans);   ans=0;
    }
}
View Code

T2 游戏

点权*2

边权分别加到两个点上

排序、贪心、两人轮流选当前最大

点权乘了2,边权是自己的乘了2,不是自己的减了去

最后除2就是答案

#include<cstdio>
#include<algorithm>
#include<iostream>
#define N 10001
using namespace std;
int a[N];
int main()
{
    freopen("game.in","r",stdin);
    freopen("game.out","w",stdout);
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]),a[i]<<=1;
    int u,v,w;
    while(m--) 
    {
        scanf("%d%d%d",&u,&v,&w);
        a[u]+=w; a[v]+=w;
    }
    sort(a+1,a+n+1,greater<int>());
    int ans=0;
    for(int i=1;i<=n;i+=2)
    {
        ans+=a[i];
        ans-=a[i+1];
    } 
    printf("%d",ans>>1);
}
View Code

T3 堡垒

当时改了最后一行的输出,忘了改成啥了

所以就忽略最后一行输出吧

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char move;
int m,n,xx,yy;
int sum,tmp,maxn,big;
int E[61][61][61][61],N[61][61][61][61];
bool v[61][61];
void dfs(int x,int y)
{
    v[x][y]=true;  tmp++;
    if(x!=1 && !N[x][y][x-1][y] && !v[x-1][y]) dfs(x-1,y);
    if(y!=m && !E[x][y][x][y+1] && !v[x][y+1]) dfs(x,y+1);
    if(x!=n && !N[x+1][y][x][y] && !v[x+1][y]) dfs(x+1,y);
    if(y!=1 && !E[x][y-1][x][y] && !v[x][y-1]) dfs(x,y-1);
}
int main()
{
    freopen("fortress.in","r",stdin);
    freopen("fortress.out","w",stdout);
    int x;
    scanf("%d%d",&m,&n);
    for(int i=1;i<=n;i++)
     for(int j=1;j<=m;j++)
      {
           scanf("%d",&x);
           if(x&(1<<1)) 
            N[i][j][i-1][j]=true;
           if(x&(1<<2)) 
            E[i][j][i][j+1]=true;
      }
    for(int i=1;i<=n;i++)
     for(int j=1;j<=m;j++)
      if(!v[i][j])  
      {
           sum++; tmp=0;
         dfs(i,j);
         maxn=max(maxn,tmp);
      }
    printf("%d
%d
",sum,maxn);
    for(int i=n;i>=1;i--)
     for(int j=1;j<=m;j++)
     {
         if(i!=1 && N[i][j][i-1][j]) 
         {
             memset(v,0,sizeof(v));
            N[i][j][i-1][j]=false;
             tmp=0;
             dfs(i,j);
             if(tmp>maxn) maxn=tmp,xx=i,yy=j,move='N';
             N[i][j][i-1][j]=true;
        }
        if(j!=m && E[i][j][i][j+1])
        {
            memset(v,0,sizeof(v));
            E[i][j][i][j+1]=false;
            tmp=0;
            dfs(i,j);
            if(tmp>maxn) maxn=tmp,xx=i,yy=j,move='E';
            E[i][j][i][j+1]=true;
        }
     }
    printf("%d
",maxn);
    printf("%d %d %c",xx,yy,move);
}
View Code
原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/7348681.html