1995. Yukari

★★☆   输入文件:camera.in   输出文件:camera.out   简单对比
时间限制:1 s   内存限制:128 MB

题目背景:

幻想乡的创始人之一,八云紫,有着强大的控制结界的能力,可以瞬间消除一定范围内所有弹幕。我们可以将其消除范围视为一个矩形,而弹幕可以视为动点。

八云紫想要嘲讽她的敌人,所以她希望只使用一次消除能力,尽可能多地消除弹幕。

请你告诉她,在哪一时刻使用道具,可以消除尽可能多的弹幕。

问题描述:

在平面上给定一个矩形区域(也可能退化成线段或者点)。

矩形的边与坐标轴平行,左下端点为 (xl,yl),右上端点为 (xr,yr)。

给定 n 个动点,初始坐标为 (xi, yi),运动方向为 (ui,vi),速度为 sqrt((ui)^2+(vi)^2)

求在哪一时刻 t (t ∈ N),在矩形内部及边界的动点数目最多。

如果有多个 t 满足条件,输出最小的 t 即可。

输入格式:

第一行 5 个正整数,n, xl, yl, xr, yr,表示动点个数和矩形区域。

接下来 n 行,每行 4 个整数,xi, yi, ui, vi ,描述第 i 个动点。

输出格式:

在矩形内部及边界的动点数目最多的时刻 t (t ∈ N)。

如果有多个 t 满足条件,输出最小的 t 即可。

样例数据1:

camera.in

camera.out

2 2 2 3 3

3 1 -1 1

2 3 1 -1

1

样例数据2:

camera.in

camera.out

13 44 68 49 73

40 46 2 6

28 75 4 -1

32 61 3 3

41 64 2 1

40 99 2 -7

54 49 -2 6

32 80 4 -2

73 99 -7 -7

23 93 6 -5

44 96 0 -6

36 70 3 0

70 98 -6 -7

75 53 -7 4

4

 

 

数据范围:

对于前 40% 数据,

1<= n <= 100, 1 <= xl, xr, yl, yr, xi, yi <= 100, -10 <= ui, vi <= 10

对于100% 数据,

1<= n <= 10^5, 1 <= xl, xr, yl, yr, xi, yi <= 10^9, 0 <= |ui|, |vi|<= 10^5, xl <= xr, yl <= yr

保证 n,xl,xr,yl,yr,xi,yi,ui,vi 均为整数.

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define maxn 1000010
using namespace std;
int n,xl,yl,xr,yr;
int tot,cnt,sum[maxn],cnt1;
double l[maxn],r[maxn],h[maxn*],h1[maxn*];
int find(int x){
int l=,r=cnt,res=;
while(l<=r){
int mid=(l+r)>>;
if(h[mid]<=x)res=mid,l=mid+;
else r=mid-;
}
return res;
}
int main(){
//freopen("camera.in","r",stdin);freopen("camera.out","w",stdout);
freopen("Cola.txt","r",stdin);
scanf("%d%d%d%d%d",&n,&xl,&yl,&xr,&yr);
int x,y,u,v;
int t1,t2,sx1,sx2,sy1,sy2;
memset(r,,sizeof(r));
for(int i=;i<=n;i++){
scanf("%d%d%d%d",&x,&y,&u,&v);
if((x<xl&&u<=)||(x>xr&&u>=)||(y<yl&&v<=)||(y>yr&&v>=))continue;
tot++;
if(x<=xr&&x>=xl&&y<=yr&&y>=yl){
l[tot]=;
if(u>)r[tot]=min(r[tot],(double)(xr-x)/u);
if(u<)r[tot]=min(r[tot],(double)(xl-x)/u);
if(v>)r[tot]=min(r[tot],(double)(yr-y)/v);
if(v<)r[tot]=min(r[tot],(double)(yl-y)/v);
}
else{
if(u>){//向右飞
l[tot]=max(l[tot],(double)(xl-x)/u);//飞到左边界
r[tot]=min(r[tot],(double)(xr-x)/u);//飞到右边界
}
if(u<){//向左飞
l[tot]=max(l[tot],(double)(xr-x)/u);//飞到右边界
r[tot]=min(r[tot],(double)(xl-x)/u);//飞到左边界
} if(v>){//向上飞
l[tot]=max(l[tot],(double)(yl-y)/v);
r[tot]=min(r[tot],(double)(yr-y)/v);
}
if(v<){//向下飞
l[tot]=max(l[tot],(double)(yr-y)/v);
r[tot]=min(r[tot],(double)(yl-y)/v);
}
}
}
//for(int i=1;i<=n;i++)printf("%.2lf %.2lf\n",l[i],r[i]);
for(int i=;i<=tot;i++){
h1[++cnt1]=l[i];
h1[++cnt1]=r[i];
}
sort(h1+,h1+cnt1+);
h[++cnt]=h1[];
for(int i=;i<=cnt1;i++)
if(h1[i]!=h1[i-])h[++cnt]=h1[i];
for(int i=;i<=tot;i++){
int pos=find(l[i]);
sum[pos]++;
pos=find(r[i]);
sum[pos+]--;
}
int mx=,id=;
for(int i=;i<=n;i++){
sum[i]+=sum[i-];
if(sum[i]>mx)mx=sum[i],id=i;
}
printf("%.0lf",h[id]);
}

