亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

前綴和 和 取尺法 詳細例題講解

2019-11-14 09:58:37
字體:
來源:轉載
供稿:網友

前綴和一維前綴和問題1靜態區間求和問題2求是否有子區間之和m等于x問題3n個數選數字之和整除n問題4從兩端延伸的問題問題5先區間更新然后再區間查詢二維前綴和問題1靜態子矩陣求和問題2先子矩陣更新然后再子矩陣查詢取尺法問題1處理同一類連續區間問題2一類具有單調性的問題

前綴和

一維前綴和

定義PRe[n]=∑i=1nA[i]

問題1:靜態區間求和

給定大小為n的數組(1≤n≤105),接下來讀入n個數字表示A[i](1≤A[i]≤109) 接下來輸入Q(1≤Q≤105),然后有Q行,表示Q次查詢。 每次查詢,輸入l,r(1≤l≤r≤n),要求輸出sum=A[l]+A[l+1]+A[l+2]+...+A[r?1]+A[r]

思路: 預處理一下前綴和pre,那么每次查詢,sum就等于pre[r]?pre[l?1]

問題2:求是否有子區間之和%m等于x

給定大小為n的數組和數字m(1≤n,m≤105),接下來讀入n個數字表示A[i](1≤A[i]≤109) 問是否能找到一個子區間,使得區間內的數字之和%m等于x

思路: 從左往右處理前綴和pre,如果當前處理到了第i個,記錄當前的前綴和pre[i]%m為t 那么如果這個位置,是我們要求的子區間的右邊界,那么l - 1的位置的前綴和%m的值就應該等于(t?x+m)%m 所以我們一邊處理前綴和,一邊記錄pre[i]%m是否出現了即可。

問題3:n個數,選數字之和整除n

給定大小為n的數組和數字m(1≤n,m≤105),接下來讀入n個數字表示A[i](1≤A[i]≤109) 是否能選出一些數字,使得這些數字之和%n為0

思路: 求前綴和pre,求和的時候順便%n。如果某一個pre等于0,那么就取前這么多個數字,之和%n就等于0了。 否則,沒有pre等于0。 通過問題2,我們可以知道,如果有兩個不同位置的pre相同,那么這兩個位置中間所夾的區間,之和%n就等于0 又因為有n個pre,但是pre%n的結果只可能是1~n-1這n-1種情況 所以至少有兩個pre是相同的。 那么兩個相同的pre的位置,中間所夾的區間,就會是滿足條件的

問題4:從兩端延伸的問題

給定大小為n的數組(1≤n≤105),接下來讀入n個數字表示A[i](1≤A[i]≤109) 接下來輸入Q(1≤Q≤105),然后有Q行,表示Q次查詢。 每次查詢,輸入l,r(1≤l≤r≤n),要求輸出[l,r]區間外面,所有數字的總的gcd

思路: 可以發現,gcd只可以合并,但是并不能和加法一樣,做到逆運算(加法的逆運算就是減法) 但是這個題實際上是除去了[l,r]區間的,那么有效的區間都是從左邊或者是右邊延伸的 所以可以這樣做:

int n, A[MX];int pre[MX], suf[MX];LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a;}void presolve() { pre[0] = 0; for(int i = 1; i <= n; i++) { pre[i] = gcd(pre[i - 1], A[i]); } suf[n + 1] = 0; for(int i = n; i >= 1; i--) { suf[i] = gcd(suf[i + 1], A[i]); }}int query(int l, int r) { return gcd(pre[l - 1], suf[r + 1]);}

問題5:先區間更新,然后再區間查詢

給定大小為n的數組(1≤n≤105),剛開始每個位置的值都為0 接下來輸入m(1≤m≤105),接下來m行表示m次修改,每次修改輸入l r x,表示區間[l,r]中的數字全部加上x 接下來輸入Q(1≤m≤105),接下來Q行表示Q次查詢,每次查詢輸入l r,要求輸出A[l]+A[l+1]+A[l+2]+...+A[r?1]+A[r]

思路: 這個題特別之處在于,并不是一邊修改一邊查詢,而是先修改,然后再是查詢,那么就沒必要使用復雜的數據結構,直接用前綴和就能搞定了。 創建數組A 對于m次修改,每次直接A[l] += x, A[r + 1] -= x 然后再對A數組求一次前綴和,假如依然保存在A數組里。 此時,A[i]就表示,m次修改以后,第i個位置的值了~ 那么我們現在要區間修改,又回到了問題1,再對A數組做一遍前綴和就行了

二維前綴和

pre[n][m]=∑i=1n∑j=1mA[i][j]

