GDOI2014模拟pty爬山(mountain)

时间:2023-01-25 13:46:40

pty爬山(mountain)

在Pty学校附近,有一座名之为岳之麓的高山。Pty很喜欢和(哔——)一起爬山。
山的平面模型如下:
山由一个顶点集:A1,A2…An给定,保证Ai的x单调递增。我们将Ai和Ai+1之间连上线段,表示山的某一段。如下图所示:
GDOI2014模拟pty爬山(mountain)
Pty想要爬到这座山的最高的顶点,当两个顶点的高度相同时,我们认为x比较大的顶点要高一些。Pty不是盲人,所以他将会在爬山时采取一些策略,使得他能够尽量快的到达最高的顶点。
Pty从初始的顶点出发,往左右看去,他将朝他能够看到的最高的顶点方向走去。当走到每一个顶点时,他都会重新观察,如果这时看到的顶点比之前看到的顶点还要高,那么他将选择此时看到的顶点走去,直到他到达最高点为止。如果顶点A能够看到顶点B,则线段AB没有严格穿过山的内部。
例如上图中:Pty从A4点出发。他能够看到的最高点是A6,所以他将会向右侧走去。当他到达A5号点时,能够看到A1点比A6点更高,所以他会调转方向,向左侧走去。由于A1是最高的顶点,所以他将一直往左侧走,直到到达A1为止。
Pty想知道从每一个顶点出发,分别需要走过多少段才能到达最高点。例如上图中从A4出发需要走过5段才能到达最高点。

输入格式:

第一行输入n,表示n个顶点。
接下来n行,每行两个整数xi, yi,表示第i个顶点的坐标。
输入保证xi单调递增。

输出格式:

输出共n行:第i行表示从第i个顶点出发走到最高点需要经过多少段。

样例输入:

5
1 5
2 4
3 9
4 0
5 2

样例输出:

2
1
0
1
2

数据范围:

30%的数据满足:n<= 100
60%的数据满足:n <= 50000
100%的数据满足:n<=200000, xi<=10^6, yi <= 10^6

i一定能看见i−1
i如果看不见l[i−1],那么一定看不见1~l[i−1]
i如果看得见l[i−1]且看不见l[l[i−1]],那么l[i]=l[i−1]
所以可以用动态规划在O(n)内求出i点向左、向右能看到的最高点。
然后再处理出每个点出发时能看到的最高点,将它按照y与x从小到大排序
按照排序后的顺序,高度从低到高的点依次做。这个点该往哪边走,双向链表中对应方向上与之相邻的点就是要找的点,然后把做过的点删掉即可。(妙!
发现形成了一棵以最高点为根的树,dfs求出答案即可。
 #include<cstdio>
 #include<cstring>
 #include<iostream>
 #include<algorithm>
 using namespace std;
 ;
 struct node{
     int next,to;
 }edge[N];
 struct no{
     int y,z,to;
 }a[N];
 ,L[N],R[N],f[N];
 inline void del(int x)
 {
     R[L[x]]=R[x];
     L[R[x]]=L[x];
 }
 inline bool see(int a,int b,int c)//a>b>c
 {
     double s=(0.0+y[a]-y[c])/(x[a]-x[c]+0.0);
     s=s*(x[b]-x[c])+y[c];
     if(y[b]<=s) return true;
     else return false;
 }
 inline void unite(int x,int y)
 {
     s++;
     edge[s].to=y;
     edge[s].next=head[x];
     head[x]=s;
 }
 inline void dfs(int x,int dis)
 {
     f[x]=dis;
     for(int i=head[x];i;i=edge[i].next) dfs(edge[i].to,dis+abs(x-edge[i].to));
 }
 inline ?x:-x);}
 inline bool cmp(no a,no b){if(a.y!=b.y) return a.y<b.y;return a.to<b.to;}
 int main()
 {
     ,rec,p,et;
     scanf("%d",&n);
     ;i<=n;i++)
     {
         scanf("%d%d",&x[i],&y[i]);
         if(mx<=y[i]){mx=y[i];rec=i;}
     }
     ;i<=n;i++)
     {
         l[i]=i-;
         ) l[i]=l[l[i]];
     }
     r[n]=n+;
     ;i>=;i--)
     {
         r[i]=i+;
         while(y[r[i]]<=y[r[r[i]]]&&see(r[r[i]],r[i],i)&&r[i]!=n) r[i]=r[r[i]];
     }
     ;i<=n;i++)
     {
         R[i]=i+;
         L[i]=i-;
         a[i].z=i;
         if(y[r[i]]>=y[l[i]]) a[i].to=r[i];
         else a[i].to=l[i];
         a[i].y=y[a[i].to];
     }
     a[rec].y=;
     sort(a+,a+n+,cmp);
     ;i<n;i++)
     {
         p=a[i].z;
         if(a[i].to<p) et=L[p];
         else et=R[p];
         unite(et,p);
         del(p);
     }
     dfs(rec,);
     ;i<=n;i++) printf("%d\n",f[i]);
     ;
 }
 
 

