题目描述

输入

输出

样例输入

4 2

1 2 2

2 0 2

3 0 0

4 2 0

样例输出

1 2 1

数据范围

样例解释

圆圈只在出现的时刻有效。即:时刻t_i时鼠标位置恰好在(x_i,y_i)才能得分。

Kaguya所做的工作就是在这些时刻间移动鼠标。

对于样例:选择点击第2、4个圆圈。

时间[0,2]内,鼠标从(0,0)移动到(0,2),速度为1,并在时刻2得分。

时间[2,4]内,鼠标从(0,2)移动到(2,0),速度为sqrt(2),并在时刻4得分。

因此答案为sqrt(2), a=1 b=2 c=1

解法

二分最大速度的取值,有n^2种。

再利用动态规划解决判定性问题。

注意卡常。

代码

#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#include<stdlib.h>
#include<time.h>
#define ll long long
#define ln(x,y) int(log(x)/log(y))
#define sqr(x) ((x)*(x))
#define random(x) (rand()%x)
using namespace std;
const char* fin="aP2.in";
const char* fout="aP2.out";
const int inf=0x7fffffff;
const int maxn=2007,maxtot=maxn*maxn;
int n,m,i,j,k,tot,l,r,mid,cnt;
struct node{
int t,x,y;
}a[maxn];
int gcd(int a,int b){
if (b) return gcd(b,a%b);
else return a;
}
struct fuck{
int a,b,c;
fuck(){
a=b=c=0;
}
double val(){
if (c==0) return inf;
return a*sqrt(b)/c;
}
bool operator <=(const fuck& b1){
return (ll)sqr(a)*b*sqr(b1.c)<=(ll)sqr(b1.a)*b1.b*sqr(c);
}
bool operator <(const fuck& b1){
return (ll)sqr(a)*b*sqr(b1.c)<(ll)sqr(b1.a)*b1.b*sqr(c);
}
bool operator >(const fuck& b1){
return (ll)sqr(a)*b*sqr(b1.c)>(ll)sqr(b1.a)*b1.b*sqr(c);
}
void operator =(const fuck& b1){
a=b1.a;
b=b1.b;
c=b1.c;
}
void print(){
int i,j,k;
for (i=2;i<=int(sqrt(b));i++){
while (b%sqr(i)==0){
a*=i;
b/=sqr(i);
}
}
k=gcd(a,c);
a/=k;
c/=k;
printf("%d %d %d",a,b,c);
}
}b[maxn*maxn];
bool cmp(fuck a,fuck b){
return a<b;
}
fuck dist(int sx,int sy,int tx,int ty,int t){
fuck A;
A.a=1;
A.b=sqr(sx-tx)+sqr(sy-ty);
A.c=t;
return A;
}
fuck dist(int x,int y){
fuck A;
A.a=1;
A.b=sqr(a[x].x-a[y].x)+sqr(a[x].y-a[y].y);
A.c=abs(a[x].t-a[y].t);
return A;
}
int f[maxn],g[maxn];
fuck tmd,tmp;
bool judge(fuck ans){
int i,j,k;
f[0]=0;
g[0]=0;
for (i=1;i<=n;i++){
f[i]=0;
for (j=i-1;j>=0;j--){
if (f[i]<g[j]+1){
cnt++;
if (dist(i,j)<=ans){
f[i]=max(f[j]+1,f[i]);
}
}
}
g[i]=max(f[i],g[i-1]);
}
return f[n]>=m;
}
void qsort(int l,int r){
int i=l,j=r,k=l+(r-l)/2;
fuck mid=b[k];
while (i<=j){
while (b[i]<mid) i++;
while (b[j]>mid) j--;
if (i<=j){
swap(b[i],b[j]);
i++;
j--;
}
}
if (l<j) qsort(l,j);
if (i<r) qsort(i,r);
}
int main(){
srand(time(0));
scanf("%d%d",&n,&m);
a[0].t=a[0].x=a[0].y=0;
for (i=1;i<=n;i++){
scanf("%d%d%d",&a[i].t,&a[i].x,&a[i].y);
}
b[++tot].a=0;b[tot].b=0;b[tot].c=1;
for (i=0;i<=n;i++) {
tmd.a=tmd.b=tmd.c=0;
for (j=i+1;j<=n;j++) {
tmp=dist(i,j);
if (tmd<tmp) continue;
b[++tot]=tmp;
tmd=tmp;
}
}
sort(b+1,b+tot+1,cmp);
l=1;
r=tot;
k=0;
while (l<r){
k++;
mid=(l+r)/2;
if (judge(b[mid])) r=mid;
else l=mid+1;
}
//printf("%d %d\n",cnt,k);
b[l].print();
return 0;
}

启发

最值套最值用二分,当数值不能二分时,考虑取值。

卡常时去除冗余状态。

