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
时间: 2024-10-08 17:57:01