zoukankan      html  css  js  c++  java
  • [Codechef October Challenge 2014]刷漆

    问题描述

    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。

     思路

      离线处理,按照坐标排序,方案数=方案数*所有颜色不同的油漆桶坐标之差。

    const mo=1000000009;
    type ss=record
        ch:char;nu:int64;
        end;
    var a:array[0..100000] of ss;
        ans,n,m:int64;
        i:longint;
    procedure sort(l,r: longint);
          var
             i,j,x: longint;y:ss;
          begin
             i:=l;
             j:=r;
             x:=a[(l+r) div 2].nu;
             repeat
               while a[i].nu<x do
                inc(i);
               while x<a[j].nu do
                dec(j);
               if not(i>j) then
                 begin
                    y:=a[i];
                    a[i]:=a[j];
                    a[j]:=y;
                    inc(i);
                    j:=j-1;
                 end;
             until i>j;
             if l<j then
               sort(l,j);
             if i<r then
               sort(i,r);
          end;
    begin
        readln(n,m);
        for i:=1 to m do 
            readln(a[i].ch,a[i].nu);
        sort(1,m);
        ans:=1;
        for i:=1 to m-1 do
            if a[i].ch<>a[i+1].ch then
                ans:=ans*(abs(a[i+1].nu-a[i].nu))mod mo;
        if ans=0 then ans:=1;
        writeln(ans);
    end.
    View Code
  • 相关阅读:
    设计模式20-观察者模式
    设计模式19-备忘录模式
    设计模式18-中介者模式
    设计模式17-迭代器模式
    设计模式16-解释器模式
    Wireshark基本介绍和学习TCP三次握手
    Jmeter CSV 参数化/检查点/断言
    Jmeter运营活动并发测试—巧用集合点
    一个简单的性能测试
    Jmeter对HTTP请求压力测试、并发测试
  • 原文地址:https://www.cnblogs.com/yangqingli/p/4890378.html
Copyright © 2011-2022 走看看