【JZOJ4783】【NOIP2016提高A组模拟9.15】Osu的更多相关文章

  1. NOIP2016提高A组模拟10.15总结

    第一题,就是将原有的式子一步步简化,不过有点麻烦,搞了很久. 第二题,枚举上下边界,维护一个单调队列,二分. 比赛上没有想到,只打了个暴力,坑了80分. 第三题,贪心,最后的十多分钟才想到,没有打出来 ...

  2. 【NOIP2016提高A组模拟10.15】打膈膜

    题目 分析 贪心, 先将怪物按生命值从小到大排序(显然按这个顺序打是最优的) 枚举可以发对少次群体攻击, 首先将所有的群体攻击发出去, 然后一个一个怪物打,当当前怪物生命值大于2,如果还有魔法值就放重 ...

  3. 【NOIP2016提高A组模拟10.15】最大化

    题目 分析 枚举两个纵坐标i.j,接着表示枚举区域的上下边界, 设对于每个横坐标区域的前缀和和为\(s_l\),枚举k, 显然当\(s_k>s_l\)时,以(i,k)为左上角,(j,k)为右下角 ...

  4. 【NOIP2016提高A组模拟10.15】算循环

    题目 分析 一步步删掉循环, 首先,原式是\[\sum_{i=1}^n\sum_{j=1}^m\sum_{k=i}^n\sum_{l=j}^m\sum_{p=i}^k\sum_{q=j}^l1\] 删 ...

  5. 【NOIP2016提高A组模拟9.15】Map

    题目 分析 发现,当原图是一棵树的时候,那么新建一条边后,就会变成环套树, 而环内的所有点对都是安全点对,如果环中有k个点,答案就是\(k(k-1)\) 联想到,当把原图做一遍tarjan缩点,每个环 ...

  6. 【NOIP2016提高A组模拟9.15】Osu

    题目 分析 考虑二分答案, 二分小数显然是不可取的,那么我们将所有可能的答案求出来,记录在一个数组上,排个序(C++调用函数很容易超时,手打快排,时间复杂度约为\(O(>8*10^7)\),但相 ...

  7. 【NOIP2016提高A组模拟9.15】Math

    题目 分析 因为\((-1)^2=1\), 所以我们只用看\(\sum_{j=1}^md(i·j)\)的值模2的值就可以了. 易证,一个数x,只有当x是完全平方数时,d(x)才为奇数,否则为偶数. 那 ...

  8. 【NOIP2016提高A组模拟8.15】Garden

    题目 分析 其实原题就是[cqoi2012][bzoj2669]局部极小值. 有一个n行m列的整数矩阵,其中1到nm之间的每个整数恰好出现一次.如果一个格子比所有相邻格子(相邻是指有公共边或公共顶点) ...

  9. 【NOIP2016提高A组模拟8.15】Throw

    题目 分析 首先对于一个状态(a,b,c),假定a<=b<=c: 现在考虑一下这个状态,的转移方案: \[1,中间向两边跳(a,b,c)-->(a*2-b,a,c).(a,b,c)- ...

随机推荐

  1. 【ZJOI2007】【BZOJ1059】矩阵游戏 匈牙利算法

    题目描述 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏——矩阵游戏.矩阵游戏在一个N*N黑白方阵进行(如同国际象棋一般,只是颜色是随意的).每次可以对该矩阵进行两种操作:行交换 ...

  2. 如何访问linux服务器上的mysql8.0

    首先安装好了mysql-connector 1.1. 下载: 官网下载zip包,我下载的是64位的: 下载地址:https://dev.mysql.com/downloads/mysql/ 下载zip ...

  3. CPA专业阶段单科成绩有5年有效期限,即从通过科目考试的第一年算起

    你为什么不去参加注册会计师考试? 注册会计师考试出考率极低,大家都有自己的原因,可以客观地说,每年注会考场出考人数不足三成,到底是什么原因不去考试呢?大家是这么说的. 1.没有好好复习呗,还怎么去考试 ...

  4. Mysql指定部分数据同步

    一.需求背景 朋友的公司需要每天定时从源端定时同步一部分数据到目标端,库中存在company_id列的表,只将指定的company_id列导入到目标端数据库:存在company_id列的表,将表中所有 ...

  5. Redis学习笔记03-持久化

    redis是一个内存型数据库,这就意味着,当主机重启或者宕机时,内存中的数据会被清空,redis可能会丢失数据.为了保存数据,实现数据持久化就必须要有一种机制,可以将redis数据库的数据保留在硬盘上 ...

  6. vue项目中实现扫码功能

    项目地址:https://github.com/wkl007/vue-scan-demo.git 项目主要是做的一个扫码的功能 核心代码为 <div class="scan" ...

  7. https://vjudge.net/problem/2198221/origin

    https://vjudge.net/problem/2198221/origin逆向思维,原题是人出来,我们处理成人进去,算出来每个人的曼哈顿距离,然后从大到小排序,距离长的先入.走的距离+这个人从 ...

  8. 洛谷1850(NOIp2016) 换教室——期望dp

    题目:https://www.luogu.org/problemnew/show/P1850 状态里记录的是”上一回有没有申请“,而不是”上一回申请成功否“,不然“申请 j 次”就没法转移了. dou ...

  9. h5文件简介

    h5文件是层次格式的第5代版本,用于存储科学数据的一种文件格式和库文件,由美国超级计算中心与应用中心研发的文件格式,用以存储和组织大规模数据. H5将文件结构简化成两个主要的对象类型: 1 数据集da ...

  10. vmware三种网络模式配置(转载)

    虚拟机系统安装的是Linux系统 首先,在本机上查看所有网络配置连接,使用命令:ipconfig Microsoft Windows [版本 6.1.7600]版权所有 (c) 2009 Micros ...