牛客练习赛48 D 小w的基站网络
链接:https://ac.nowcoder.com/acm/contest/923/D
来源:牛客网
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld


备注:
由于输入量和输出量比较大,请勿使用cin,cout进行输入输出。
本题不会卡常数,不用特地使用输入输出挂。
思路:
题意:
t=|x1*y2-x2*y1|;
输出基本点(第k个点)到其他各点最小的t值,因为基本点可以途经其他点最后到达目标点,如果无法到达目标点那么输出-1,自己到达自己则输出0,否则输出t值
步骤:
1.讲点按照与x正方向轴的夹角(点都在x轴的上半部分,点的y值均大于0)由小到大排个序(操作就在cmp中)
2.然后遍历到所在的点,这个点之前的点输出的dp值均为-1,因为x1*y2-x2*y1<0
3,从该点之后的点进行操作
4.如果suan(start,i)==0,那么该点对应为-1,直接下一个数
5.每当该点a可以到达的时候,就把该点存储起来,然后遍历下一个点b,从基本点到b的t值如果>基本点到a的最小t值加a与b的t,那么就动态更新基本点到b的值
6.最后输出每个点的dp值即可。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+;
struct node
{
ll x,y; int pos;
}s[maxn];
bool cmp(const node &x,const node &y)
{
long long temp=x.x*y.y-x.y*y.x;
if(temp)
{
return temp>;
}
else
{
return x.x*x.x+x.y*x.y>y.x*y.x+y.y*y.y;
}
}
ll suan(int i,int j)
{
return s[i].x*s[j].y-s[j].x*s[i].y;
}
ll dp[maxn]; int sta[maxn];
int main()
{
int n,pos,start,top=;
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%lld %lld",&s[i].x,&s[i].y);
s[i].pos=i;
}
memset(dp,-,sizeof(dp));
sort(s+,s++n,cmp);
scanf("%d",&pos);
for(int i=;i<=n;i++){
if(s[i].pos==pos)
{
start=i;
break;
}
}
sta[top=]=start; dp[pos]=;
for(int i=start+;i<=n;i++)
{
if(suan(start,i)==) continue;
while(top>&&suan(sta[top-],sta[top])==) --top;//防止经过一系列出栈后,栈顶点与栈顶的下一个元素的t值为0.
while(top>&&suan(sta[top],i)+dp[s[sta[top]].pos]>=suan(sta[top-],i)+dp[s[sta[top-]].pos]) --top;
dp[s[i].pos]=dp[s[sta[top]].pos]+suan(sta[top],i);//更新数值
sta[++top]=i;//栈的作用
}
for(int i=;i<=n;i++)
{
printf("%lld\n",dp[i]);
}
return ;
}
牛客练习赛48 D 小w的基站网络的更多相关文章
- 牛客练习赛48 C 小w的糖果 (数学,多项式,差分)
牛客练习赛48 C 小w的糖果 (数学,多项式) 链接:https://ac.nowcoder.com/acm/contest/923/C来源:牛客网 题目描述 小w和他的两位队友teito.toki ...
- 牛客练习赛48 A· 小w的a+b问题 (贪心,构造,二进制)
牛客练习赛48 A· 小w的a+b问题 链接:https://ac.nowcoder.com/acm/contest/923/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C ...
- 牛客练习赛48 E 小w的矩阵前k大元素
E 思路: 优先队列,将迭代器变量作为结构体的变量. 迭代器走的时候只能像一个方向走,另外一个方向只有最开始才走.如下图所示: 如果两个方向同时走,同一个值会被遍历多次,像上图那样就能保证每个位置都走 ...
- 牛客练习赛44 C 小y的质数 (数论,容斥定理)
链接:https://ac.nowcoder.com/acm/contest/634/C 来源:牛客网 题目描述 给出一个区间[L,R],求出[L,R]中孪生质数有多少对. 由于这是一个区间筛质数的模 ...
- 牛客练习赛44 B 小y的线段 (思维)
链接:https://ac.nowcoder.com/acm/contest/634/B 来源:牛客网 题目描述 给出n条线段,第i条线段的长度为a_ia i ,每次可以从第i条线段的j位置跳到第 ...
- 牛客练习赛44 A 小y的序列 (模拟,细节)
链接:https://ac.nowcoder.com/acm/contest/634/A 来源:牛客网 小y的序列 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语 ...
- 牛客练习赛48 C,D,E
C 小w的糖果 题意:3种操作,第一种是使pos右边的数全部+1,第二种是pos右边的数依次+k(k从1开始递增),第三种是pos右边的数依次+k^2(k从1开始递增). 解法:第一种我们很容易想到差 ...
- 牛客练习赛40 A 小D的剧场 (思维dp)
链接:https://ac.nowcoder.com/acm/contest/369/A 题目描述 若你摘得小的星星 你将得到小的幸福 若你摘得大的星星 你将得到大的财富 若两者都能摘得 你将得到 ...
- 牛客练习赛40 C 小A与欧拉路(树的直径)
链接:https://ac.nowcoder.com/acm/contest/369/C 题目描述 小A给你了一棵树,对于这棵树上的每一条边,你都可以将它复制任意(可以为0)次(即在这条边连接的两个点 ...
随机推荐
- Python matplotlib 交互模式
在交互模式下一定要执行plt.pause(0.0001) 才会显示图像
- CVE-2010-4258漏洞分析
Nelson Elhage最近发现了一个内核设计上的漏洞, 通过利用这个漏洞可以将一些以前只能dos的漏洞变成可以权限提升的漏洞. 当fork一个进程在的时候, copy_process执行如下操作: ...
- 纯Delphi 原生写的 上传到七牛的功能
上传文件到七牛, 支持分片分段上传, 适用于Delphi XE, 10等新版本 分两个函数: uploadToQiniu 和 directUploadToQiniu uploadToQiniu 这个函 ...
- Ubuntu apt-get 更新/查看软件
ubuntu 升级软件: sudo apt-get update 更新源 sudo apt-get upgrade 更新已安装的包 sudo apt-get dist-upgrade 升级系统 ubu ...
- Debug模式的三种配置方法
使用`app.config.from_object`的方式加载配置文件: 1. 导入`import config`.2. 使用`app.config.from_object(config)`. ### ...
- junit单元测试报错Failed to load ApplicationContext,但是项目发布到tomcat浏览器访问没问题
junit单元测试报错Failed to load ApplicationContext,但是项目发布到tomcat浏览器访问没问题,说明代码是没问题的,配置也没问题.开始时怀疑是我使用junit版本 ...
- 【记录】原生js日期格式化转换方法
情况一:将日期转换为指定的格式:比如转换成 年月日时分秒 首先我们在js中定义函数如下 Date.prototype.format = function(fmt) { var o = { " ...
- JNI 在Android Studio利用NDK编译运行一个简单的c库
NDK开发,其实是为了项目需要调用底层的一些C/C++的一些东西:另外就是为了效率更加高些.如果你在Eclipse+ADT下开发过NDK就能体会到要么是配置NDK还要下载Cygwin,配置Cygwin ...
- Mac下homebrew的安装与卸载
mac系统常用的软件安装工具就是homebrew 个人认为通过brew安装比较简单,下面介绍下如何安装 安装和卸载homebrew 安装 /usr/bin/ruby -e "$(curl - ...
- Educational Codeforces Round 60 (Rated for Div. 2) E. Decypher the String
题目大意:这是一道交互题.给你一个长度为n的字符串,这个字符串是经过规则变换的,题目不告诉你变换规则,但是允许你提问3次:每次提问你给出一个长度为n的字符串,程序会返回按变换规则变换后的字符串,提问3 ...