zoukankan      html  css  js  c++  java
  • D. A Shade of Moonlight

     

    http://codeforces.com/contest/989/problem/D

     

    emm……贪心吧。

    首先呢,那个月亮是一个点,并不是一个长度为1,在[-0.5,0.5]之间的线段,我被Note忽悠了

     

    思路:确保最后一个点消失时能被风吹到原点

     

    设下标为1的是从左往右,下标为2的是从右往左,最后一个点有方程式:

    s1+t=s2-t+l

    得t=(s2-s1+l)/2

    该点的坐标为

    x=s1+t=(s2+s1+l)/2

    风速最小为

    wmin=x/t=(s2+s1+l)/(s2-s1+l)<=wmax

    也就是

    Math.abs(s1+s1+l)<=Math.abs(s2-s1+l)*wmax

     

    因为我们假设了s1是从左往右的,自然有v1=1,v2=-1,s1<s2

     

    这个题有2个必要优化,一是sort优化:因为只要知道(i,j)的对数,所以下标可以打乱,将所有点放入一个队列,sort,从小找到大,遇到第一个可以的,后面一定都可以,因为两朵云间距离越短风速就要越大嘛

     

     

     1 import java.util.Arrays;
     2 import java.util.Scanner;
     3 
     4 
     5 public class Main {
     6 
     7     public static void main(String[] args) {
     8         Scanner io = new Scanner(System.in);
     9         int n = io.nextInt(), l = io.nextInt(), wmax = io.nextInt();
    10         long[] p1 = new long[n], p2 = new long[n];
    11         int top1 = 0, top2 = 0;
    12 
    13         for (int i = 0; i < n; i++) {
    14             int s = io.nextInt(), v = io.nextInt();
    15             if (v == 1) p1[top1++] = s;
    16             else p2[top2++] = s;
    17         }
    18         Arrays.sort(p1, 0, top1);
    19         Arrays.sort(p2, 0, top2);
    20 
    21         long ans = 0;
    22         for (int i = 0, j = 0; i < top1; i++) {
    23             while (j < top2 &&
    24                     (p1[i] > p2[j] ||
    25                             Math.abs(p1[i] + p2[j] + l) >=
    26                                     (p2[j] - p1[i] + l) * wmax)) j++;
    27             ans += top2 - j;
    28         }
    29         System.out.println(ans);
    30     }
    31 
    32 }
  • 相关阅读:
    冲刺周期会议三
    冲刺周期会议二
    冲刺周期会议一
    日常会议
    总结会议及站立会议(六)
    站立会议(五)
    站立会议(四)
    【自习任我行】
    软件小创意
    团队项目题目拟定
  • 原文地址:https://www.cnblogs.com/towerbird/p/11251840.html
Copyright © 2011-2022 走看看