問題1:靜態子矩陣求和

給定大小為n*m的矩陣(1≤n,m≤103),接下來讀入n*m個數字表示A[i][j](1≤A[i]≤109) 接下來輸入Q(1≤Q≤105),然后有Q行,表示Q次查詢。 每次查詢,輸入x1,y1,x2,y2(1≤x1≤x2≤n,1≤y1≤y2≤m),要求輸出子矩陣中的所有數字之和

思路: 按二維前綴和的定義,預處理出pre 對于每次查詢,答案就是pre[x2][y2]?pre[x2][y1?1]?pre[x1?1][y2]+pre[x1?1][y1?1] 預處理pre可以這樣做

void presolve() { for(int i = 1; i <= n; i++) { LL line = 0; for(int j = 1; j <= m; j++) { line += A[i][j]; pre[i][j] = pre[i - 1][j] + line; } }}

問題2:先子矩陣更新,然后再子矩陣查詢

給定大小為n*m的矩陣(1≤n,m≤103),接下來讀入n*m個數字表示A[i][j](1≤A[i]≤109) 接下來輸入P(1≤P≤105),然后有P行,表示P次修改。 每次修改,輸入x1,y1,x2,y2,x(1≤x1≤x2≤n,1≤y1≤y2≤m),那么子矩陣中所有數字會加上x 接下來輸入Q(1≤Q≤105),然后有Q行,表示Q次修改。 每次查詢,輸入x1,y1,x2,y2(1≤x1≤x2≤n,1≤y1≤y2≤m),要求輸出子矩陣中所有數字之和

思路: 感覺寫到這里,前綴和的套路大家也應該能明白了。 對于每次修改,我們A[x1][y1]+=d,A[x2+1][y1]?=d,A[x1][y2+1]?=d,A[x2+1][y2+1]+=d 然后對A求二維前綴和,得到每個位置的數字。 再求一次前綴和,保存到A中 然后回到問題1,對于每次查詢,答案就是pre[x2][y2]?pre[x2][y1?1]?pre[x1?1][y2]+pre[x1?1][y1?1]

取尺法

又叫兩點法(two point)

問題1:處理同一類連續區間

一個長為n(1≤n≤105)的只有0和1的串。 求連續1最長是多少。

思路:這種處理連續區間的方法非常多,也有更簡單的,不詳細說了

int l, r, ans = 0;for(l = 1; l <= n; l = r + 1) { for(r = l; r + 1 <= n && A[r + 1] == A[l]; r++); if(A[l] == 1) ans = max(ans, r - l + 1);}printf("%d/n", ans);

問題2:一類具有單調性的問題

有n(1≤n≤105)個位置放了物品,每個物品有a和b(1≤a,b≤105)。 現在要找到一個子區間,使得這個子區間的a之和小于等于W(1≤W≤109),且b的和最大。 求這個最大值。

這一類問題,如果想用取尺法解決,基本上都有以下的特征: - 能夠判斷當前狀態是否符合題意 - 能維護增加一個,和刪除一個 - 左邊界不變時,右邊界一定是越大越好,直到不符合題意 - 右邊界不變時,左邊界一定是越小越好,直到不符合題意

一旦滿足了這些要求,就能用取尺法了。 這里有一個對于這一類題的模板

