D. A Shade of Moonlight

Posted towerbird

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 

 

以上是关于D. A Shade of Moonlight的主要内容,如果未能解决你的问题,请参考以下文章

[CF989D]A Shade of Moonlight:几何+二分答案+玄学的思路

Codeforces Round #475 (Div. 2) D. Destruction of a Tree

Codeforces1560 D. Make a Power of Two(思维+暴力)

Codeforces Round #475 (Div. 2) D. Destruction of a Tree

Codeforces Round #432 (Div. 2) D. Arpa and a list of numbers(暴力)

D. Make a Power of Two(DIV3)(预处理+模拟)