30分 算出所有弹幕出现的时间段+离散化+差分

#include<cstdio>
#include<algorithm>
using namespace std;
int INF=0x7fffffff;
int in[]={},out[]={};
int a[]={};
int main(){
freopen("camera.in","r",stdin);
freopen("camera.out","w",stdout);
int i,n,xl,yl,xr,yr,cnt=,sum=,maxc=,ans;
scanf("%d%d%d%d%d",&n,&xl,&yl,&xr,&yr);
for(i=;i<n;i++){
int x,y,u,v;
int txs=-,txe=INF,tys=-,tye=INF,ts=-,te=-;
scanf("%d%d%d%d",&x,&y,&u,&v);
if((x<xl&&u<=)||(x>xr&&u>=))continue;
if((y<yl&&v<=)||(y>yr&&v>=))continue;
if(x>=xl&&x<=xr&&y>=yl&&y<=yr){
ts=;
if(u==&&v==)te=INF;
else if(u==){
if(v>)te=(yr-y)/v;
else{v=-v;te=(y-yl)/v;}
}
else if(v==){
if(u>)te=(xr-x)/u;
else{u=-u;te=(x-xl)/u;}
}
else{
if(u>)txe=(xr-x)/u;
else{u=-u;txe=(x-xl)/u;}
if(v>)txe=(yr-y)/v;
else{v=-v;tye=(y-yl)/v;}
te=min(txe,tye);
}
}
else{
if(u<)u=-u;
if(v<)v=-v;
if(u==){
if(y
<=yl){tys=(yl-y+v-)/v;tye=(yr-y)/v;}
if(y>=yr){tys=(y-yr+v-)/v;tye=(y-yl)/v;}
}
else if(v==){
if(x<=xl){txs=(xl-x+u-)/u;txe=(xr-x)/u;}
if(x>=xr){txs=(x-xr+u-)/u;txe=(x-xl)/u;}
}
else{
if(x<=xl){txs=(xl-x+u-)/u;txe=(xr-x)/u;}
if(x>=xr){txs=(x-xr+u-)/u;txe=(x-xl)/u;}
if(y<=yl){tys=(yl-y+v-)/v;tye=(yr-y)/v;}
if(y>=yr){tys=(y-yr+v-)/v;tye=(y-yl)/v;}
}
ts=max(txs,tys);
te=min(txe,tye);
}
in[cnt]=ts;out[cnt++]=te;
}
for(i=;i<=cnt-;i++){a[in[i]]++;a[out[i]+]--;}
for(i=;i<=cnt-;i++){sum+=a[i];if(sum>maxc){maxc=sum;ans=i;}}
printf("%d",ans);
return ;
}

