日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

AtCoder Grand Contest #026 D - Histogram Coloring

發布時間:2023/12/18 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AtCoder Grand Contest #026 D - Histogram Coloring 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Time Limit: 2 sec / Memory Limit: 1024 MB

Score :?11001100?points

Problem Statement

Let us consider a grid of squares with?109109?rows and?NN?columns. Let?(i,j)(i,j)?be the square at the?ii-th column?(1iN)(1≤i≤N)?from the left and?jj-th row?(1j109)(1≤j≤109)?from the bottom.

Snuke has cut out some part of the grid so that, for each?i=1,2,...,Ni=1,2,...,N, the bottom-most?hihi?squares are remaining in the?ii-th column from the left. Now, he will paint the remaining squares in red and blue. Find the number of the ways to paint the squares so that the following condition is satisfied:

  • Every remaining square is painted either red or blue.
  • For all?1iN?11≤i≤N?1?and?1jmin(hi,hi+1)?11≤j≤min(hi,hi+1)?1, there are exactly two squares painted red and two squares painted blue among the following four squares:?(i,j),(i,j+1),(i+1,j)(i,j),(i,j+1),(i+1,j)?and?(i+1,j+1)(i+1,j+1).

Since the number of ways can be extremely large, print the count modulo?109+7109+7.

Constraints

  • 1N1001≤N≤100
  • 1hi1091≤hi≤109

Input

Input is given from Standard Input in the following format:

NN h1h1 h2h2 ...... hNhN

Output

Print the number of the ways to paint the squares, modulo?109+7109+7.


Sample Input 1?Copy

Copy 9 2 3 5 4 1 2 4 2 1

Sample Output 1?Copy

Copy 12800

One of the ways to paint the squares is shown below:

### #### # #### ### #########

Sample Input 2?Copy

Copy 2 2 2

Sample Output 2?Copy

Copy 6

There are six ways to paint the squares, as follows:

## ## ## ## ## ## ## ## ## ## ## ##

Sample Input 3?Copy

Copy 5 2 1 2 1 2

Sample Output 3?Copy

Copy 256

Every way to paint the squares satisfies the condition.


Sample Input 4?Copy

Copy 9 27 18 28 18 28 45 90 45 23

Sample Output 4?Copy

Copy 844733013

Remember to print the number of ways modulo?109+7109+7.

?

按照題目的要求,四個字符組成的正方形區域內兩種顏色要各占一半。
先看一個例子

2

3 3

圖案為

##

##

##

方案有這么幾種(兩種字符代表兩種顏色)

|*#|#*|#*|*#|*#|#*|*#|#*|** |##

|#*|*#|*#|*#|*#|#*|#*|#*|##|**

|*#|#*|*#|#*|*#|#*|#*|*#|** |##

一共十種方案

可以總結的規律是如果一列中的顏色沒有連續相同的,比如第1,2,9,10種方案,那么在第一列確定的情況下,第二列還可以有兩種方案,但是一旦有連續相同的了,比如第k和k+1顏色相同,那么在第二列的k和k+1(如果存在的話)顏色就是已經確定的了,這樣其他位置的顏色也是確定的,所以只有一種方案。如此就可以分開來存儲有連續相同的方案數,和交替顏色(無連續相同)的方案數。

用dp[i][0]存無連續相同的方案數。而dp[i][j]分兩種情況。

由于每一列高度不盡相同,還有考慮各種情況。

對于每一列,求無連續相同顏色的方案,只是局限于其與前一列接觸的部分,不接觸的部分顏色可以隨意設置,至于下一列是否會接觸這一部分再又下一列去選擇。

dp[i][j]呢,對于與前一列有接觸的部分,dp[i][j]存 有連續相同的方案數,假如這一列比前一列高出d個,那么dp[i][j] = dp[i - 1][j] * 2 ^ d,對于高出的部分是很靈活的,不會受前一列的限制,可以隨意變化,至于高出來這一塊的dp[i][j]存無連續相同的方案數(有連續相同的方案 在底部接觸部分已經記錄過)。

由于高度可能很大,所以這里采用離散化,把所有的高度存到一個數組里,這樣每個列對應一個高度的下標。由于一共有不多于100列,所有最多有100個不相同的高度,直接按照高度差來計算相關量即可。

先看c++代碼:

