2021 ICPC 沈阳站 D题 Journey to Un‘Goro (打表+找规律)

【链接】http://codeforces.com/gym/103202/problem/D

【题意】

Recently, you’ve taken a trip to Un’Goro.
A small road in Un’Goro has attracted your eyes. The road consists of n steps, each colored either red or blue.
When you go from the ith step to the jth, you count the number of red steps you’ve stepped. You will be satisfied if the number is odd.
“What is the maximum number of pairs ( i , j ) ( 1 ≤ i ≤ j ≤ n ) (i,j) (1≤i≤j≤n) (i,j)(1ijn), such that I’ll be satisfied if I walk from the ith step to the j j j th?” you wonder. Also, how to construct all colorings such that the number of pairs is maximized?
构造长度为 n n n的一条路,每一块的颜色为red或者blue。
红色块数为奇数的区间为满意。
现要求输出最大的满意区间个数,并构造出符合最大值的全部路径。

【输入】

The only line contains an integer n ( 1 ≤ n ≤ 1 0 5 ) n (1≤n≤10^5) n(1n105), indicating the number of steps of the road.

【输出】

Output an integer in the first line, denoting the maximum number of pairs that make you satisfied.
Each of the following several lines contains a string with length n that represents a coloring scheme, in lexicographically ascending order. The ith character is the color of the ith step, where r is for red and b for blue.
If there are more than 100 different colorings, just find the lexicographically smallest 100 colorings.
Note that in lexicographical order, b is ordered before r.
(按字典序取前 100 100 100种)

【思路】

最大的满意区间个数应该不必多说了,随便模几组样例,很好发现,当道路每一块都是红色的时候一定最优: a n s 奇 = ( n + 1 ) 2 2 , a n s 偶 = n 2 + 2 × n 2 ans_{奇}=\frac{(n+1)^2}{2},ans_{偶}=\frac{n^2+2 \times n}{2} ans=2(n+1)2,ans=2n2+2×n
因为只输出前100组解,我们自然会想到,能否暴力,于是先敲一个暴力的打表程序。