Cogs 1995. Yukari的更多相关文章

  1. HDU4430 Yukari's Birthday(枚举+二分)

    Yukari's Birthday  HDU4430 就是枚举+二分: 注意处理怎样判断溢出...(因为题目只要10^12) 先前还以为要用到快速幂和等比数列的快速求和(但肯定会超__int64) 而 ...

  2. 【COGS 254】【POI 2001】交通网络图

    http://www.cogs.top/cogs/problem/problem.php?pid=254 dist[i]表示能最早到达i点的时间.这样就可以用最短路模型来转移了. #include&l ...

  3. POJ 1995 快速幂模板

    http://poj.org/problem?id=1995 简单的快速幂问题 要注意num每次加过以后也要取余,否则会出问题 #include<iostream> #include< ...

  4. 【COGS】894. 追查坏牛奶

    http://cojs.tk/cogs/problem/problem.php?pid=894 题意:n个点m条边的加权网络,求最少边数的按编号字典序最小的最小割.(n<=32, m<=1 ...

  5. poj 1995 裸快速幂

    1. poj 1995  Raising Modulo Numbers 2.链接:http://poj.org/problem?id=1995 3.总结:今天七夕,来发水题纪念一下...入ACM这个坑 ...

  6. [codevs 1995]黑魔法师之门(并查集)

    题目:http://codevs.cn/problem/1995/ 分析:脑补一下满足题目要求的子图肯定就是环……于是题目就变成了不断加边求环的个数.看起来有点麻烦……但是环的实质是几个小环组合起来的 ...

  7. 【COGS】147. [USACO Jan08] 架设电话线(二分+spfa)

    http://cojs.tk/cogs/problem/problem.php?pid=147 学到新姿势了orz 这题求的是一条1-n的路径的最大路径最小. 当然是在k以外的. 我们可以转换一下. ...

  8. 【COGS & USACO Training】710. 命名那个数字(hash+水题+dfs)

    http://cojs.tk/cogs/problem/problem.php?pid=710 近日开始刷水... 此题我为了练一下hash...但是hash跑得比暴力还慢.. 不言而喻... #in ...

  9. 【COGS & USACO】896. 圈奶牛(凸包)

    http://cojs.tk/cogs/problem/problem.php?pid=896 我的计算几何入门题... 看了看白书的计算几何部分,,恩好嘛.. 乃们都用向量!!!! 干嘛非要将2个点 ...

随机推荐

  1. ZOJ 2724 Windows Message Queue (二叉堆,优先队列)

    思路:用优先队列 priority_queue,简单 两种方式改变队列 的优先级 (默认的是从大到小) #include<iostream> #include<queue> # ...

  2. ES提高数据压缩的设置——单字段,去掉source和all

    curl -XPUT 'http://localhost:9200/hec_test3' -d ' { "mappings": { "hec_type3": { ...

  3. 使用kill命令终止进程shell脚本

    因有的程序使用kill才能结束掉进程,没有关闭脚本,以我司的服务为例,服务名叫asset-server服务,只有启动脚本,自编写关闭脚本,及重启动脚本. 关闭服务脚本. vim asset-shutd ...

  4. Selenium-几种元素定位方式

    #识别元素并操作#一般有如下几种方法,其中id最为常用.这里需要注意识别元素一定要用唯一id 1.find_element_by_id("value") #! /usr/bin/e ...

  5. js的trim方法(转)

    写成类的方法格式如下:(str.trim();) <script language="javascript"> String.prototype.trim=functi ...

  6. Poj 1504 Adding Reversed Numbers(用字符串反转数字)

    一.题目大意 反转两个数字并相加,所得结果崽反转.反转规则:如果数字后面有0则反转后前面不留0. 二.题解 反转操作利用new StringBuffer(s).reverse().toString() ...

  7. Poj 1887 Testing the CATCHER(LIS)

    一.Description A military contractor for the Department of Defense has just completed a series of pre ...

  8. java基础知识(11)---多线程

    多线程: 进程:正在进行中的程序.其实进程就是一个应用程序运行时的内存分配空间. 线程:其实就是进程中一个程序执行控制单元,一条执行路径.进程负责的是应用程序的空间的标示.线程负责的是应用程序的执行顺 ...

  9. Quartz.NET+TopSelf 实现定时服务

    转载http://www.cnblogs.com/jys509/p/4628926.html Quartz.NET 入门 2015-07-09 00:59 by jiangys, 67858 阅读,  ...

  10. BLUETOOTH_DEVICE_INFO 函数

    typedef struct _BLUETOOTH_DEVICE_INFO { DWORD dwSize; BLUETOOTH_ADDRESS Address; ULONG ulClassofDevi ...