题目描述

输入

输出

样例输入

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种。

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

注意卡常。

代码

  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<math.h>
  4. #include<string.h>
  5. #include<algorithm>
  6. #include<stdlib.h>
  7. #include<time.h>
  8. #define ll long long
  9. #define ln(x,y) int(log(x)/log(y))
  10. #define sqr(x) ((x)*(x))
  11. #define random(x) (rand()%x)
  12. using namespace std;
  13. const char* fin="aP2.in";
  14. const char* fout="aP2.out";
  15. const int inf=0x7fffffff;
  16. const int maxn=2007,maxtot=maxn*maxn;
  17. int n,m,i,j,k,tot,l,r,mid,cnt;
  18. struct node{
  19. int t,x,y;
  20. }a[maxn];
  21. int gcd(int a,int b){
  22. if (b) return gcd(b,a%b);
  23. else return a;
  24. }
  25. struct fuck{
  26. int a,b,c;
  27. fuck(){
  28. a=b=c=0;
  29. }
  30. double val(){
  31. if (c==0) return inf;
  32. return a*sqrt(b)/c;
  33. }
  34. bool operator <=(const fuck& b1){
  35. return (ll)sqr(a)*b*sqr(b1.c)<=(ll)sqr(b1.a)*b1.b*sqr(c);
  36. }
  37. bool operator <(const fuck& b1){
  38. return (ll)sqr(a)*b*sqr(b1.c)<(ll)sqr(b1.a)*b1.b*sqr(c);
  39. }
  40. bool operator >(const fuck& b1){
  41. return (ll)sqr(a)*b*sqr(b1.c)>(ll)sqr(b1.a)*b1.b*sqr(c);
  42. }
  43. void operator =(const fuck& b1){
  44. a=b1.a;
  45. b=b1.b;
  46. c=b1.c;
  47. }
  48. void print(){
  49. int i,j,k;
  50. for (i=2;i<=int(sqrt(b));i++){
  51. while (b%sqr(i)==0){
  52. a*=i;
  53. b/=sqr(i);
  54. }
  55. }
  56. k=gcd(a,c);
  57. a/=k;
  58. c/=k;
  59. printf("%d %d %d",a,b,c);
  60. }
  61. }b[maxn*maxn];
  62. bool cmp(fuck a,fuck b){
  63. return a<b;
  64. }
  65. fuck dist(int sx,int sy,int tx,int ty,int t){
  66. fuck A;
  67. A.a=1;
  68. A.b=sqr(sx-tx)+sqr(sy-ty);
  69. A.c=t;
  70. return A;
  71. }
  72. fuck dist(int x,int y){
  73. fuck A;
  74. A.a=1;
  75. A.b=sqr(a[x].x-a[y].x)+sqr(a[x].y-a[y].y);
  76. A.c=abs(a[x].t-a[y].t);
  77. return A;
  78. }
  79. int f[maxn],g[maxn];
  80. fuck tmd,tmp;
  81. bool judge(fuck ans){
  82. int i,j,k;
  83. f[0]=0;
  84. g[0]=0;
  85. for (i=1;i<=n;i++){
  86. f[i]=0;
  87. for (j=i-1;j>=0;j--){
  88. if (f[i]<g[j]+1){
  89. cnt++;
  90. if (dist(i,j)<=ans){
  91. f[i]=max(f[j]+1,f[i]);
  92. }
  93. }
  94. }
  95. g[i]=max(f[i],g[i-1]);
  96. }
  97. return f[n]>=m;
  98. }
  99. void qsort(int l,int r){
  100. int i=l,j=r,k=l+(r-l)/2;
  101. fuck mid=b[k];
  102. while (i<=j){
  103. while (b[i]<mid) i++;
  104. while (b[j]>mid) j--;
  105. if (i<=j){
  106. swap(b[i],b[j]);
  107. i++;
  108. j--;
  109. }
  110. }
  111. if (l<j) qsort(l,j);
  112. if (i<r) qsort(i,r);
  113. }
  114. int main(){
  115. srand(time(0));
  116. scanf("%d%d",&n,&m);
  117. a[0].t=a[0].x=a[0].y=0;
  118. for (i=1;i<=n;i++){
  119. scanf("%d%d%d",&a[i].t,&a[i].x,&a[i].y);
  120. }
  121. b[++tot].a=0;b[tot].b=0;b[tot].c=1;
  122. for (i=0;i<=n;i++) {
  123. tmd.a=tmd.b=tmd.c=0;
  124. for (j=i+1;j<=n;j++) {
  125. tmp=dist(i,j);
  126. if (tmd<tmp) continue;
  127. b[++tot]=tmp;
  128. tmd=tmp;
  129. }
  130. }
  131. sort(b+1,b+tot+1,cmp);
  132. l=1;
  133. r=tot;
  134. k=0;
  135. while (l<r){
  136. k++;
  137. mid=(l+r)/2;
  138. if (judge(b[mid])) r=mid;
  139. else l=mid+1;
  140. }
  141. //printf("%d %d\n",cnt,k);
  142. b[l].print();
  143. return 0;
  144. }

启发

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

卡常时去除冗余状态。

【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. RuntimeError: You called this URL via POST, but the URL doesn’t end in a slash and you have APPEND_SLASH set.

    做公众号测试的时候,发现了个问题: 提交表单报错:RuntimeError: You called this URL via POST, but the URL doesn’t end in a sl ...

  2. 矩阵快速幂3 k*n铺方格

    #include <iostream> #include <cstdlib> #include <cstring> #include <queue> # ...

  3. id 工具: 查询用户所对应的UID 和GID 及GID所对应的用户组

    id 工具是用来查询用户信息,比如用户所归属的用户组,UID 和GID等:id 用法极为简单:我们举个例子说明一下: 语法格式: id  [参数]  [用户名] 至于有哪些参数,自己查一下 id -- ...

  4. 安装mysql-workbench

    sudo apt-get install mysql-workbench

  5. SPOJ 2916 GSS5 - Can you answer these queries V

    传送门 解题思路 和GSS1相似,但需要巨恶心的分类讨论,对于x1<=y1< x2< =y2 这种情况 , 最大值应该取[x1,y1]的右端最大+[y1+1,x2-1]的和+[x2, ...

  6. mysql日常sql

    重置表 truncate table david_account; 触发器 /* 商户资料更新时更新终端 */ DELIMITER | CREATE TRIGGER bankChange AFTER ...

  7. 一个页面多个bootstrip轮播以及一个页面多个swiper轮播 冲突问题

    Bootstript轮播冲突 解决方法: 使用不同的id <div id="myCarousel1" class="carousel slide"> ...

  8. webstorm格式化代码快捷键

    ctrl+alt+L 把网易云音乐的快捷键关了就可以了

  9. nginx的四个基本功能

    Nginx能做什么 1.反向代理2.负载均衡3.HTTP服务器(包含动静分离)4.正向代理 以上就是做网站小编了解到的Nginx在不依赖第三方模块能处理的事情,下面详细说明每种功能怎么做 1.反向代理 ...

  10. linux 利用 alias 自定义快捷命令

    例如:alias avi='cd /home/study/goodstudy/goodgoodstudy/english/movie/avi'则后续命令行输入 avi , 就自动执行了  cd xxx ...