GDOI2014模拟pty爬山(mountain)的更多相关文章

  1. P1561 &lbrack;USACO12JAN&rsqb;爬山Mountain Climbing

    P1561 [USACO12JAN]爬山Mountain Climbing 题目描述 Farmer John has discovered that his cows produce higher q ...

  2. 【GDOI2014模拟】JZOJ2020年8月14日提高组 服务器

    [GDOI2014模拟]JZOJ2020年8月14日提高组 服务器 题目 Time and Memory Limits Description 我们需要将一个文件复制到n个服务器上,这些服务器的编号为 ...

  3. 【GDOI2014模拟】JZOJ2020年8月14日T2 网格

    [GDOI2014模拟]JZOJ2020年8月14日T2 网格 题目 Time and Memory Limits Description 某城市的街道呈网格状,左下角坐标为A(0, 0),右上角坐标 ...

  4. &lbrack;JZOJ3402&rsqb; 【GDOI2014模拟】Pty的字符串

    题目 给你一棵每条边从父亲指向儿子的树,每条边上面有一个字母. 从树上的任意一点出发,走出的路径就是对应一个子串. (这不是\(Trie\),因为每个父亲可能会连出字母相同的边) 再给你一个字符串\( ...

  5. &lbrack;USACO12JAN&rsqb;爬山Mountain Climbing

    题目描述 Farmer John has discovered that his cows produce higher quality milk when they are subject to s ...

  6. 洛谷—— P1561 &lbrack;USACO12JAN&rsqb;爬山Mountain Climbing

    https://daniu.luogu.org/problemnew/show/P1561 题目描述 Farmer John has discovered that his cows produce ...

  7. &lbrack;noip模拟&rsqb;小猫爬山&lt&semi;迭代深搜&gt&semi;

    [题目描述]: Freda和rainbow饲养了N只小猫,这天,小猫们要去爬山.经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了(呜咕>_<). Freda和rai ...

  8. BZOJ3755 &colon; Pty爬山

    l[i],r[i]表示站在i点往左往右走能看到的最高峰,用栈维护凸壳求出 h[i]表示i点能看到的最高峰的高度 a[i],b[i]表示i点往左往右走时反悔的点,即第一个h[j]>h[i]的j,用 ...

  9. GDOI2014模拟 旅行【SPFA】

    旅行(travel) 从前有一位旅者,他想要游遍天下所有的景点.这一天他来到了一个神奇的王国:在这片土地上,有n个城市,从1到n进行编号.王国中有m条道路,第i条道路连接着两个城市ai,bi,由于年代 ...

随机推荐

  1. ubuntu下mysql使用方法

    连接mysql的命令为: mysql -u root(用户名) -p 使用 mysqladmin 命令行 修改 用户名密码的方式.最正确的格式如下: mysqladmin -u root -p pas ...

  2. C&num;时间戳转成php的time&lpar;&rpar;

    DateTime timeStamp = new DateTime(1970,1,1);  //得到1970年的时间戳 long a = (DateTime.UtcNow.Ticks - timeSt ...

  3. poj 1182&colon;食物链(种类并查集,食物链问题)

    食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 44168   Accepted: 12878 Description ...

  4. 各种语言中的urlencode方法

    转载自:http://blog.sina.com.cn/s/blog_3f195d2501000a9b.html URLENCODE和URLDECODE是比较常用的URL参数转换方法,为以后使用方便, ...

  5. javascript中的null,对象系统还是非对象系统?

    1.一直以来的认知 在我学习js的过程中,爱民老师的绿皮书里将js的类型系统分成了两类: 其一是元类型系统:由typeof运算来检测 其二是对象类型系统:是元类型的object的一个分支 而null这 ...

  6. C&num;发送带附件的邮件的代码

    如下的代码是关于C#发送带附件的邮件的代码. MailMessage m = new MailMessage();m.Subject = "File attachment!";m. ...

  7. NOIP2017 国庆郑州集训知识梳理汇总

    第一天 基础算法&&数学 day1难度测试 如果要用一个词来形容上午的测试,那真是体无完肤.  成绩: 题目 成绩 评价 T1 50 一般 T2 10 大失所望 T3 0 差 基础算法 ...

  8. &lowbar;&lowbar;x&lowbar;&lowbar;&lpar;37&rpar;0909第五天&lowbar;&lowbar;背景图按钮

    link,hover,active三种按键状态,存放三张图片 缺点: 资源只有在被使用时,才会被加载. 页面第一次加载时,会出现短暂的延迟闪烁,造成一次不佳的用户体验. 图片整合技术 CSS-Spri ...

  9. 输入URL地址到页面加载完成 过程

    在浏览器的地址栏中输入URL地址"http://www.gacl.cn:8080/JavaWebDemo1/1.jsp"去访问服务器上的1.jsp这个web资源的过程 1.浏览器根 ...

  10. ROS 订阅图像节点&lpar;1&rpar;

    博客 http://blog.csdn.net/github_30605157/article/details/50990493 参考ROS原网站 http://wiki.ros.org/image_ ...