NOIP2017练习怎样更有力气(二分答案,线性扫描)

Posted myx12345

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NOIP2017练习怎样更有力气(二分答案,线性扫描)相关的知识,希望对你有一定的参考价值。

 

题意:OI大师抖儿在夺得银牌之后,顺利保送pku。这一天,抖儿问长者:“我虽然已经保送了,但我的志向是为国家健康工作五十年。请问我应该怎样变得更有力气?”

  长者回答:“你啊,Too Young Too Simple,Sometimes Naive!如果你想要我教你,你要先进行艰苦的修行。”
长者的住宅中有一堵长度为n的墙。每天抖儿起床修行,会选择一段长度为x的区间染成白色。长者的住宅附近有一群香港记者,为了借助抖儿拜访长者,第i天香港记者会将区间[li,ri]染成白色来讨好抖儿(也就是说,每天墙会被抖儿和香港记者各染一次)。现在抖儿已经预先知道了香港记者的动向,他想知道他最少几天就能把墙全部染白,完成修行。
一行一个整数,表示抖儿最少几天能把墙全部染白。
如果m天之后依然无法染白,则输出“Poor Douer!”
对于所有的数据,保证n≤10^18,m≤100000,0<=x≤n且数据随机
思路:lyy出题人系列

 

 1 var x,y,l,r:array[1..110000]of int64;
 2     m,left,right,last,mid,i:longint;
 3     n,x1:int64;
 4 
 5 procedure swap(var x,y:int64);
 6 var t:int64;
 7 begin
 8  t:=x; x:=y; y:=t;
 9 end;
10 
11 procedure qsort(l,r:longint);
12 var i,j:longint;
13     mid1,mid2:int64;
14 begin
15  i:=l; j:=r; mid1:=x[(l+r)>>1]; mid2:=y[(l+r)>>1];
16  repeat
17   while (mid1>x[i])or((mid1=x[i])and(mid2>y[i])) do inc(i);
18   while (mid1<x[j])or((mid1=x[j])and(mid2<y[j])) do dec(j);
19   if i<=j then
20   begin
21    swap(x[i],x[j]);
22    swap(y[i],y[j]);
23    inc(i); dec(j);
24   end;
25  until i>j;
26  if l<j then qsort(l,j);
27  if i<r then qsort(i,r);
28 end;
29 
30 function max(x,y:int64):int64;
31 begin
32  if x>y then exit(x);
33  exit(y);
34 end;
35 
36 function isok(up:longint):boolean;
37 var t,i:longint;
38     now,len,tmp,ans:int64;
39 
40 begin
41  for i:=1 to up do
42  begin
43   x[i]:=l[i]; y[i]:=r[i];
44  end;
45  t:=up;
46  inc(t); x[t]:=n+1; y[t]:=n+1;
47  qsort(1,t);
48  now:=0; ans:=0;
49  for i:=1 to t do
50  begin
51   if x[i]>now+1 then
52   begin
53    if x1=0 then exit(false);
54    len:=x[i]-now-2;
55    tmp:=len div x1+1;
56    if now+tmp*x1>y[i] then now:=now+tmp*x1;
57    ans:=ans+tmp;
58    if ans>up then exit(false);
59   end;
60   now:=max(now,y[i]);
61  end;
62  exit(true);
63 end;
64 
65 begin
66  assign(input,\'liqi.in\'); reset(input);
67  assign(output,\'liqi.out\'); rewrite(output);
68  readln(n,m,x1);
69  for i:=1 to m do read(l[i],r[i]);
70  left:=1; right:=m; last:=m+1;
71  while left<=right do
72  begin
73   mid:=(left+right)>>1;
74   if isok(mid) then begin last:=mid; right:=mid-1; end
75    else left:=mid+1;
76  end;
77  if last=m+1 then writeln(\'Poor Douer!\')
78   else writeln(last);
79  close(input);
80  close(output);
81 end.

 

【后记】
在你的帮助下,抖儿完成修行的时间是原来的0.01倍。
抖儿对长者说:“我明白了!只有每天坚持锻炼,才能获得力量。”
长者嘿嘿一笑:“你想多了。我只是想让你刷墙而已。”
说完,长者一溜烟地跑了,速度比香港记者还要快好几倍。

 


 

以上是关于NOIP2017练习怎样更有力气(二分答案,线性扫描)的主要内容,如果未能解决你的问题,请参考以下文章

UR #5怎样更有力气

「UR#5」怎样更有力气

Noip 2012 借教室 (二分答案+差分数组)

NOIp2015 运输计划 [LCA] [树上差分] [二分答案]

noip2010 真题练习 2017.2.18

计蒜客 2017 NOIP 提高组模拟赛Day1 T1 小X的质数 线性筛素数