【CF56E】Domino Principle

每块多米诺骨牌所在的位置设为x,每块多米诺骨牌高度为h。如果将x位置上的多米诺骨牌向右翻到,它就可以影响[x+1, x+h-1]范围内的所有多米诺骨牌,让他们也翻到,同时这些被翻到的多米诺骨牌还能影响到其他多米诺骨牌,现在BSNY给出n块多米诺骨牌的位置和高度,问如果向右翻到第i块多米诺骨牌,会有多少多米诺骨牌翻到。

按左端点排序,然后线性扫描。其实二分也可以,但答案有部分的重叠,即单调性。

 1 var x,h,d,c,ans:array[1..200000]of longint;
 2     n,i,k,last:longint;
 3
 4 procedure swap(var x,y:longint);
 5 var t:longint;
 6 begin
 7  t:=x; x:=y; y:=t;
 8 end;
 9
10 procedure qsort(l,r:longint);
11 var i,j,mid:longint;
12 begin
13  i:=l; j:=r; mid:=x[(l+r)>>1];
14  repeat
15   while mid>x[i] do inc(i);
16   while mid<x[j] do dec(j);
17   if i<=j then
18   begin
19    swap(x[i],x[j]);
20    swap(h[i],h[j]);
21    swap(c[i],c[j]);
22    swap(d[i],d[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 begin
31
32  readln(n);
33  for i:=1 to n do
34  begin
35   readln(x[i],h[i]);
36   d[i]:=x[i]+h[i]-1;
37   c[i]:=i;
38  end;
39  qsort(1,n);
40  ans[c[n]]:=1;
41  for i:=n-1 downto 1 do
42  begin
43   last:=d[i];
44   k:=i+1;
45   ans[c[i]]:=1;
46   while true do
47   begin
48    if k>n then break;
49    if x[k]<=last then ans[c[i]]:=ans[c[i]]+ans[c[k]]
50     else break;
51    k:=k+ans[c[k]];
52   end;
53  end;
54  for i:=1 to n-1 do write(ans[i],‘ ‘);
55  writeln(ans[n]);
56
57 end.

时间: 2024-10-18 18:53:22

【CF56E】Domino Principle的相关文章

【LeetCode】动态规划(下篇)

[600] Non-negative Integers without Consecutive Ones [629] K Inverse Pairs Array [638] Shopping Offers [639] Decode Ways II [646] Maximum Length of Pair Chain [647] Palindromic Substrings [650] 2 Keys Keyboard [651] 4 Keys Keyboard [656] Coin Path [6

【LeetCode】动态规划(上篇共75题)

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica } [5] Longest Palindromic Substring 给一个字符串,需要返回最长回文子串 解法:dp[i][j] 表示 s[i..j] 是否是回文串,转移方程是 dp[i][j] = 1 (if dp[i+1][j-1] = 1 && s[i] == s[j]),初始化条件是 if (s[i] == s[j] && (i == j

【LeetCode】动态规划(下篇共39题)

[600] Non-negative Integers without Consecutive Ones [629] K Inverse Pairs Array [638] Shopping Offers [639] Decode Ways II [646] Maximum Length of Pair Chain [647] Palindromic Substrings [650] 2 Keys Keyboard [651] 4 Keys Keyboard [656] Coin Path [6

【CodeForces 353 A】Domino

[链接] 我是链接,点我呀:) [题意] [题解] 分类讨论一波 设第一个数组的奇数个数为cnt1 第二个数组的奇数个数为cnt2 显然只有在(cnt1+cnt2)%2==0的情况下. 才可能第一个数组的和为偶数,第二个数组的和也为偶数 (因为奇数都要出现偶数次才可以. 所以只可能cnt1和cnt2都是偶数,那么输出0 否则,cnt1和cnt2都是奇数,看看有没有一个位置i只有a[i]或只有b[i]是奇数.有的话输出1. 其他情况都非法. [代码] #include <bits/stdc++.h

【转】Netty那点事(四)Netty与Reactor模式

[原文]https://github.com/code4craft/netty-learning/blob/master/posts/ch4-reactor.md 一:Netty.NIO.多线程? 时隔很久终于又更新了!之前一直迟迟未动也是因为积累不够,后面比较难下手.过年期间@李林锋hw发布了一个Netty5.0架构剖析和源码解读 http://vdisk.weibo.com/s/C9LV9iVqH13rW/1391437855,看完也是收获不少.前面的文章我们分析了Netty的结构,这次咱们

【集合论】 03 - 序集和序数

1. 势 在上一篇我提过自然数“量”和“序”的双重性质,如果再仔细斟酌,“量”其实是由“序”产生和决定的,把有限的元素按某个顺序排列起来,正是我们确定其数量的过程.那么对于无穷集,“量”和“序”还有这样的关系吗?无穷集的“量”和“序”又该如何定义呢?既然它们产生于自然数,那么答案自然就在自然数的扩展中.对于有限集的量\(n\),可以看作是有限集的元素与\(n\)的元素的一一对应.这个直观的方法同样适用于无穷集,如果能找到一个标尺,将无穷集的元素和标尺的元素一一对应,那就能得到无穷集的“量”. 暂

设计模式概述【整理】

设计模式不是很快的提高你的编码能力,设计模式的学习,旨在避免重复编码,减少劳动量.学习设计模式,对提高编写高效代码,大有裨益.学习设计模式,首先引入设计原则. 设计原则 设计模式的核心原则是:"开-闭"原则(  Open - Closed Principle 缩写:OCP  ),一切的一切都是围绕着"开-闭"原则展开的.. 意思是,在一个系统中,对于扩展是开放的,对于修改是关闭的,一个好的系统是在不修改源代码的情况下,可以扩展你的功能..而实现开闭原则的关键就是抽象

【转】如何评价 Apple 新推出的编程语言 Swift?

如何评价 Apple 新推出的编程语言 Swift? 原文地址:http://www.zhihu.com/question/24002984 评价:如果你会Objective-C,你不需要去看它. 如果问我这语言对普通开发者重要不重要,我说重要,可以明确告诉你这一点--它是Apple 在WWDC 向全世界推出的重磅语言我怎么能说它不重要?它降低了入门的门槛.使得大量的JS, Python, Ruby用户会使用Apple 的技术为其开发程序.它的作用,和Core Data, Interface B

【集合论】 02 - 集合与自然数

1. 公理系统 先来看看康托尔对集合的定义:“一个集合是我们知觉中或理智中的.确定的.互不相同的事物的一个汇集,被设想为一个整体”.尽管康托尔本人已经建立起了相当广泛而深刻的集合理论,但对于集合本身的定义却还是含糊的,他的理论被称为“朴素集合论”(Native Set Theory).虽然试图描述集合的每个属性,但其中“汇集”.“整体”等词其实是和“集合”等价的.定义的含糊使得各种悖论趁虚而入,这也成为反对者们的主要攻击目标.之后,策梅洛(Zermelo)为集合建立了一套公理化系统,并由弗兰克尔