n=7,这个时候,看不出什么规律
all_num=8     num=1   bbbrbbb
all_num=17    num=2   bbrbbbr
all_num=19    num=3   bbrbbrr
all_num=22    num=4   bbrbrrb
all_num=28    num=5   bbrrrbb
all_num=34    num=6   brbbbrb
all_num=37    num=7   brbbrbr
all_num=39    num=8   brbbrrr
all_num=42    num=9   brbrbrb
all_num=45    num=10  brbrrbr
all_num=47    num=11  brbrrrr
all_num=52    num=12  brrbrbb
all_num=57    num=13  brrrbbr
all_num=59    num=14  brrrbrr
all_num=62    num=15  brrrrrb
all_num=68    num=16  rbbbrbb
all_num=73    num=17  rbbrbbr
all_num=75    num=18  rbbrbrr
all_num=78    num=19  rbbrrrb
all_num=82    num=20  rbrbbrb
all_num=85    num=21  rbrbrbr
all_num=87    num=22  rbrbrrr
all_num=90    num=23  rbrrbrb
all_num=93    num=24  rbrrrbr
all_num=95    num=25  rbrrrrr
all_num=100   num=26  rrbbrbb
all_num=105   num=27  rrbrbbr
all_num=107   num=28  rrbrbrr
all_num=110   num=29  rrbrrrb
all_num=114   num=30  rrrbbrb
all_num=117   num=31  rrrbrbr
all_num=119   num=32  rrrbrrr
all_num=122   num=33  rrrrbrb
all_num=125   num=34  rrrrrbr
all_num=127   num=35  rrrrrrr
n=8时,依旧看不出什么
all_num=8     num=1   bbbbrbbb
all_num=16    num=2   bbbrbbbb
all_num=17    num=3   bbbrbbbr
all_num=19    num=4   bbbrbbrr
all_num=22    num=5   bbbrbrrb
all_num=28    num=6   bbbrrrbb
all_num=33    num=7   bbrbbbbr
all_num=34    num=8   bbrbbbrb
all_num=35    num=9   bbrbbbrr
all_num=37    num=10  bbrbbrbr
all_num=38    num=11  bbrbbrrb
all_num=39    num=12  bbrbbrrr
all_num=42    num=13  bbrbrbrb
all_num=44    num=14  bbrbrrbb
all_num=45    num=15  bbrbrrbr
all_num=47    num=16  bbrbrrrr
all_num=52    num=17  bbrrbrbb
all_num=56    num=18  bbrrrbbb
all_num=57    num=19  bbrrrbbr
all_num=59    num=20  bbrrrbrr
all_num=62    num=21  bbrrrrrb
all_num=66    num=22  brbbbbrb
all_num=68    num=23  brbbbrbb
all_num=69    num=24  brbbbrbr
all_num=71    num=25  brbbbrrr
all_num=73    num=26  brbbrbbr
all_num=74    num=27  brbbrbrb
all_num=75    num=28  brbbrbrr
all_num=77    num=29  brbbrrbr
all_num=78    num=30  brbbrrrb
all_num=79    num=31  brbbrrrr
all_num=82    num=32  brbrbbrb
all_num=84    num=33  brbrbrbb
all_num=85    num=34  brbrbrbr
all_num=87    num=35  brbrbrrr
all_num=89    num=36  brbrrbbr
all_num=90    num=37  brbrrbrb
all_num=91    num=38  brbrrbrr
all_num=93    num=39  brbrrrbr
all_num=94    num=40  brbrrrrb
all_num=95    num=41  brbrrrrr
all_num=100   num=42  brrbbrbb
all_num=104   num=43  brrbrbbb
all_num=105   num=44  brrbrbbr
all_num=107   num=45  brrbrbrr
all_num=110   num=46  brrbrrrb
all_num=113   num=47  brrrbbbr
all_num=114   num=48  brrrbbrb
all_num=115   num=49  brrrbbrr
all_num=117   num=50  brrrbrbr
all_num=118   num=51  brrrbrrb
all_num=119   num=52  brrrbrrr
all_num=122   num=53  brrrrbrb
all_num=124   num=54  brrrrrbb
all_num=125   num=55  brrrrrbr
all_num=127   num=56  brrrrrrr
all_num=132   num=57  rbbbbrbb
all_num=136   num=58  rbbbrbbb
all_num=137   num=59  rbbbrbbr
all_num=139   num=60  rbbbrbrr
all_num=142   num=61  rbbbrrrb
all_num=145   num=62  rbbrbbbr
all_num=146   num=63  rbbrbbrb
all_num=147   num=64  rbbrbbrr
all_num=149   num=65  rbbrbrbr
all_num=150   num=66  rbbrbrrb
all_num=151   num=67  rbbrbrrr
all_num=154   num=68  rbbrrbrb
all_num=156   num=69  rbbrrrbb
all_num=157   num=70  rbbrrrbr
all_num=159   num=71  rbbrrrrr
all_num=162   num=72  rbrbbbrb
all_num=164   num=73  rbrbbrbb
all_num=165   num=74  rbrbbrbr
all_num=167   num=75  rbrbbrrr
all_num=169   num=76  rbrbrbbr
all_num=170   num=77  rbrbrbrb
all_num=171   num=78  rbrbrbrr
all_num=173   num=79  rbrbrrbr
all_num=174   num=80  rbrbrrrb
all_num=175   num=81  rbrbrrrr
all_num=178   num=82  rbrrbbrb
all_num=180   num=83  rbrrbrbb
all_num=181   num=84  rbrrbrbr
all_num=183   num=85  rbrrbrrr
all_num=185   num=86  rbrrrbbr
all_num=186   num=87  rbrrrbrb
all_num=187   num=88  rbrrrbrr
all_num=189   num=89  rbrrrrbr
all_num=190   num=90  rbrrrrrb
all_num=191   num=91  rbrrrrrr
all_num=196   num=92  rrbbbrbb
all_num=200   num=93  rrbbrbbb
all_num=201   num=94  rrbbrbbr
all_num=203   num=95  rrbbrbrr
all_num=206   num=96  rrbbrrrb
all_num=209   num=97  rrbrbbbr
all_num=210   num=98  rrbrbbrb
all_num=211   num=99  rrbrbbrr
all_num=213   num=100 rrbrbrbr
n=20的情况,这个时候会发现,打出来的图案开始有了规律,我们按照第一个r出现的位置,可以对其进行分块
分块后发现,对于20的情况,可以分成4个块:
all_num=512   num=1   bbbbbbbbbbrbbbbbbbbb //①第一个块单独一列,r在中间
all_num=1024  num=2   bbbbbbbbbrbbbbbbbbbb //②第二个块r往前挪后,后半部分每次最多出现两个r
all_num=1025  num=3   bbbbbbbbbrbbbbbbbbbr //并成表现成梯状
all_num=1027  num=4   bbbbbbbbbrbbbbbbbbrr
all_num=1030  num=5   bbbbbbbbbrbbbbbbbrrb
all_num=1036  num=6   bbbbbbbbbrbbbbbbrrbb
all_num=1048  num=7   bbbbbbbbbrbbbbbrrbbb
all_num=1072  num=8   bbbbbbbbbrbbbbrrbbbb
all_num=1120  num=9   bbbbbbbbbrbbbrrbbbbb
all_num=1216  num=10  bbbbbbbbbrbbrrbbbbbb
all_num=1408  num=11  bbbbbbbbbrbrrbbbbbbb
all_num=1792  num=12  bbbbbbbbbrrrbbbbbbbb
all_num=2049  num=13  bbbbbbbbrbbbbbbbbbbr //③第三块形状和第二块相近
all_num=2050  num=14  bbbbbbbbrbbbbbbbbbrb //但是多行拼接成的形状犹如下降的格子
all_num=2051  num=15  bbbbbbbbrbbbbbbbbbrr //但是直接分析出它规律还是比较困难
all_num=2053  num=16  bbbbbbbbrbbbbbbbbrbr
all_num=2054  num=17  bbbbbbbbrbbbbbbbbrrb
all_num=2055  num=18  bbbbbbbbrbbbbbbbbrrr
all_num=2058  num=19  bbbbbbbbrbbbbbbbrbrb
all_num=2060  num=20  bbbbbbbbrbbbbbbbrrbb
all_num=2061  num=21  bbbbbbbbrbbbbbbbrrbr
all_num=2063  num=22  bbbbbbbbrbbbbbbbrrrr
all_num=2068  num=23  bbbbbbbbrbbbbbbrbrbb
all_num=2072  num=24  bbbbbbbbrbbbbbbrrbbb
all_num=2073  num=25  bbbbbbbbrbbbbbbrrbbr
all_num=2075  num=26  bbbbbbbbrbbbbbbrrbrr
all_num=2078  num=27  bbbbbbbbrbbbbbbrrrrb
all_num=2088  num=28  bbbbbbbbrbbbbbrbrbbb
all_num=2096  num=29  bbbbbbbbrbbbbbrrbbbb
all_num=2097  num=30  bbbbbbbbrbbbbbrrbbbr
all_num=2099  num=31  bbbbbbbbrbbbbbrrbbrr
all_num=2102  num=32  bbbbbbbbrbbbbbrrbrrb
all_num=2108  num=33  bbbbbbbbrbbbbbrrrrbb
all_num=2128  num=34  bbbbbbbbrbbbbrbrbbbb
all_num=2144  num=35  bbbbbbbbrbbbbrrbbbbb
all_num=2145  num=36  bbbbbbbbrbbbbrrbbbbr
all_num=2147  num=37  bbbbbbbbrbbbbrrbbbrr
all_num=2150  num=38  bbbbbbbbrbbbbrrbbrrb
all_num=2156  num=39  bbbbbbbbrbbbbrrbrrbb
all_num=2168  num=40  bbbbbbbbrbbbbrrrrbbb
all_num=2208  num=41  bbbbbbbbrbbbrbrbbbbb
all_num=2240  num=42  bbbbbbbbrbbbrrbbbbbb
all_num=2241  num=43  bbbbbbbbrbbbrrbbbbbr
all_num=2243  num=44  bbbbbbbbrbbbrrbbbbrr
all_num=2246  num=45  bbbbbbbbrbbbrrbbbrrb
all_num=2252  num=46  bbbbbbbbrbbbrrbbrrbb
all_num=2264  num=47  bbbbbbbbrbbbrrbrrbbb
all_num=2288  num=48  bbbbbbbbrbbbrrrrbbbb
all_num=2368  num=49  bbbbbbbbrbbrbrbbbbbb
all_num=2432  num=50  bbbbbbbbrbbrrbbbbbbb
all_num=2433  num=51  bbbbbbbbrbbrrbbbbbbr
all_num=2435  num=52  bbbbbbbbrbbrrbbbbbrr
all_num=2438  num=53  bbbbbbbbrbbrrbbbbrrb
all_num=2444  num=54  bbbbbbbbrbbrrbbbrrbb
all_num=2456  num=55  bbbbbbbbrbbrrbbrrbbb
all_num=2480  num=56  bbbbbbbbrbbrrbrrbbbb
all_num=2528  num=57  bbbbbbbbrbbrrrrbbbbb
all_num=2688  num=58  bbbbbbbbrbrbrbbbbbbb
all_num=2816  num=59  bbbbbbbbrbrrbbbbbbbb
all_num=2817  num=60  bbbbbbbbrbrrbbbbbbbr
all_num=2819  num=61  bbbbbbbbrbrrbbbbbbrr
all_num=2822  num=62  bbbbbbbbrbrrbbbbbrrb
all_num=2828  num=63  bbbbbbbbrbrrbbbbrrbb
all_num=2840  num=64  bbbbbbbbrbrrbbbrrbbb
all_num=2864  num=65  bbbbbbbbrbrrbbrrbbbb
all_num=2912  num=66  bbbbbbbbrbrrbrrbbbbb
all_num=3008  num=67  bbbbbbbbrbrrrrbbbbbb
all_num=3328  num=68  bbbbbbbbrrbrbbbbbbbb
all_num=3584  num=69  bbbbbbbbrrrbbbbbbbbb
all_num=3585  num=70  bbbbbbbbrrrbbbbbbbbr
all_num=3587  num=71  bbbbbbbbrrrbbbbbbbrr
all_num=3590  num=72  bbbbbbbbrrrbbbbbbrrb
all_num=3596  num=73  bbbbbbbbrrrbbbbbrrbb
all_num=3608  num=74  bbbbbbbbrrrbbbbrrbbb
all_num=3632  num=75  bbbbbbbbrrrbbbrrbbbb
all_num=3680  num=76  bbbbbbbbrrrbbrrbbbbb
all_num=3776  num=77  bbbbbbbbrrrbrrbbbbbb
all_num=3968  num=78  bbbbbbbbrrrrrbbbbbbb
all_num=4098  num=79  bbbbbbbrbbbbbbbbbbrb //④第四个块由于展示不完整,就非常难以描述规律了
all_num=4100  num=80  bbbbbbbrbbbbbbbbbrbb
all_num=4101  num=81  bbbbbbbrbbbbbbbbbrbr
all_num=4103  num=82  bbbbbbbrbbbbbbbbbrrr
all_num=4105  num=83  bbbbbbbrbbbbbbbbrbbr
all_num=4106  num=84  bbbbbbbrbbbbbbbbrbrb
all_num=4107  num=85  bbbbbbbrbbbbbbbbrbrr
all_num=4109  num=86  bbbbbbbrbbbbbbbbrrbr
all_num=4110  num=87  bbbbbbbrbbbbbbbbrrrb
all_num=4111  num=88  bbbbbbbrbbbbbbbbrrrr
all_num=4114  num=89  bbbbbbbrbbbbbbbrbbrb
all_num=4116  num=90  bbbbbbbrbbbbbbbrbrbb
all_num=4117  num=91  bbbbbbbrbbbbbbbrbrbr
all_num=4119  num=92  bbbbbbbrbbbbbbbrbrrr
all_num=4121  num=93  bbbbbbbrbbbbbbbrrbbr
all_num=4122  num=94  bbbbbbbrbbbbbbbrrbrb
all_num=4123  num=95  bbbbbbbrbbbbbbbrrbrr
all_num=4125  num=96  bbbbbbbrbbbbbbbrrrbr
all_num=4126  num=97  bbbbbbbrbbbbbbbrrrrb
all_num=4127  num=98  bbbbbbbrbbbbbbbrrrrr
all_num=4132  num=99  bbbbbbbrbbbbbbrbbrbb
all_num=4136  num=100 bbbbbbbrbbbbbbrbrbbb
为了使规律更加明显,我们直接上手跑n=29的情况(①和②的规律已经很显然了,就不过多赘述)
再进行观察,发现,n=29的时候只剩下了3个块!!!
这就是说,我们可以直接忽视第4个块。
然后再打一发n=30的表,会发现,它们的第三个块的形状大体一致。
再对n=27/28打表观察,n同奇同偶时,后半部分的内容时一致的,只有第一个r的位置有所变化。