#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std;const int MOD = (int)1e9 + 7;int n,m,h[101],hnum[101],dh[101];///h記錄每一列高度 dh記錄離散化后的各不相同的高度 hnum記錄h對應dh中的位置,即第幾高的高度 long long dp[101][101];///記錄第i列第n塊高度往上的方案數int pow_(long long x,int y) {///快速冪求 x的y次方long long ans = 1;if(y > 0) {while(y) {if(y % 2)ans = ans * x % MOD;x = x * x % MOD;y /= 2;}}return ans; }int main() {scanf("%d",&n);for(int i = 1;i <= n;i ++) {scanf("%d",&h[i]);dh[++ m] = h[i];///先把高度存到dh數組 下標從1開始,方便后面dp }sort(dh + 1,dh + m + 1);///dh數組排序m = unique(dh + 1,dh + m + 1) - dh - 1;///dh數組離散化去掉重復的高度 m是不相同的高度數for(int i = 1;i <= n;i ++) {hnum[i] = lower_bound(dh + 1,dh + m + 1,h[i]) - dh;///每一列高度在dh數組中對應的位置 }dp[0][0]=1;///初始化 當第0列有1個無連續相同的方案for(int i = 1;i <= n;i ++) {///對每一列每個高度段進行更新 更新過程為從下往上(dp[i][0] += dp[i - 1][0] * 2 % MOD) %= MOD;///無連續相同方案 加上前i - 1列無連續相同方案數*2 因為可以是與前一列對應位置同色或者異色一共兩種方案for(int j = hnum[i] + 1;j <= hnum[i - 1];j ++)///如果前一列比這一列高,高出的部分也存著接觸部分無連續相同的方案 但是可能會重復加上上一步的方案數所以下面更新高出的部分時會避免(dp[i][0] += dp[i - 1][j] * 2 % MOD) %= MOD;int d = pow_(2,h[i] - h[i - 1]);///比前一列高出部分的涂色方案數,如果比前一列低 d就等于1for(int j = 1;j <= min(hnum[i - 1],hnum[i]);j ++) {dp[i][j] = dp[i - 1][j] * d % MOD;///有連續相同顏色的方案數 已經分析過接觸部分的顏色一定是定下的 所以這一列接觸部分有連續相同部分的方案數由高出部分的變化決定 即 乘上d }for(int j = hnum[i - 1] + 1;j <= hnum[i];j ++) {///更新比前一列高出的部分 j從上一列的高度加1的下標開始if(j > 1)(dp[i][j] = dp[i - 1][0] * (pow_(2,dh[j] - dh[j - 1]) - 1) % MOD * 2 % MOD * pow_(2,h[i] - dh[j]) % MOD) %= MOD;///一般情況 前i - 1列無連續方案 * (第j塊高度變化方案 -1表示去掉無連續相同方案) * 2 * 剩下幾塊高度的變化方案數else (dp[1][1] = dp[0][0] * (pow_(2,dh[1]) - 2) % MOD * pow_(2,h[i] - dh[1]) % MOD) %= MOD;///第一列的第一塊高度 記錄隨意變化方案數 -2表示除去dp[i][0]已經記錄過的無連續相同方案 勿重復記錄 }}long long ans = 0;for(int i = 0;i <= hnum[n];i++)(ans += dp[n][i]) %= MOD;printf("%lld",ans);return 0; } View Code

?


