• 【codeforces 131E】Yet Another Task with Queens


    【题目链接】:http://codeforces.com/problemset/problem/131/E

    【题意】

    给你n*n坐标上的m个皇后的位置;
    然后让你求出,能够攻击到0,1,2…8个其他皇后的皇后个数;
    (其他皇后可以被前面的皇后挡住,所以最多只能攻击到8个);

    【题解】

    按照横、纵、正对角、斜对角这4个方向搞;
    横坐标的话,将纵坐标升序排;
    然后对于每一个横坐标,将横坐标为它的皇后的标号加入到vector里面;
    (因为纵坐标升序排了,所以最两端的皇后就是vector里面第一个和最后一个皇后,那两个皇后能攻击到的个数+1,其他的+2);
    纵坐标、对角同理;

    【Number Of WA

    1

    【完整代码】

    #include <bits/stdc++.h>
    using namespace std;
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    #define LL long long
    #define rep1(i,a,b) for (int i = a;i <= b;i++)
    #define rep2(i,a,b) for (int i = a;i >= b;i--)
    #define mp make_pair
    #define pb push_back
    #define fi first
    #define se second
    #define ms(x,y) memset(x,y,sizeof x)
    #define Open() freopen("F:\rush.txt","r",stdin)
    #define Close() ios::sync_with_stdio(0),cin.tie(0)
    
    typedef pair<int,int> pii;
    typedef pair<LL,LL> pll;
    
    const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
    const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
    const double pi = acos(-1.0);
    const int N = 1e5+100;
    
    struct dian{
        int x,y,id;
    };
    
    dian a[N];
    int n,m,can[N],ans[10];
    vector <int> dic[N*3];
    
    void init(){
        rep1(i,0,(int) 3e5) dic[i].clear();
    }
    
    int main(){
        //Open();
        Close();//scanf,puts,printf not use
        //init??????
        cin >> n >> m;
        rep1(i,1,m){
            cin >> a[i].x >> a[i].y;
            a[i].id = i;
        }
    
        sort(a+1,a+1+m,[&] (dian a,dian b){return a.y<b.y;});
        rep1(i,1,m){
            dic[a[i].x].pb(a[i].id);
        }
        rep1(i,1,n){
            if ((int) dic[i].size()>1){
                rep1(j,0,(int) dic[i].size()-1){
                    if (j==0 || j == (int) dic[i].size()-1){
                        can[dic[i][j]]++;
                    }
                    else
                        can[dic[i][j]]+=2;
                }
            }
        }
    
        sort(a+1,a+1+m,[&] (dian a,dian b){return a.x<b.x;});
        init();
        rep1(i,1,m){
            dic[a[i].y].pb(a[i].id);
        }
        rep1(i,1,n){
            if ((int) dic[i].size()>1){
                rep1(j,0,(int) dic[i].size()-1){
                    if (j==0 || j == (int) dic[i].size()-1){
                        can[dic[i][j]]++;
                    }
                    else
                        can[dic[i][j]]+=2;
                }
            }
        }
    
        init();
        rep1(i,1,m){
            dic[a[i].x+a[i].y].pb(a[i].id);
        }
        rep1(i,1,2*n){
            if ((int) dic[i].size()>1){
                rep1(j,0,(int) dic[i].size()-1){
                    if (j==0 || j == (int) dic[i].size()-1){
                        can[dic[i][j]]++;
                    }
                    else
                        can[dic[i][j]]+=2;
                }
            }
        }
    
        init();
        rep1(i,1,m){
            dic[a[i].x-a[i].y+(int)1e5].pb(a[i].id);
        }
        rep1(i,0,(int)2e5+10){
            if ((int) dic[i].size()>1){
                rep1(j,0,(int) dic[i].size()-1){
                    if (j==0 || j == (int) dic[i].size()-1){
                        can[dic[i][j]]++;
                    }
                    else
                        can[dic[i][j]]+=2;
                }
            }
        }
    
        rep1(i,1,m){
            ans[can[i]]++;
        }
    
        rep1(i,0,8){
            cout << ans[i]<<(i==8?'
    ':' ');
        }
        return 0;
    }
  • 相关阅读:
    面试题38:股票最大收益问题
    面试题37:字符串中的括号
    面试题36:罗马数和阿拉伯数的相互转换
    面试题35:大数(字符串)相乘
    面试题34:文本对齐
    面试题33:简化目录路径
    面试题32:字符串的通配符匹配
    并发调度的可串行性
    mysql limit查询(分页查询)探究
    通过宏定义将__declspec(dllexport)与__declspec(dllimport)的转化,实现库代码和使用代码使用同一份头文件
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7626280.html
Copyright © 2020-2023  润新知