那么本题的一种解法就显然了:
先把n=29/30的后半段(16)打表存起来,用于拼接。
对于n<=30(可以是其他的值,只要不出现第4块的内容就行),直接用暴力程序求解
对于n>30的情况,先根据规律输出前两个块和第三个块的前半截,第三个块的后半截直接取用n=29/30的后16位即可

all_num=16384 num=1   bbbbbbbbbbbbbbrbbbbbbbbbbbbbb //①
all_num=32769 num=2   bbbbbbbbbbbbbrbbbbbbbbbbbbbbr //② 
all_num=32771 num=3   bbbbbbbbbbbbbrbbbbbbbbbbbbbrr
all_num=32774 num=4   bbbbbbbbbbbbbrbbbbbbbbbbbbrrb
all_num=32780 num=5   bbbbbbbbbbbbbrbbbbbbbbbbbrrbb
all_num=32792 num=6   bbbbbbbbbbbbbrbbbbbbbbbbrrbbb
all_num=32816 num=7   bbbbbbbbbbbbbrbbbbbbbbbrrbbbb
all_num=32864 num=8   bbbbbbbbbbbbbrbbbbbbbbrrbbbbb
all_num=32960 num=9   bbbbbbbbbbbbbrbbbbbbbrrbbbbbb
all_num=33152 num=10  bbbbbbbbbbbbbrbbbbbbrrbbbbbbb
all_num=33536 num=11  bbbbbbbbbbbbbrbbbbbrrbbbbbbbb
all_num=34304 num=12  bbbbbbbbbbbbbrbbbbrrbbbbbbbbb
all_num=35840 num=13  bbbbbbbbbbbbbrbbbrrbbbbbbbbbb
all_num=38912 num=14  bbbbbbbbbbbbbrbbrrbbbbbbbbbbb
all_num=45056 num=15  bbbbbbbbbbbbbrbrrbbbbbbbbbbbb
all_num=57344 num=16  bbbbbbbbbbbbbrrrbbbbbbbbbbbbb
all_num=65538 num=17  bbbbbbbbbbbbrbbbbbbbbbbbbbbrb //③
all_num=65541 num=18  bbbbbbbbbbbbrbbbbbbbbbbbbbrbr
all_num=65543 num=19  bbbbbbbbbbbbrbbbbbbbbbbbbbrrr
all_num=65546 num=20  bbbbbbbbbbbbrbbbbbbbbbbbbrbrb
all_num=65549 num=21  bbbbbbbbbbbbrbbbbbbbbbbbbrrbr
all_num=65551 num=22  bbbbbbbbbbbbrbbbbbbbbbbbbrrrr
all_num=65556 num=23  bbbbbbbbbbbbrbbbbbbbbbbbrbrbb
all_num=65561 num=24  bbbbbbbbbbbbrbbbbbbbbbbbrrbbr
all_num=65563 num=25  bbbbbbbbbbbbrbbbbbbbbbbbrrbrr
all_num=65566 num=26  bbbbbbbbbbbbrbbbbbbbbbbbrrrrb
all_num=65576 num=27  bbbbbbbbbbbbrbbbbbbbbbbrbrbbb
all_num=65585 num=28  bbbbbbbbbbbbrbbbbbbbbbbrrbbbr
all_num=65587 num=29  bbbbbbbbbbbbrbbbbbbbbbbrrbbrr
all_num=65590 num=30  bbbbbbbbbbbbrbbbbbbbbbbrrbrrb
all_num=65596 num=31  bbbbbbbbbbbbrbbbbbbbbbbrrrrbb
all_num=65616 num=32  bbbbbbbbbbbbrbbbbbbbbbrbrbbbb
all_num=65633 num=33  bbbbbbbbbbbbrbbbbbbbbbrrbbbbr
all_num=65635 num=34  bbbbbbbbbbbbrbbbbbbbbbrrbbbrr
all_num=65638 num=35  bbbbbbbbbbbbrbbbbbbbbbrrbbrrb
all_num=65644 num=36  bbbbbbbbbbbbrbbbbbbbbbrrbrrbb
all_num=65656 num=37  bbbbbbbbbbbbrbbbbbbbbbrrrrbbb
all_num=65696 num=38  bbbbbbbbbbbbrbbbbbbbbrbrbbbbb
all_num=65729 num=39  bbbbbbbbbbbbrbbbbbbbbrrbbbbbr
all_num=65731 num=40  bbbbbbbbbbbbrbbbbbbbbrrbbbbrr
all_num=65734 num=41  bbbbbbbbbbbbrbbbbbbbbrrbbbrrb
all_num=65740 num=42  bbbbbbbbbbbbrbbbbbbbbrrbbrrbb
all_num=65752 num=43  bbbbbbbbbbbbrbbbbbbbbrrbrrbbb
all_num=65776 num=44  bbbbbbbbbbbbrbbbbbbbbrrrrbbbb
all_num=65856 num=45  bbbbbbbbbbbbrbbbbbbbrbrbbbbbb
all_num=65921 num=46  bbbbbbbbbbbbrbbbbbbbrrbbbbbbr
all_num=65923 num=47  bbbbbbbbbbbbrbbbbbbbrrbbbbbrr
all_num=65926 num=48  bbbbbbbbbbbbrbbbbbbbrrbbbbrrb
all_num=65932 num=49  bbbbbbbbbbbbrbbbbbbbrrbbbrrbb
all_num=65944 num=50  bbbbbbbbbbbbrbbbbbbbrrbbrrbbb
all_num=65968 num=51  bbbbbbbbbbbbrbbbbbbbrrbrrbbbb
all_num=66016 num=52  bbbbbbbbbbbbrbbbbbbbrrrrbbbbb
all_num=66176 num=53  bbbbbbbbbbbbrbbbbbbrbrbbbbbbb
all_num=66305 num=54  bbbbbbbbbbbbrbbbbbbrrbbbbbbbr
all_num=66307 num=55  bbbbbbbbbbbbrbbbbbbrrbbbbbbrr
all_num=66310 num=56  bbbbbbbbbbbbrbbbbbbrrbbbbbrrb
all_num=66316 num=57  bbbbbbbbbbbbrbbbbbbrrbbbbrrbb
all_num=66328 num=58  bbbbbbbbbbbbrbbbbbbrrbbbrrbbb
all_num=66352 num=59  bbbbbbbbbbbbrbbbbbbrrbbrrbbbb
all_num=66400 num=60  bbbbbbbbbbbbrbbbbbbrrbrrbbbbb
all_num=66496 num=61  bbbbbbbbbbbbrbbbbbbrrrrbbbbbb
all_num=66816 num=62  bbbbbbbbbbbbrbbbbbrbrbbbbbbbb
all_num=67073 num=63  bbbbbbbbbbbbrbbbbbrrbbbbbbbbr
all_num=67075 num=64  bbbbbbbbbbbbrbbbbbrrbbbbbbbrr
all_num=67078 num=65  bbbbbbbbbbbbrbbbbbrrbbbbbbrrb
all_num=67084 num=66  bbbbbbbbbbbbrbbbbbrrbbbbbrrbb
all_num=67096 num=67  bbbbbbbbbbbbrbbbbbrrbbbbrrbbb
all_num=67120 num=68  bbbbbbbbbbbbrbbbbbrrbbbrrbbbb
all_num=67168 num=69  bbbbbbbbbbbbrbbbbbrrbbrrbbbbb
all_num=67264 num=70  bbbbbbbbbbbbrbbbbbrrbrrbbbbbb
all_num=67456 num=71  bbbbbbbbbbbbrbbbbbrrrrbbbbbbb
all_num=68096 num=72  bbbbbbbbbbbbrbbbbrbrbbbbbbbbb
all_num=68609 num=73  bbbbbbbbbbbbrbbbbrrbbbbbbbbbr
all_num=68611 num=74  bbbbbbbbbbbbrbbbbrrbbbbbbbbrr
all_num=68614 num=75  bbbbbbbbbbbbrbbbbrrbbbbbbbrrb
all_num=68620 num=76  bbbbbbbbbbbbrbbbbrrbbbbbbrrbb
all_num=68632 num=77  bbbbbbbbbbbbrbbbbrrbbbbbrrbbb
all_num=68656 num=78  bbbbbbbbbbbbrbbbbrrbbbbrrbbbb
all_num=68704 num=79  bbbbbbbbbbbbrbbbbrrbbbrrbbbbb
all_num=68800 num=80  bbbbbbbbbbbbrbbbbrrbbrrbbbbbb
all_num=68992 num=81  bbbbbbbbbbbbrbbbbrrbrrbbbbbbb
all_num=69376 num=82  bbbbbbbbbbbbrbbbbrrrrbbbbbbbb
all_num=70656 num=83  bbbbbbbbbbbbrbbbrbrbbbbbbbbbb
all_num=71681 num=84  bbbbbbbbbbbbrbbbrrbbbbbbbbbbr
all_num=71683 num=85  bbbbbbbbbbbbrbbbrrbbbbbbbbbrr
all_num=71686 num=86  bbbbbbbbbbbbrbbbrrbbbbbbbbrrb
all_num=71692 num=87  bbbbbbbbbbbbrbbbrrbbbbbbbrrbb
all_num=71704 num=88  bbbbbbbbbbbbrbbbrrbbbbbbrrbbb
all_num=71728 num=89  bbbbbbbbbbbbrbbbrrbbbbbrrbbbb
all_num=71776 num=90  bbbbbbbbbbbbrbbbrrbbbbrrbbbbb
all_num=71872 num=91  bbbbbbbbbbbbrbbbrrbbbrrbbbbbb
all_num=72064 num=92  bbbbbbbbbbbbrbbbrrbbrrbbbbbbb
all_num=72448 num=93  bbbbbbbbbbbbrbbbrrbrrbbbbbbbb
all_num=73216 num=94  bbbbbbbbbbbbrbbbrrrrbbbbbbbbb
all_num=75776 num=95  bbbbbbbbbbbbrbbrbrbbbbbbbbbbb
all_num=77825 num=96  bbbbbbbbbbbbrbbrrbbbbbbbbbbbr
all_num=77827 num=97  bbbbbbbbbbbbrbbrrbbbbbbbbbbrr
all_num=77830 num=98  bbbbbbbbbbbbrbbrrbbbbbbbbbrrb
all_num=77836 num=99  bbbbbbbbbbbbrbbrrbbbbbbbbrrbb
all_num=77848 num=100 bbbbbbbbbbbbrbbrrbbbbbbbrrbbb