### #### # #### ### #########
對于樣例一來說,最初dp[0][0] = 1;dh[] = {0,1,2,3,4,5},hnum[] = {0,2,3,5,4,1,2,4,2,1},然后一列一列來
第一列:dp[1][0] = dp[0][0] * 2 = 2,2個無連續相同方案,然后前一列高度為0,所以第一列比前一列高出兩個高度塊,dp[1][1] = 0,dp[1][2] = 2;
第二列:dp[2][0] = dp[1][0] * 2 = 4,dp[2][1] = dp[1][1] * 2 = 0,dp[2][2] = dp[1][2] * 2 = 4;比前一列高出3 - 2 = 1個高度塊,dp[2][3] = 4;
第三列:dp[3][0] = dp[2][0] * 2 = 8,dp[3][1] = dp[2][1] * 4 = 0,dp[3][2] = dp[2][2] * 4 = 16,dp[3][3] = dp[2][3] * 4 = 16,比前一列高出兩個高度塊,dp[3][4] = dp[2][0] * 2 * 2 = 16,dp[3][5] = 8;
第四列:dp[4][0] = dp[3][0] * 2 + dp[3][5] * 2 = 32,dp[4][1] = 0,dp[4][2] = dp[3][2] = 16,dp[4][3] = 16,dp[4][4] = 16;
第五列:dp[5][0] = dp[4][0] * 2 + dp[4][2] * 2 + dp[4][3] * 2 + dp[4][4] * 2 = 160,dp[5][1] = 0;
第六列:dp[6][0] = dp[5][0] * 2 = 320,dp[6][1] = 0,dp[6][2] = dp[5][0] * 2 = 320;
第七列:dp[7][0] = dp[6][0] * 2 = 640,dp[7][1] = 0,dp[7][2] = dp[6][2] * 4 = 1280,dp[7][3] = dp[6][0] * 2 * 2 = 1280,dp[7][4] = dp[6][0] * 2 = 640;
第八列:dp[8][0] = dp[7][0] * 2 + dp[7][3] * 2 + dp[7][4] * 2 = 5120,dp[8][1] = 0,dp[8][2] = dp[7][2] = 1280;
第九列:dp[9][0] = dp[8][0] * 2 + dp[8][2] * 2 = 12800,dp[9][1] = 0;
答案:12800

轉載于:https://www.cnblogs.com/8023spz/p/9406634.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的AtCoder Grand Contest #026 D - Histogram Coloring的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日韩高清毛片 | 色综合成人 | 欧美成人xxx | 国产又黄又粗又爽 | 亚洲精品福利在线观看 | 中国免费看的片 | 亚洲最大的网站 | 91欧美国产 | 成人午夜激情视频 | 在线视频观看你懂得 | 精品无码国产一区二区三区av | 操碰在线视频 | 欧美一级做 | 成人小视频免费在线观看 | 欧美伦理影院 | 成人av国产 | 毛片基地视频 | 91调教打屁股xxxx网站 | 日本特级片| 在线黄色网页 | 国产精品久久久精品三级 | 中文字幕免费在线看线人动作大片 | 一区二区三区四区影院 | 可以看的黄色网 | 国内自拍视频在线播放 | 丁香五色月| 欧美粗暴jizz性欧美20 | 蜜桃在线一区 | 六月色婷婷 | 亚洲制服一区二区 | 91久久精品国产 | 91精品国产一区二区三竹菊影视 | 精品久久久久久久久久岛国gif | 成人h动漫精品一区二区器材 | 视频一区在线免费观看 | 91久久精品一区二区三 | 狠狠干狠狠操视频 | 91这里只有精品 | 在线精品福利 | 99久久精品无免国产免费 | av手机免费在线观看 | 午夜电影网站 | 欧美做爰爽爽爽爽爽爽 | 日本一区二区人妻 | 天天干天天插天天射 | 欧美激情18p| 一本大道久久 | 成人福利片 | 一级淫片在线观看 | 少妇人妻偷人精品无码视频新浪 | 91性高潮久久久久久久久 | 久久久久网站 | 人人爽在线 | 亚洲欧美在线不卡 | 日韩黄色小视频 | 亚洲成年 | 一区二区传媒有限公司 | www.精品一区 | 翔田千里一区二区三区av | 好吊妞这里有精品 | 茄子av在线 | 九色在线 | 四虎永久免费地址 | 亚洲熟妇中文字幕五十中出 | 成 人片 黄 色 大 片 | 91九色porn| 国产精品人人 | 97超碰人人澡 | 久久97视频 | 亚洲午夜精品久久 | 狠狠干性视频 | 99福利网 | 97成人精品 | 免费毛片播放 | 一区二区三区免费在线观看 | 俺也来俺也去俺也射 | 91老女人| 夜夜噜噜噜 | 自拍偷拍日韩精品 | 国产三级中文字幕 | 国产精品资源网站 | 亚洲天堂免费视频 | 亚洲精品在线观看av | 人人操在线播放 | 天天色天天操天天射 | 成年人网站免费视频 | 亚洲精品一区在线观看 | 一区二区三区精彩视频 | 欧美日韩一区二区精品 | 香蕉黄视频 | 国产精品免费一区二区三区四区 | 国产av无码国产av毛片 | 精品少妇白浆小泬60P | 嫩草一二三 | 国产高清不卡一区 | 国产一区二区三区www | 国产精品成人一区二区三区电影毛片 | 下面一进一出好爽视频 | 性免费视频 |