续续 Codeforces 596 C Wilbur and Points

来源:互联网 发布:复旦cpu卡算法 编辑:程序博客网 时间:2024/06/05 04:24

传送门:
http://codeforces.com/contest/596/problem/C

附上那份符合我当初屌丝想法的只排序不需要任何数据结构的写法
其实本质思想都是贪心,即先通过排序找到每个w[i]所对应的点号,然后保存下来
具体找法还是贪心去找,即x小优先,否则y小优先!!!!!
然后再O(n)扫一遍去判断合法性就ok了,其实我这个方法也是蛮优美的,因为它只需要把两边都排次序就可以完成匹配了。。。
不过就是我刚开始想的方法就是错的(虽然大概思想是对的),我的排序方法被样例给带偏了,这题首要想法就应该是贪心!!!
一共对两个数组排两次序,第一次是为了记录位置,第二次是为了恢复原来的序列,然后进行判断,哎,这么裸的想法,我当时怎么就没想到要恢复原序列再O(n)扫一遍判断合法性呢???

注意这种写法容易忽略掉的一点就是在对权值排序的时候如果相等的话要保证id的有序性,因为这道题目的本质就是判断给定的权值序列能否构成,如果不能保证之前的有序性就肯定会出问题的!!!!
(符合我前两份代码中确定解的时候的过程)
这份代码的优美之处就在于,它巧妙地利用第一次排序之后的结果把相应的位置记录了下来,记录下来了每一个w在原先线段序列中的位置!!!!
现在一看其实这题真的是蛮sb的!!!!
就是贪心加判断就ok了!!!!!

#include<iostream>#include<stdio.h>#include<string.h>#include<algorithm>#include<queue>#include<math.h>#include<stdlib.h>#include<vector>#include<map>#include<string>using namespace std;#define ll long long#define For(i,n) for(int i=1;i<=n;i++)#define Dor(i,n) for(int i=n;i>=1;i--)#define s(n) scanf("%d",&n)#define p(n) printf("%d\n",n)#define maxn 100000+10#define ms(n) memset(n,0,sizeof(n))#define lson l , m , rt << 1#define rson m + 1 , r , rt << 1 | 1const double eps=1e-8;const int inf=0x3f3f3f3f;int n;struct node{    int x,y,w,id,pre;}a[maxn],b[maxn];bool cmp(node a, node b)  {    if(a.w!=b.w) return a.w<b.w;    if(a.x!=b.x) return a.x<b.x;    if(a.y!=b.y) return a.y<b.y;}bool cmp1(node a,node b){   if(a.w==b.w) return a.id<b.id;    return a.w<b.w;}bool cmp2(node a,node b){    return a.id<b.id;}int main(){    s(n);    for(int i=0;i<n;i++)    {        s(a[i].x);s(a[i].y);        a[i].id=i;        a[i].w=a[i].y-a[i].x;    }    for(int i=0;i<n;i++)    {        s(b[i].w);b[i].id=i;    }    sort(a,a+n,cmp);    sort(b,b+n,cmp1);int flag=1;    for(int i=0;i<n;i++)    {        if(a[i].w!=b[i].w)        {            flag=0;break;        }        else b[i].pre=a[i].id;    }    if(!flag)     {        puts("NO");return 0;    }    sort(a,a+n,cmp2);sort(b,b+n,cmp2);    flag=1;    for(int i=1;i<n;i++)    {        if((a[b[i].pre].x>a[b[i-1].pre].x||a[b[i].pre].y>a[b[i-1].pre].y))        {            continue;        }        else         {            flag=0;break;        }    }       if(flag)    {        puts("YES");        for(int i=0;i<n;i++)        {            printf("%d %d\n",a[b[i].pre].x,a[b[i].pre].y);        }    }    else puts("NO");    return 0;}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 剃了发际线后悔怎么办 在外面遇到坏人抢劫怎么办 请事假单位不批怎么办 捷普请假不批怎么办 钉钉请假不审批怎么办 钉钉请假未审批怎么办 员工事假+工作履责怎么办 员工请事假不批怎么办 哺乳起员工一直请事假怎么办 请公休公司不批怎么办 辞职信交了不批怎么办 辞职年假没有休完怎么办 病假算旷工我该怎么办 辞职信领导不批怎么办 软顶帽子踏顶了怎么办 戴草帽总往下掉怎么办 白鞋子低帮发黄怎么办 跳伞的时候降落伞打不开怎么办 收腹裤穿着总是往下卷怎么办? 结婚打了黑伞怎么办 酷派x7开不了机怎么办 脸书账号被禁用怎么办 文档变成了d盘怎么办? 派派背包满了怎么办 黑裤子掉颜色了怎么办 快递被别人领走怎么办 绒面靴子长霉了怎么办 新买的鞋子开胶怎么办 白色的皮鞋边发黄怎么办 新鞋大拇指顶脚怎么办 耐克标志开胶了怎么办 鞋开胶了怎么办不用胶 gta按home没反应怎么办 gta5线上车没了怎么办 吃了粘壳的鸡蛋怎么办 gta5短信删错了怎么办 电风扇2档3档开好关不管用怎么办 gta5把车替换了怎么办 gta5任务完成后卡了怎么办 gta5车被扣押了怎么办 侠盗猎车手5卡怎么办