【代码】

存后16位的打表代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,ans;
string sta[100];
void init()
{
}
string getpath(int x)//构造字符串
{
    string res="";
    for(int i=1;i<=n;i++)res+="b";
    int i=n-1;
    while(x)
    {
        if(x&1)res[i]='r';
        x>>=1;
        --i;
    }
    return res;
}
void solve()
{
    int cnt=0;
    int id=0;
    for(int i=0;i<(1<<n);i++)//
    {
        int sum=0,t;
        string path=getpath(i);

        for(int j=0;j<n;j++)//n^2暴力check当前道路满意区间数
        {
            t=0;
            for(int k=j;k<n;k++)
            {
                if(path[k]=='r')t++;
                if(t&1)sum++;
            }
        }

        if(sum==ans)//当前道路满意区间为最大值则输出
        {
            ++cnt;
            if(cnt<n-12)continue;//前面两组解直接略过
            ++id;
            cout<<"stb["<<id<<"]="<<'"';
            for(int j=n-16;j<n;j++)cout<<path[j];//只取最后16位就可以了
            cout<<'"'<<';';
            cout<<endl;
            if(cnt==100)break;
        }
    }
}
void work()
{

}
int main()
{
    freopen("data.out","w",stdout);//文件输出,方便复制粘贴结果
    cin>>n;//输入n=29/30,分别跑出奇偶两组的解
    
    if(n&1)ans=(n+1)*(n+1)/4;//计算最大满意区间数
    else ans=(n*n+2*n)/4;
    cout<<ans<<endl;
    
    init();
    if(n<=30)solve();
    else work();
    return 0;
}

