刷漆(Codechef October Challenge 2014:Remy paints the fence)

2024-01-01 16:50

本文主要是介绍刷漆(Codechef October Challenge 2014:Remy paints the fence),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【问题描述】

Czy做完了所有的回答出了所有的询问,结果是,他因为脑力消耗过大而变得更虚了:)。帮助Czy恢复身材的艰巨任务落到了你的肩上。

正巧,你的花园里有一个由N块排成一条直线的木板组成的栅栏,木板从左到右依次标号1到N。这N块木板中,有M块木板前面放着一桶油漆。油漆有不同的颜色,每种颜色可以由一个大写字母表示(A到Z)。而你要求Czy用他的油漆刷子给栅栏刷上油漆。

已知Czy会选择一个前方放有油漆桶的木板开始他的任务。刷子蘸上油漆后,他开始随机地沿着栅栏走,他不会走出栅栏的范围。随机地走表示Czy会沿着他选择的方向一直走,然后随机在任何时候改变方向。沿着栅栏走只有两个方向,向前和向后。

你发现Czy刷油漆的过程总是符合下列规则:

  • 每个油漆桶里装着无限多的油漆;
  • 刷子上每次只有一种颜色的油漆,每次蘸油漆都会完全替换刷子上的油漆颜色;
  • 当Czy走到一个油漆桶前,他会首先用刷子蘸这个油漆桶里的油漆;
  • Czy每走过一个木板都会将这个木板刷成当前刷子上的油漆颜色。

已知木板可以被多次刷上油漆,每次都会完全覆盖之前的颜色。当所有木板都被刷上了油漆的时候,Czy才能停下来(当然他也可以继续刷到他想停下来为止)。你看着Czy在栅栏前来回舞动,突然想知道Czy停下来的时候栅栏有多少种可能的不同油漆方案。定义当至少有一块木板颜色不同时,两种油漆方案被视为是不同的。

请你输出不同的油漆方案数对109+9取模的值。

 

【输入】

输入文件为 paint.in。

输入的第一行包含两个整数N和M。

接下来M行,每行两个整数x和y,表示第y块木板前面有一个装着颜色为x的油漆的油漆桶。

 

【输出】

输出文件为 paint.out。

输出一行,包含一个整数,表示不同的油漆方案数对109 + 9取模的结果。

 

【输入输出样例】

 

paint.in

paint.out

6 2

A 2

B 6

4

 

【数据范围】

对于30% 的数据,1 ≤ M ≤ N ≤ 100。

对于100% 的数据, 1 ≤ M ≤ N ≤ 100000。

x是A到Z之间的大写字母;1 ≤ y ≤ N。

【解题思路】

很容易得到,从头到第一个油漆桶的颜色和最后一个油漆桶到结束的颜色只有一种,不予考虑。对于任意两个油漆桶之间的栅栏分析(如果这两种油漆不同),共有N块栅栏,如果有a块栅栏选1颜色,那另外(n-a)块就是b颜色(这些块必须连续),这样统计下来共有(n+1)种方案,累乘之后就可以得出答案。

【Tip】

数据比较大,需要开int64(long long)

需要先排一边序(样例坑)

 1 program paint;
 2 type aa=record
 3 ch:char;
 4 x:longint;
 5 end;
 6 const mo=1000000009;
 7 procedure open;
 8 begin
 9     assign(input,'paint.in');
10     assign(output,'paint.out');
11     reset(input);
12     rewrite(output);
13 end;
14 
15 procedure closs;
16 begin
17     close(input);
18     close(output);
19 end;
20 
21 var a:array[0..100000] of aa;
22     n,m,i,mid:longint;
23     ans:int64;
24 procedure sort(l,r: longint);
25       var
26          i,j,x,y: longint;
27       begin
28          i:=l;
29          j:=r;
30          x:=a[(l+r) div 2].x;
31          repeat
32            while a[i].x<x do
33             inc(i);
34            while x<a[j].x do
35             dec(j);
36            if not(i>j) then
37              begin
38                 a[0]:=a[i];
39                 a[i]:=a[j];
40                 a[j]:=a[0];
41                 inc(i);
42                 j:=j-1;
43              end;
44          until i>j;
45          if l<j then
46            sort(l,j);
47          if i<r then
48            sort(i,r);
49       end;
50 
51 begin
52     open;
53     readln(n,m);
54     for i:=1 to m do
55     begin
56         readln(a[i].ch,a[i].x);
57     end;
58     sort(1,m);
59     ans:=1;
60     for i:=1 to m-1 do
61     begin
62         if a[i].ch=a[i+1].ch then continue;
63         mid:=a[i+1].x-a[i].x;
64 
65         ans:=(ans*mid) mod mo;
66     end;
67     if ans=0 then ans:=1;
68     writeln(ans);
69     closs;
70 end.
View Code

 

