牛客练习赛13F

链接: https://www.nowcoder.com/acm/contest/70/F
来源:牛客网

题目描述

在一个n*n的国际象棋棋盘上有m个皇后。
一个皇后可以攻击其他八个方向的皇后(上、下、左、右、左上、右上、左下、右下)。
对于某个皇后,如果某一个方向上有其他皇后,那么这个方向对她就是不安全的。
对于每个皇后,我们都能知道她在几个方向上是不安全的。

现在我们想要求出t 0,t 1,...,t 8,其中t i表示恰有i个方向是"不安全的"的皇后有多少个。

输入描述:

第一行两个整数n,m表示棋盘大小和皇后数量。
接下来m行每行两个整数ri,ci表示皇后坐标。
1 <= n, m <= 100,000
1 <= ri, ci <= n
数据保证没有皇后在同一个位置上。

输出描述:

一行九个整数表示答案。
空格隔开,结尾无空格
示例1

输入

8 4
4 3
4 8
6 5
1 6

输出

链接:https://www.nowcoder.com/acm/contest/70/F
来源:牛客网

题目描述
在一个n*n的国际象棋棋盘上有m个皇后。
一个皇后可以攻击其他八个方向的皇后(上、下、左、右、左上、右上、左下、右下)。
对于某个皇后,如果某一个方向上有其他皇后,那么这个方向对她就是不安全的。
对于每个皇后,我们都能知道她在几个方向上是不安全的。

现在我们想要求出t0,t1,...,t8,其中ti表示恰有i个方向是"不安全的"的皇后有多少个。
输入描述:

第一行两个整数n,m表示棋盘大小和皇后数量。
接下来m行每行两个整数ri,ci表示皇后坐标。
1 <= n, m <= 100,000
1 <= ri, ci <= n
数据保证没有皇后在同一个位置上。

输出描述:

一行九个整数表示答案。
空格隔开,结尾无空格

示例1
输入

8 4
4 3
4 8
6 5
1 6

输出

0 3 0 1 0 0 0 0 0

示例2
输入

10 3
1 1
1 2
1 3

输出

0 2 1 0 0 0 0 0 0

0 3 0 1 0 0 0 0 0
#include 

using namespace std;
typedef long long ll;
typedef long double ld;

#define x0 x0___
#define y0 y0___
#define pb push_back
#define SZ(X) ((int)X.size())
#define mp make_pair
#define Fi first
#define Se second
#define pii pair
#define pll pair
#define pli pair
#define pil pair
#define ALL(X) X.begin(),X.end()
#define RALL(X) X.rbegin(),X.rend()
#define rep(i,j,k) for(int i = j;i <= k;i ++)
#define per(i,j,k) for(int i = j;i >= k;i --)
#define mem(a,p) memset(a,p,sizeof(a))


const ll MOD = 1E9 + 7;
ll qmod(ll a,ll b,ll c) {ll res=1;a%=c; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%c;a=a*a%c;}return res;}
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}

template
void upmax(T& a,S b){if(a
void upmin(T& a,S b){if(a>b) a=b;}
void gettle() {while(1);}
void getre() {int t=0;t/=t;}
template
void W(T n) {cout << n << endl;}


/
/
/
/

const int N = 1E5 + 7;

int res[9];

int mx[4][N<<2];
int mi[4][N<<2];
pii a[N];


int main()
{
    int n, m;
    scanf("%d %d", &n, &m);

    mem(mx, 0);
    mem(mi, 0x3f);

    rep (i,1,m) {
        int x, y;
        scanf("%d %d", &x, &y);
        a[i].Fi = x;
        a[i].Se = y;

        upmax(mx[0][y], x);
        upmin(mi[0][y], x);

        upmax(mx[1][x], y);
        upmin(mi[1][x], y);

        upmax(mx[2][y - x + N], x);
        upmin(mi[2][y - x + N], x);

        upmax(mx[3][x + y], y);
        upmin(mi[3][x + y], y);

    }



    rep (i, 1, m) {
        int x, y;
        tie(x,y) = a[i];
        int o = 0;

        if(x != mx[0][y]) o ++;
        if(x != mi[0][y]) o ++;

        if(y != mx[1][x]) o ++;
        if(y != mi[1][x]) o ++;
//        W(o);

        if(x != mx[2][y - x + N]) o ++;
        if(x != mi[2][y - x + N]) o ++;

        if(y != mx[3][x + y]) o ++;
        if(y != mi[3][x + y]) o ++;

//        W(o);

        res[o] ++;
    }

    rep(i,0,8) printf("%d%c",res[i], i == 8 ? '\n' : ' ');

    return 0;
}

示例2

输入

10 3
1 1
1 2
1 3

输出

0 2 1 0 0 0 0 0 0


题解:统计4个方向,然后需要记录4个方向上的最大的最小点。



你可能感兴趣的:(思维题,模拟)