Codeforces Round #331 (Div. 2)——C. Wilbur and Points

原创 2015年11月17日 21:31:57

MD,又因为一个傻逼错误搞了一个下午+一个晚上。。忧桑= =

题意:

现在有n个点,然后给出n个点的x,y坐标。然后这些坐标必须满足条件:比如说分配给点(x,y)的标号是i,那么点(x',y')的标号就必须是大于i的(这里x'>=x 或者 y'>=y 或者 x'>=x&&y'>=y)

然后给你n个的权值w[i],并且告诉你n个点的权值的计算公式是: s(xi, yi) = yi - xi = wi

然后让你安排n个点的标号,使它们在同时满足标号原则的前提下,并且使得第i个点的权值刚好满足w[i]。

思路:

比赛的时候没想到怎么给它们分配标号,参考了题解,很简单啊,首先先给它们进行排序,先按x值从小到大排,若x值相等,那么就按照y值从小到大排。然后,就是把权值为w[i]的点的坐标全都存下来,再来分配就好啦。

然后,判断是否符合标号原则,我们记arr[i][j]为权值为i的点集合中第j个点的序号,然后让它去与arr[i+1][j]和arr[i][j+1]去判断就好了。这里注意要判断arr[i+1],arr[j+1]这个集合是否为空,如果为空的那么这个点就不要判断了。

这题可能w[i]为负,所以我的办法是把它们全都进行平移10000个单位,相当于移动了坐标系。

噢,这题还有许多关于STL的用法,STL用的好的话真是十分方便的呢。还有pair函数,哈哈,第一次用呢。

#include<cstdio>
#include<cstring>
#include<map>
#include<set>
#include<cmath>
#include<algorithm>
#include<vector>
#include<queue>
#include<iostream>
using namespace std;
typedef __int64 ll;
typedef unsigned __int64 ULL;
#define inf 99999999
#define add 100000
#define maxn 200022
int w[maxn];
struct node{
    int x,y;
    int idx;
    node(){}
    node(int xx,int yy){
        x=xx;
        y=yy;
    }
    friend bool operator <(node a,node b){
        if(a.x!=b.x) return a.x<b.x;
        else return a.y<b.y;
    }
};
map<int,int> mp;
set<node> st[maxn];
set<node>::iterator it;
vector<int> dian[maxn];
vector<int> ans[maxn];
pair<int,int> par[maxn];
int main(){
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        int x,y;
        scanf("%d%d",&x,&y);
        st[y-x+add].insert(node(x,y));
    }
    for(int i=1;i<=n;i++){
        scanf("%d",&w[i]);
        dian[w[i]+add].push_back(i);
    }
    for(int i=1;i<=n;i++){
        if(st[w[i]+add].size()!=dian[w[i]+add].size()){
            printf("NO\n");
            return 0;
        }
    }
    node tmp;
    for(int i=1;i<=n;i++){
        it=st[w[i]+add].begin();
        tmp=*it;
        int xx=(*it).x,yy=(*it).y;
        int idx=dian[w[i]+add][mp[w[i]+add]];
        par[idx]=make_pair(xx,yy);
        ans[xx].push_back(yy);
        int len=ans[xx].size()-1;
        ans[xx][len]=idx;
        st[w[i]+add].erase(tmp);
        mp[w[i]+add]++;
    }
    for(int i=0;i<100010;i++){
        for(int j=0;j<ans[i].size();j++){
            if(ans[i+1].size()>j&&ans[i+1][j]<ans[i][j]){
                printf("NO\n");
                return 0;
            }
            if(j+1<ans[i].size()&&ans[i][j]>ans[i][j+1]){
                printf("NO\n");
                return 0;
            }
        }
    }
    printf("YES\n");
    for(int i=1;i<=n;i++){
        printf("%d %d\n",par[i].first,par[i].second);
    }
    return 0;
}
/*
9
0 0
1 0
2 0
0 1
1 1
2 1
1 2
2 2
0 2
0 0 0 -1 -1 -2 1 1 2
*/

加油!

版权声明:本文为博主原创文章,未经博主允许不得转载。

Codeforces Round #331 (Div. 2) C. Wilbur and Points

time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandar...

Codeforces Round #331 (Div. 2) C. Wilbur and Points 贪心+排序

题目~~ 题意: 有n个坐标,wi为(yi-xi),再给出n个wj(j=0~n), wi==wj 则第i个坐标标号为j,而满足xi...

【Codeforces Round 331 (Div 2)C】【脑洞 SET贪心写法】Wilbur and Points 锯齿图形差值编号,右上角的最大

Wilbur and Points time limit per test 2 seconds memory limit per test 256 megabytes input stan...

Codeforces Round #331 (Div. 2)-Wilbur and Swimming Pool(模拟)

A. Wilbur and Swimming Pool time limit per test 1 second memory limit per test 256 megab...

Codeforces Round #331 (Div. 2) _A. Wilbur and Swimming Pool

A. Wilbur and Swimming Pool time limit per test 1 second memory limit per test 256 megab...

【Codeforces Round 331 (Div 2)B】【水题 贪心】Wilbur and Array 修改对p位置后的所有位置生效 最少修改次数使得数列变成b

Wilbur and Array time limit per test 2 seconds memory limit per test 256 megabytes ...

【Codeforces Round 331 (Div 2)A】【水题】Wilbur and Swimming Pool 给出矩形1~4个顶点让你还原矩形

Wilbur and Swimming Pool time limit per test 1 second memory limit per test 256 megabyte...

Codeforces Round #331 D. Wilbur and Trees(概率dp+区间dp)

题意:在一条直线上有n棵树,每棵树的高度都为h,每次等概率的砍掉最左边或最右边的树,一棵树如果被砍掉有p的概率向左倒下,有1-p的概率向右倒下,如果两树之间距离小于h,那么一颗树倒下后可以击中另一棵树...

Codeforces596C. Wilbur and Points

C. Wilbur and Points time limit per test 2 seconds memory limit per test 256 megabytes input stan...

Codeforces596C Wilbur and Points(贪心)

@(K ACMer)题意: 给你一个点集,每个点的weight为(y−x)(y - x),你需要给出这些点的一个排列,这些点满足:如果y2>=y1且x2>=x1y2 >= y1 且x2 >= x1,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Codeforces Round #331 (Div. 2)——C. Wilbur and Points
举报原因:
原因补充:

(最多只允许输入30个字)