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. winform 添加帮助按钮

    1. 添加提示信息 新建个窗体项目,项目名称为WinFormUI,解决方案名称为WinFormWithHelpDoc.删除默认创建的Form1,新建窗体MainForm,设置相关属性.我们要完成的效果 ...

  2. C# 多线程 线程池(ThreadPool) 2 如何控制线程池?

    线程池启动了,但是没有方法去控制线程池,如果子线程出现了问题,难道线程池就死了吗? 我们可以设置线程池的线程数量,进行加入任务,线程池会自动分配并且合理的执行,但是控制不了又有啥意思呢. 线程池里线程 ...

  3. hibernate的update、merge和saveOrUpdate的区别(转)

    1.首先 saveOrUpdate返回void 也就是什么都不返回 而merge会返回一个对象 2.其次 saveOrUpdate的做法是:自动判断该对象是否曾经持久化过,如果曾持久化过则使用upda ...

  4. jspsmartupload 文件上传让input数据和文件上传同时提交

    一.使用原因: 文件上传时,表单的属性中必须要有multipart/form-data,如以下例子: <form name="form_post" class="a ...

  5. MarkDown不支持图片放缩。。

    ![](http://images2015.cnblogs.com/blog/573995/201604/573995-20160430162211050-1357272526.jpg =100x20 ...

  6. 2017-2018-1 20179203 《Linux内核原理与分析》第五周作业

    攥写人:李鹏举 学号:20179203 ( 原创作品转载请注明出处) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/US ...

  7. BZOJ5372: [Pkusc2018]神仙的游戏

    BZOJ5372: [Pkusc2018]神仙的游戏 https://lydsy.com/JudgeOnline/problem.php?id=5372 分析: 如果\(len\)为\(border\ ...

  8. ACM学习历程—UESTC 1217 The Battle of Chibi(递推 && 树状数组)(2015CCPC C)

    题目链接:http://acm.uestc.edu.cn/#/problem/show/1217 题目大意就是求一个序列里面长度为m的递增子序列的个数. 首先可以列出一个递推式p(len, i) =  ...

  9. ACM学习历程—Hihocoder 1233 Boxes(bfs)(2015北京网赛)

    hihoCoder挑战赛12 时间限制:1000ms 单点时限:1000ms 内存限制:256MB   描述 There is a strange storehouse in PKU. In this ...

  10. python mysql 查询返回字典结构

    cur = self.conn.cursor(MySQLdb.cursors.DictCursor)加上MySQLdb.cursors.DictCursor可以返回字典结构 {列名:值} class ...