void solve() { int l, r = 0; for(l = 1; l <= n; l++) { //check是檢查把這個位置加進去,是否還符合題意 while(r + 1 <= n && check(r + 1)) { r++; add(r);//把這個位置的加進去 } //在這個地方更新答案 delete(l);//把l的位置的刪掉 } //輸出答案}

寫到這里,取尺法和前綴和,最常用的用法就全部介紹完拉~


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美在线免费| 不卡伊人av在线播放| 欧美在线激情网| 欧美日韩国产123| 一区二区三区回区在观看免费视频| 久久免费国产视频| 97在线日本国产| 亚洲毛茸茸少妇高潮呻吟| 欧美日韩国产91| 日韩精品免费在线观看| 一区二区三区久久精品| 精品久久久久久国产91| 久久久国产精彩视频美女艺术照福利| 欧美激情一区二区三区高清视频| 色噜噜国产精品视频一区二区| 欧美在线观看www| 欧美综合第一页| 成人在线观看视频网站| 欧美乱妇高清无乱码| 7m精品福利视频导航| 精品香蕉在线观看视频一| 国产一区二区三区在线免费观看| xxxx欧美18另类的高清| 91在线精品播放| 丰满岳妇乱一区二区三区| 奇米一区二区三区四区久久| 裸体女人亚洲精品一区| 一区二区av在线| 欧洲亚洲免费视频| 亚洲欧美日韩国产精品| 日韩欧美在线第一页| 国产美女精品视频| 亚洲色图欧美制服丝袜另类第一页| 亚洲网站在线观看| 亚洲激情在线观看视频免费| 午夜精品一区二区三区av| 亚洲性生活视频| 久久久精品久久久| 91老司机精品视频| 亚洲成人xxx| 中文字幕精品久久| 亚洲精品视频网上网址在线观看| 亚洲欧美日韩中文在线制服| 日韩欧美一区二区在线| 国产精品69精品一区二区三区| 久久久久久久久久久人体| 亚洲精品欧美一区二区三区| 91爱视频在线| 黑人巨大精品欧美一区二区三区| 黄色一区二区在线| 久久精品亚洲94久久精品| 国产精品麻豆va在线播放| 国产午夜一区二区| 中文字幕亚洲情99在线| 欧美国产高跟鞋裸体秀xxxhd| 日本精品一区二区三区在线| 中文字幕日韩欧美精品在线观看| 日韩欧美高清在线视频| 亚洲午夜激情免费视频| 国产精品一久久香蕉国产线看观看| 国产欧美一区二区| 成人欧美一区二区三区在线| 亚洲一二三在线| 国产亚洲欧洲高清一区| 青青a在线精品免费观看| 日韩午夜在线视频| 色综合久综合久久综合久鬼88| 久久免费视频网站| 久久久久999| 日产精品久久久一区二区福利| 日韩精品一区二区三区第95| 欧美亚洲在线观看| 亚洲毛片一区二区| 亚洲黄色在线看| 亚洲第一天堂av| 91国产美女在线观看| 国产成人在线播放| 欧美精品videosex性欧美| 亚洲电影成人av99爱色| 精品自在线视频| 日韩精品999| 国产偷国产偷亚洲清高网站| 免费97视频在线精品国自产拍| 日韩欧美在线第一页| 精品福利在线观看| 亚洲美女精品成人在线视频| 91久久精品国产| 亚洲精品动漫久久久久| 91在线播放国产| 国产欧美中文字幕| 亚洲国产三级网| 97在线精品视频| 国产精品最新在线观看| 精品国产精品自拍| 亚洲国产福利在线| 欧美激情小视频| 69精品小视频| 日韩中文在线中文网在线观看| 55夜色66夜色国产精品视频| 成人做爽爽免费视频| 久久在线精品视频| 亚洲 日韩 国产第一| 欧美午夜精品久久久久久浪潮| 久久久久久久久91| 国产精品视频不卡| 欧美亚洲成人网| 97精品视频在线| 美女999久久久精品视频| 亚洲欧美成人一区二区在线电影| 国产最新精品视频| 九九热在线精品视频| 亚洲欧洲在线视频| 国产精品久久久久久久久免费| 国产亚洲精品久久久| 久久全球大尺度高清视频| 亚洲偷欧美偷国内偷| 久久精品亚洲一区| 激情懂色av一区av二区av| 欧美插天视频在线播放| 精品国偷自产在线视频99| 日韩视频永久免费观看| 久久亚洲国产精品| 中日韩美女免费视频网站在线观看| 国产精品久久久久国产a级| 亚洲精品动漫100p| 国产精品国产自产拍高清av水多| 国产成人精品久久| 最近更新的2019中文字幕| 亚洲大胆美女视频| 欧美黑人一级爽快片淫片高清| 国产成人精品亚洲精品| 欧洲成人在线观看| 欧美一级高清免费| 国产精品国产三级国产专播精品人| 国产免费亚洲高清| 国产精品久久久| 热99精品只有里视频精品| 日韩在线播放av| 欧美一级黄色网| 精品在线观看国产| 国产91精品视频在线观看| 98午夜经典影视| www.xxxx精品| 精品国产电影一区| 7m精品福利视频导航| 国产一级揄自揄精品视频| 久久久黄色av| 精品久久久久久久久久久久久久| 正在播放亚洲1区| 日韩av电影中文字幕| 亚洲精品按摩视频| 日本一区二区三区四区视频| 人人澡人人澡人人看欧美| 国产不卡精品视男人的天堂| 国产精品精品国产| 欧美伦理91i| 日韩一区二区精品视频| 欧美日韩国产精品一区二区三区四区| 久久久久久尹人网香蕉| 超碰97人人做人人爱少妇| 久久手机免费视频| 久久精品99国产精品酒店日本| 亚洲国产精品999| 宅男66日本亚洲欧美视频|