AC代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,ans;//注意!!! 因为n是1e5,ans是n^2级别的,会爆int
//现在赛就是思路出的还算顺利,结果因为疏忽了这个,疯狂找bug待机了半天,QwQ
string sta[100],stb[100];//sta,stb分别记录n=29、30时第三部分的后16位
void init()
{
    sta[1]="bbbbbbbbbbbbbbrb";
    sta[2]="bbbbbbbbbbbbbrbr";
    sta[3]="bbbbbbbbbbbbbrrr";
    sta[4]="bbbbbbbbbbbbrbrb";
    sta[5]="bbbbbbbbbbbbrrbr";
    sta[6]="bbbbbbbbbbbbrrrr";
    sta[7]="bbbbbbbbbbbrbrbb";
    sta[8]="bbbbbbbbbbbrrbbr";
    sta[9]="bbbbbbbbbbbrrbrr";
    sta[10]="bbbbbbbbbbbrrrrb";
    sta[11]="bbbbbbbbbbrbrbbb";
    sta[12]="bbbbbbbbbbrrbbbr";
    sta[13]="bbbbbbbbbbrrbbrr";
    sta[14]="bbbbbbbbbbrrbrrb";
    sta[15]="bbbbbbbbbbrrrrbb";
    sta[16]="bbbbbbbbbrbrbbbb";
    sta[17]="bbbbbbbbbrrbbbbr";
    sta[18]="bbbbbbbbbrrbbbrr";
    sta[19]="bbbbbbbbbrrbbrrb";
    sta[20]="bbbbbbbbbrrbrrbb";
    sta[21]="bbbbbbbbbrrrrbbb";
    sta[22]="bbbbbbbbrbrbbbbb";
    sta[23]="bbbbbbbbrrbbbbbr";
    sta[24]="bbbbbbbbrrbbbbrr";
    sta[25]="bbbbbbbbrrbbbrrb";
    sta[26]="bbbbbbbbrrbbrrbb";
    sta[27]="bbbbbbbbrrbrrbbb";
    sta[28]="bbbbbbbbrrrrbbbb";
    sta[29]="bbbbbbbrbrbbbbbb";
    sta[30]="bbbbbbbrrbbbbbbr";
    sta[31]="bbbbbbbrrbbbbbrr";
    sta[32]="bbbbbbbrrbbbbrrb";
    sta[33]="bbbbbbbrrbbbrrbb";
    sta[34]="bbbbbbbrrbbrrbbb";
    sta[35]="bbbbbbbrrbrrbbbb";
    sta[36]="bbbbbbbrrrrbbbbb";
    sta[37]="bbbbbbrbrbbbbbbb";
    sta[38]="bbbbbbrrbbbbbbbr";
    sta[39]="bbbbbbrrbbbbbbrr";
    sta[40]="bbbbbbrrbbbbbrrb";
    sta[41]="bbbbbbrrbbbbrrbb";
    sta[42]="bbbbbbrrbbbrrbbb";
    sta[43]="bbbbbbrrbbrrbbbb";
    sta[44]="bbbbbbrrbrrbbbbb";
    sta[45]="bbbbbbrrrrbbbbbb";
    sta[46]="bbbbbrbrbbbbbbbb";
    sta[47]="bbbbbrrbbbbbbbbr";
    sta[48]="bbbbbrrbbbbbbbrr";
    sta[49]="bbbbbrrbbbbbbrrb";
    sta[50]="bbbbbrrbbbbbrrbb";
    sta[51]="bbbbbrrbbbbrrbbb";
    sta[52]="bbbbbrrbbbrrbbbb";
    sta[53]="bbbbbrrbbrrbbbbb";
    sta[54]="bbbbbrrbrrbbbbbb";
    sta[55]="bbbbbrrrrbbbbbbb";
    sta[56]="bbbbrbrbbbbbbbbb";
    sta[57]="bbbbrrbbbbbbbbbr";
    sta[58]="bbbbrrbbbbbbbbrr";
    sta[59]="bbbbrrbbbbbbbrrb";
    sta[60]="bbbbrrbbbbbbrrbb";
    sta[61]="bbbbrrbbbbbrrbbb";
    sta[62]="bbbbrrbbbbrrbbbb";
    sta[63]="bbbbrrbbbrrbbbbb";
    sta[64]="bbbbrrbbrrbbbbbb";
    sta[65]="bbbbrrbrrbbbbbbb";
    sta[66]="bbbbrrrrbbbbbbbb";
    sta[67]="bbbrbrbbbbbbbbbb";
    sta[68]="bbbrrbbbbbbbbbbr";
    sta[69]="bbbrrbbbbbbbbbrr";
    sta[70]="bbbrrbbbbbbbbrrb";
    sta[71]="bbbrrbbbbbbbrrbb";
    sta[72]="bbbrrbbbbbbrrbbb";
    sta[73]="bbbrrbbbbbrrbbbb";
    sta[74]="bbbrrbbbbrrbbbbb";
    sta[75]="bbbrrbbbrrbbbbbb";
    sta[76]="bbbrrbbrrbbbbbbb";
    sta[77]="bbbrrbrrbbbbbbbb";
    sta[78]="bbbrrrrbbbbbbbbb";
    sta[79]="bbrbrbbbbbbbbbbb";
    sta[80]="bbrrbbbbbbbbbbbr";
    sta[81]="bbrrbbbbbbbbbbrr";
    sta[82]="bbrrbbbbbbbbbrrb";
    sta[83]="bbrrbbbbbbbbrrbb";
    sta[84]="bbrrbbbbbbbrrbbb";

    stb[1]="bbbbbbbbbbbbbbbr";
    stb[2]="bbbbbbbbbbbbbbrb";
    stb[3]="bbbbbbbbbbbbbbrr";
    stb[4]="bbbbbbbbbbbbbrbr";
    stb[5]="bbbbbbbbbbbbbrrb";
    stb[6]="bbbbbbbbbbbbbrrr";
    stb[7]="bbbbbbbbbbbbrbrb";
    stb[8]="bbbbbbbbbbbbrrbb";
    stb[9]="bbbbbbbbbbbbrrbr";
    stb[10]="bbbbbbbbbbbbrrrr";
    stb[11]="bbbbbbbbbbbrbrbb";
    stb[12]="bbbbbbbbbbbrrbbb";
    stb[13]="bbbbbbbbbbbrrbbr";
    stb[14]="bbbbbbbbbbbrrbrr";
    stb[15]="bbbbbbbbbbbrrrrb";
    stb[16]="bbbbbbbbbbrbrbbb";
    stb[17]="bbbbbbbbbbrrbbbb";
    stb[18]="bbbbbbbbbbrrbbbr";
    stb[19]="bbbbbbbbbbrrbbrr";
    stb[20]="bbbbbbbbbbrrbrrb";
    stb[21]="bbbbbbbbbbrrrrbb";
    stb[22]="bbbbbbbbbrbrbbbb";
    stb[23]="bbbbbbbbbrrbbbbb";
    stb[24]="bbbbbbbbbrrbbbbr";
    stb[25]="bbbbbbbbbrrbbbrr";
    stb[26]="bbbbbbbbbrrbbrrb";
    stb[27]="bbbbbbbbbrrbrrbb";
    stb[28]="bbbbbbbbbrrrrbbb";
    stb[29]="bbbbbbbbrbrbbbbb";
    stb[30]="bbbbbbbbrrbbbbbb";
    stb[31]="bbbbbbbbrrbbbbbr";
    stb[32]="bbbbbbbbrrbbbbrr";
    stb[33]="bbbbbbbbrrbbbrrb";
    stb[34]="bbbbbbbbrrbbrrbb";
    stb[35]="bbbbbbbbrrbrrbbb";
    stb[36]="bbbbbbbbrrrrbbbb";
    stb[37]="bbbbbbbrbrbbbbbb";
    stb[38]="bbbbbbbrrbbbbbbb";
    stb[39]="bbbbbbbrrbbbbbbr";
    stb[40]="bbbbbbbrrbbbbbrr";
    stb[41]="bbbbbbbrrbbbbrrb";
    stb[42]="bbbbbbbrrbbbrrbb";
    stb[43]="bbbbbbbrrbbrrbbb";
    stb[44]="bbbbbbbrrbrrbbbb";
    stb[45]="bbbbbbbrrrrbbbbb";
    stb[46]="bbbbbbrbrbbbbbbb";
    stb[47]="bbbbbbrrbbbbbbbb";
    stb[48]="bbbbbbrrbbbbbbbr";
    stb[49]="bbbbbbrrbbbbbbrr";
    stb[50]="bbbbbbrrbbbbbrrb";
    stb[51]="bbbbbbrrbbbbrrbb";
    stb[52]="bbbbbbrrbbbrrbbb";
    stb[53]="bbbbbbrrbbrrbbbb";
    stb[54]="bbbbbbrrbrrbbbbb";
    stb[55]="bbbbbbrrrrbbbbbb";
    stb[56]="bbbbbrbrbbbbbbbb";
    stb[57]="bbbbbrrbbbbbbbbb";
    stb[58]="bbbbbrrbbbbbbbbr";
    stb[59]="bbbbbrrbbbbbbbrr";
    stb[60]="bbbbbrrbbbbbbrrb";
    stb[61]="bbbbbrrbbbbbrrbb";
    stb[62]="bbbbbrrbbbbrrbbb";
    stb[63]="bbbbbrrbbbrrbbbb";
    stb[64]="bbbbbrrbbrrbbbbb";
    stb[65]="bbbbbrrbrrbbbbbb";
    stb[66]="bbbbbrrrrbbbbbbb";
    stb[67]="bbbbrbrbbbbbbbbb";
    stb[68]="bbbbrrbbbbbbbbbb";
    stb[69]="bbbbrrbbbbbbbbbr";
    stb[70]="bbbbrrbbbbbbbbrr";
    stb[71]="bbbbrrbbbbbbbrrb";
    stb[72]="bbbbrrbbbbbbrrbb";
    stb[73]="bbbbrrbbbbbrrbbb";
    stb[74]="bbbbrrbbbbrrbbbb";
    stb[75]="bbbbrrbbbrrbbbbb";
    stb[76]="bbbbrrbbrrbbbbbb";
    stb[77]="bbbbrrbrrbbbbbbb";
    stb[78]="bbbbrrrrbbbbbbbb";
    stb[79]="bbbrbrbbbbbbbbbb";
    stb[80]="bbbrrbbbbbbbbbbb";
    stb[81]="bbbrrbbbbbbbbbbr";
    stb[82]="bbbrrbbbbbbbbbrr";
    stb[83]="bbbrrbbbbbbbbrrb";
}
string getpath(int x)//构造字符串
{
    string res="";
    for(int i=1;i<=n;i++)res+="b";
    int i=n-1;
    while(x)
    {
        if(x&1)res[i]='r';
        x>>=1;
        --i;
    }
    return res;
}
void solve()//暴力求解
{
    int cnt=0;
    int id=0;
    for(int i=0;i<(1<<n);i++)
    {
        int sum=0,t;
        string path=getpath(i);//二进制枚举状态

        for(int j=0;j<n;j++)//n^2暴力check当前道路满意区间数
        {
            t=0;//t:区间red的个数
            for(int k=j;k<n;k++)
            {
                if(path[k]=='r')t++;
                if(t&1)sum++;//t为奇数,当前区间符合要求
            }
        }

        if(sum==ans)//当前道路满意区间为最大值则输出
        {
            ++cnt;
            //if(cnt<n-12)continue;
            //++id;
            //cout<<"sta["<<id<<"]="<<'"';
            for(int j=0;j<n;j++)cout<<path[j];//输出结果
            //cout<<'"'<<';';
            cout<<endl;
            if(cnt==100)break;//只取前100项
        }
    }
}
void work()//规律求解
{
    int cnt=1;
    for(int i=1;i<=n/2;i++)cout<<'b';cout<<'r';for(int i=n/2+2;i<=n;i++)cout<<'b';cout<<endl;//输出第一部分
    for(int i=n/2+1;i;i--)//输出第二部分
    {
        for(int j=1;j<=n/2-1;j++)cout<<'b';cout<<'r';
        for(int j=1;j<=(n+1)/2;j++)
            if(j==i||j==i+1)cout<<'r';
            else cout<<'b';
        cout<<endl;
        ++cnt;
        if(cnt==100)break;
    }
    for(int i=cnt+1;i<=100;i++)//输出第三部分
    {
        for(int j=1;j<=n/2-2;j++)cout<<'b';cout<<'r';
        for(int j=n/2;j<=n-16;j++)cout<<'b';
        if(n&1)cout<<sta[i-cnt];
        else cout<<stb[i-cnt];
        cout<<endl;
    }
}
int main()
{
    //freopen("data.out","w",stdout);
    cin>>n;

    if(n&1)ans=(n+1)*(n+1)/4;
    else ans=(n*n+2*n)/4;
    cout<<ans<<endl;

    init();

    if(n<=30)solve();//小于30直接暴力求解
    else work();//大于30按规律求解
    return 0;
}

  • 11
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值