zoukankan      html  css  js  c++  java
  • C. Wilbur and Points---cf596C

    http://codeforces.com/problemset/problem/596/C

    题目大意:  给你n个数对  确保如果(x,y)存在这个集合  那么  0<=x'<=x && 0<=y'<=y (x',y')也一定存在这个集合    他们规定 i的美观值=(y-x)   还会给你一个美观值序列   每一个如果都有唯一一个i与之匹配   并且 这个集合后面的所有数都不能小于前面的数  也就是说(

    a[s[i]].x<=a[s[i-1]].x && a[s[i]].y<=a[s[i-1]].y

    分析:   我觉得应该先对a数组从小到大排序  这样避免以后在比较的时候出现错误

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<ctype.h>
    #include<math.h>
    #include<queue>
    #include<algorithm>
    #include<iostream>
    
    using namespace std;
    #define N 500050
    const double ESP = 1e-8;
    #define INF 0x3f3f3f3f
    #define memset(a,b) memset(a,b,sizeof(a))
    
    int s[N];
    
    struct node
    {
        int x,y;
    }a[N];
    struct Node
    {
        int v,k;
    }b[N],c[N];
    
    int cmp(Node p,Node q)
    {
        if(p.v!=q.v)
            return p.v<q.v;
        else
            return p.k<q.k;
    }
    
    int cmp1(node p,node q)
    {
        if(p.x!=q.x)
            return p.x<q.x;
        else
            return p.y<q.y;
    }
    
    int main()
    {
        int n;
        while(scanf("%d",&n)!=EOF)
        {
            memset(s,0);
            memset(a,0);
            memset(b,0);
            memset(c,0);
            for(int i=0;i<n;i++)
            {
                scanf("%d %d",&a[i].x,&a[i].y);
            }
            sort(a,a+n,cmp1);
            for(int i=0;i<n;i++)
            {
                c[i].v=a[i].y-a[i].x;
                c[i].k=i;
            }
            for(int i=0;i<n;i++)
            {
                scanf("%d",&b[i].v);
                b[i].k=i;
            }
            sort(b,b+n,cmp);
            sort(c,c+n,cmp);
            int flag=0;
            for(int i=0;i<n;i++)
            {
                if(b[i].v!=c[i].v)
                {
                    flag=1;
                    break;
                }
                else
                {
                    s[b[i].k]=c[i].k;
                }
            }
            for(int i=1;i<n;i++)
            {
                if(a[s[i]].x<=a[s[i-1]].x && a[s[i]].y<=a[s[i-1]].y)
                    flag=1;
                if(flag==1)
                    break;
            }
            if(flag==1)
                printf("NO
    ");
            else
            {
                printf("YES
    ");
                for(int i=0;i<n;i++)
                {
                    printf("%d %d
    ",a[s[i]].x,a[s[i]].y);
                }
            }
        }
        return 0;
    }
  • 相关阅读:
    CF1172F
    CF506E
    【清华集训2014】玛里苟斯
    CF516E Drazil and His Happy Friends
    [NOI2017]游戏(2-SAT)
    [bzoj2878][Noi2012]迷失游乐园(基环树dp)
    bzoj3545/bzoj3551 [ONTAK2010]Peaks/Peaks加强版
    [bzoj1791][ioi2008]Island 岛屿(基环树、树的直径)
    [AT2306]Rearranging(拓扑序)
    [bzoj5301][Cqoi2018]异或序列
  • 原文地址:https://www.cnblogs.com/linliu/p/5442448.html
Copyright © 2011-2022 走看看