转载于:https://www.cnblogs.com/wuminyan/p/4896068.html

这篇关于刷漆(Codechef October Challenge 2014:Remy paints the fence)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/559897

相关文章

Google Code Jam 2014(附官方题解)

2014年Google编程挑战赛 Problem A. Magic Trick Confused? Read the quick-start guide. Small input 6 points You have solved this input set. Note: To advance to the next rounds, you will need to s

Codeforces April Fools Day Contest 2014(附官方题解)

Codeforces2014年愚人节的坑题。。。但还是感觉挺好玩的。。。 A. The Great Game time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Two teams mee

论坛开发者总结:再见2013,你好2014!

转自:http://www.cocoachina.com/gamedev/misc/2014/0102/7644.html 在跨年的时候,我和你一样听着电视里的各种欢呼声,看着时针分针不慌不忙地走向0点,有点兴奋有点怅然有点对过往的追忆也有对未来的期许,但在0点钟声敲响的时候,不管过往如何,都信心满满地对自己说了声--你好2014! 对于开发者来说,2013年移动游

2014年10月8日

这是我上班第一天,我早早的来到了公司门口,足足等了一个小时才开门,已经到上午九点了,结识了很多同事,项目经理让我们熟悉业务(集团服开系统)。高姐给我讲了一遍服务开通,从CRM到集团服开,从订单到派单,回单的整个演示过程,中午很快就到了,有点困了,中午又给我们发了一份vpn的文档,当前电信集团主要用到CN2这个网络技术,知道了我们这个团队主要从事电信集团的服务开通相关工作。

Linux下Tomcat开机自动启动 原创 2014年07月18日 12:32:49 标签:Linux /tomcat /shell /启动 22095 Linux下tomcat开机自动启动有两种方法

Linux下Tomcat开机自动启动 原创  2014年07月18日 12:32:49 标签:Linux /tomcat /shell /启动 22095 Linux下tomcat开机自动启动有两种方法,一种是简单,一种是复杂而又专业的,使用shell脚本要实现,我们一般推荐shell脚本启动方式。下面我们分别介绍这两种方法。 1.shell脚本启动 众所周知,在L

TT-2014 研发笔试题

1 在一个单链表中,若p所指的结点不是最后结点,在p所指结点之后插进s所指结点,则应执行操作 () 【解析】 s->next=p->next;p->next=s 2 在下列排序方法中,不稳定的方法有() 【解析】 不稳定排序的意思是在排序过程中,相等的两个数比较之后不会改变其原来的位置,即不需要交换。 常见的稳定排序有: 冒泡排序,插入排序,归并排序,基数排序。 常见的不稳定排序有: 选择排序

2014计算机求职总结---面试篇

2014年计算机求职总结--准备篇 分类: 笔试与面试 2013-10-24 16:44 16272人阅读 评论(65) 收藏 举报 计算机 求职 找工作 IT 2014 版权所有,转载请注明出处,谢谢! http://blog.csdn.net/walkinginthewind/article/details/13000431 找工作是一个长期准备的过程,突击是没什

2014年5月

2014年5月份记录表 日期 ACM C/C++ 数据库 操作系统 英语 安卓 其它5月1日 uva10344(全排列+dfs) BNU4071(dfs)  hdu1175(dfs) --------------------5月2日hdu1427(dfs) hdu2594(KMP)---------------nonetheless subsidize unduly3日uva10160(

免费分享:2014-2021年OSM中国POI数据(附下载方法)

OpenStreetMap(OSM)是一个全球性的开源协作地图项目,允许任何人编辑和分享地理信息,旨在创建自由、准确且可广泛使用的世界地图。POI是“Point of Interest”的缩写,意为“兴趣点”。 OSM POI矢量数据是OpenStreetMap项目中以矢量格式存储的地理数据,用于精确描绘并包含建筑物、商店、餐馆、公园等兴趣点的名称、类型、用途等属性信息,为空间分析和决策制定提供基

ACM-ICPC 2014北京邀请赛 H Happy Reverse [模拟]

题意:给出n个二进制串,可以把其中的一些0和1反转(即0变1,1变0),找出转化后n个串中的最大值和最小值的差值。 分析:思路就是把所有的串和反转的存在一个数组中,然后排序,找最大值和最小值的差,(如果是同一个串反转的就找第二大的和最小的或第二小和最大的中的最大值)。注意假如只有一个串的话结果为0 DEBUG: 这题写了好久 1.第一次用vim,很爽,但是还没熟练 2.忽视了