Cogs 1995. Yukari
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的更多相关文章
- HDU4430 Yukari's Birthday(枚举+二分)
Yukari's Birthday HDU4430 就是枚举+二分: 注意处理怎样判断溢出...(因为题目只要10^12) 先前还以为要用到快速幂和等比数列的快速求和(但肯定会超__int64) 而 ...
- 【COGS 254】【POI 2001】交通网络图
http://www.cogs.top/cogs/problem/problem.php?pid=254 dist[i]表示能最早到达i点的时间.这样就可以用最短路模型来转移了. #include&l ...
- POJ 1995 快速幂模板
http://poj.org/problem?id=1995 简单的快速幂问题 要注意num每次加过以后也要取余,否则会出问题 #include<iostream> #include< ...
- 【COGS】894. 追查坏牛奶
http://cojs.tk/cogs/problem/problem.php?pid=894 题意:n个点m条边的加权网络,求最少边数的按编号字典序最小的最小割.(n<=32, m<=1 ...
- poj 1995 裸快速幂
1. poj 1995 Raising Modulo Numbers 2.链接:http://poj.org/problem?id=1995 3.总结:今天七夕,来发水题纪念一下...入ACM这个坑 ...
- [codevs 1995]黑魔法师之门(并查集)
题目:http://codevs.cn/problem/1995/ 分析:脑补一下满足题目要求的子图肯定就是环……于是题目就变成了不断加边求环的个数.看起来有点麻烦……但是环的实质是几个小环组合起来的 ...
- 【COGS】147. [USACO Jan08] 架设电话线(二分+spfa)
http://cojs.tk/cogs/problem/problem.php?pid=147 学到新姿势了orz 这题求的是一条1-n的路径的最大路径最小. 当然是在k以外的. 我们可以转换一下. ...
- 【COGS & USACO Training】710. 命名那个数字(hash+水题+dfs)
http://cojs.tk/cogs/problem/problem.php?pid=710 近日开始刷水... 此题我为了练一下hash...但是hash跑得比暴力还慢.. 不言而喻... #in ...
- 【COGS & USACO】896. 圈奶牛(凸包)
http://cojs.tk/cogs/problem/problem.php?pid=896 我的计算几何入门题... 看了看白书的计算几何部分,,恩好嘛.. 乃们都用向量!!!! 干嘛非要将2个点 ...
随机推荐
- Java_注解_00_资源贴
1.Java注解教程:自定义注解示例,利用反射进行解析 2. (1)深入理解Java:注解(Annotation)基本概念 (2)深入理解Java:注解(Annotation)自定义注解入门 (3)深 ...
- 简单使用c3p0连接池
首先,c3p0是一个连接池插件 需要jar包: 使用手动配置: /** * 手动配置使用c3p0 * @throws PropertyVetoException * @throws SQLExcept ...
- docker 安装过程
- FFMPEG-AVFilter研究
FFMPEG中的libswscale是做像素转换的,但是对于一些复杂的操作,比如添加水印等,这个库就不行了,这时候就要说一下另外一个AVFilter.AVFilter完全可以替代libswscale的 ...
- 1014 Waiting in Line (30)(30 分)
Suppose a bank has N windows open for service. There is a yellow line in front of the windows which ...
- Operating System-Process(1)什么是进程&&进程的创建(Creation)&&进程的终止(Termination)&&进程的状态(State)
本文阐述操作系统的核心概念之一:进程(Process),主要内容: 什么是进程 进程的创建(Creation) 进程的终止(Termination) 进程的状态(State) 一.什么是进程 1.1 ...
- 修改MySQL的时区,涉及参数time_zone (转)
首先需要查看mysql的当前时区,用time_zone参数 mysql> show variables like '%time_zone%'; +------------------+----- ...
- spring初始化顺序
首先,Spring bean的默认加载顺序是怎么控制的 工程中有2个bean,A和B,其中必须先初始化A再初始化B,但是没有depend-on或者Order等方式去保证,只不过恰好刚好这么运行着没出事 ...
- canvas变换(移动,缩放等)
代码: 1 /** 2 * Created by Administrator on 2016/1/30. 3 */ 4 function draw (id){ 5 var canvas = docum ...
- 十二:JAVA I/O
输入模式 输出模式 ⑴字节输入流:InputStream ⑵字节输出流:Output ...