一些用前綴思想解決的題(持續(xù)完善)

有前綴和, 前綴GCD, 前綴奇數(shù)個(gè)數(shù), 前綴偶數(shù)個(gè)數(shù), 前綴差, 等等, 都要根據(jù)自己的思想來(lái)去解決!!!惊窖,前綴思想真的還是挺考人的, 如果想不到的話.....記住 : 一般涉及到區(qū)間的什么值時(shí), 就要用前綴思想.

HDU --- 4223
思路 : 目的是找一個(gè)子串, 其和的絕對(duì)值最小. 其實(shí)不用前綴思想也好寫出來(lái), 但是我一下就想了下前綴, 因?yàn)?br> 子串還是一個(gè)區(qū)間賽. 所以求一個(gè)前綴和, 并排序, 然后一個(gè)一個(gè)相減, 這樣的差值就是某一個(gè)子串的最小值.
因?yàn)槭桥藕眯蛄说? 所以要最小一定是在某一個(gè)前綴和差值里, 然后加上一個(gè)絕對(duì)值就是了.
總之 : 看到區(qū)間就要聯(lián)想的前綴思想.

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=1e3+5;
int cas=1;
int ans[maxn];
int a[maxn];
int main()
{
    int t;
    scanf("%d",&t);
    while(t--){
        int n;
        memset(ans,0,sizeof(ans));
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
        }
        for(int i=1;i<=n;i++)
            ans[i]=ans[i-1]+a[i];
        sort(ans,ans+n+1);
        for(int i=0;i<=n;i++)
            printf("%d ",ans[i]);
        printf("\n");
        int res=ans[1]-ans[0];
        for(int i=1;i<=n;i++){
            if(abs(ans[i]-ans[i-1])<res)
                res = abs(ans[i]-ans[i-1]);
        }
        printf("Case %d: ",cas++);
        printf("%d\n",res);
    }
}
/*題目描述 : 給你n個(gè)數(shù)(n < 1e5), 問不能拼出的最小數(shù)是多少(從 1 開始算), 比如 : 1,2,3,4,5 不能拼出最小
的數(shù)為16 . 1,2,4,5 不能拼出的最小數(shù)為13.  2,3,4,5不能拼出的數(shù)為 1 .
輸入的n有多組數(shù)據(jù), 每一個(gè)數(shù)<1e9.*/
// 思路 : 前綴和思想. 如果后面的數(shù)字如果大于前綴和+1 說(shuō)明他和區(qū)間沒有交集 前綴和+1 這個(gè)數(shù)字就達(dá)不到 就不連續(xù)了, 就輸出此時(shí)的前綴和+1.
//代碼如下 : 
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=1e5+5;
int a[maxn];
int main()
{
    int n;
    while(~scanf("%d",&n)){
        for(int i=0;i<n;i++){
            scanf("%d",&a[i]);
        }
        sort(a,a+n);  //記得排序哦.
        int ans = 0;
        for(int i=0;i<n;i++){
            if(a[i] > ans + 1)  //如上面所說(shuō). 主要原因是連續(xù)的數(shù)之間是有一定的聯(lián)系的.
                break;
            ans += a[i];
        }
        printf("%d\n",ans+1);
    }
}

HDU --- 6025
思想 : 因?yàn)槭且獎(jiǎng)h除其中一個(gè)數(shù), 然后是總Gcd最大, 一個(gè)個(gè)刪肯定會(huì)T, 所以刪除一個(gè), 相當(dāng)于求前一個(gè)區(qū)間和后一個(gè)區(qū)間的GCD,
所以我們想到用求前綴GCD和后綴GCD的方法, 這樣我們只需要掃一遍就可以求出來(lái)最后答案.
AC Code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define CLR(x) memset(x,0,sizeof(x))
using namespace std;
const int maxn=1e5+5;
const int inf=1e9;
int qian[maxn],hou[maxn];
int a[maxn];
int main()   //思路求前綴和后綴GCD這樣刪數(shù)的復(fù)雜度是n.
{
    int t;
    scanf("%d",&t);
    while(t--){
        CLR(qian);
        CLR(hou);
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
        }
        qian[1]=a[1];
        hou[1]=a[n];
        for(int i=2;i<=n;i++){
            qian[i]=__gcd(qian[i-1],a[i]);
        }
        for(int i=2;i<=n;i++){
            hou[i]=__gcd(hou[i-1],a[n-i+1]);
        }
        int maxx=max(qian[n-1],hou[n-1]);
        for(int i=2;i<=n-1;i++){
            int m=__gcd(qian[i-1],hou[n-i]);
            if(m>maxx)
                maxx=m;
        }
        printf("%d\n",maxx);
    }
}

SHU 1952 題目 :(維護(hù)前綴和)
Description
已知一個(gè)長(zhǎng)度為N的數(shù)列A[1..N]虚青。
現(xiàn)在給出Q次查詢,每次查詢一個(gè)區(qū)間[L, R]哑诊。
對(duì)于每一個(gè)區(qū)間靠粪,求使得(A[i] + A[j])為奇數(shù)的(i, j)的對(duì)數(shù) (L <= i < j <= R)。

Input
多組數(shù)據(jù)休傍,第一行有一個(gè)整數(shù)T表示數(shù)據(jù)組數(shù)征绎。(T <= 5)
之后有T組數(shù)據(jù),每組數(shù)據(jù)第一行為兩個(gè)整數(shù)N和Q磨取,表示數(shù)列長(zhǎng)度及查詢數(shù)量亚隙。
(1 <= N, Q <= 100000)
接著有一行N個(gè)元素的數(shù)列A[1..N]。(1 <= A[i] <= 1000)
接下來(lái)Q行最爬,每行有兩個(gè)整數(shù)L, R牲距,表示查詢的區(qū)間。(1 <= L <= R <= N)

Output
對(duì)于每次詢問逢净,輸出一行數(shù)字哥放,表示區(qū)間”O(jiān)dd Pair”的對(duì)數(shù).
Sample Input
1
5 2
1 5 3 4 2
1 5
2 3
Sample Output
6
0
思路 : 只有當(dāng)一個(gè)奇數(shù)加一個(gè)偶數(shù)時(shí)才滿足題目要求. 所以知道該區(qū)間中奇數(shù)和偶數(shù)的個(gè)數(shù)就可以直接算.

AC Code

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=1e5+5;
int cas=1;
struct math{
    int odd; //結(jié)構(gòu)體中的變量會(huì)自動(dòng)付初值.
    int ans;
}s[maxn];

int main()
{
    int t;
    scanf("%d",&t);
    while(t--){
        int n,q;
        scanf("%d%d",&n,&q);
        for(int i=1;i<=n;i++){
            int x;
            scanf("%d",&x);
            if(x&1){
                s[i].odd += s[i-1].odd + 1;   //每一個(gè)繼承前面那個(gè)的奇數(shù)和偶數(shù)個(gè)數(shù).
                s[i].ans += s[i-1].ans;
            }
            else{
                s[i].ans += s[i-1].ans + 1;
                s[i].odd += s[i-1].odd;
            }
        }
        while(q--){
            int l,r;
            scanf("%d%d",&l,&r);
            int a = s[r].odd - s[l-1].odd;
            int b = s[r].ans - s[l-1].ans;
            printf("%d\n",a*b);
        }
    }
}

FZU --- 2129(這道題挺重要的!!!)
思維題. 也可以用前綴和思想, 只是有點(diǎn)難理解. 所以這兒就不給這種解法了. 給一種易理解的解法.
思路 :
設(shè)ans(k)為k長(zhǎng)度的子序列的個(gè)數(shù),,a[k]為第k個(gè)子序列歼指,那么如果a[k]和前面的數(shù)都不相同的情況下,ans(k)]=ans(k-1)*2+1甥雕;如果前面的數(shù)字出現(xiàn)過(guò)的話踩身,那么就要減去最近一次出現(xiàn)a[k]這個(gè)數(shù)值的地方-1的子序列個(gè)數(shù),因?yàn)檫@些算重復(fù)的了社露,而且+1也沒有了挟阻,因?yàn)閍ns(a[k]上次出現(xiàn)的位置)包括了a[k]單獨(dú)算一次的情況
AC code

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#define mod 1000000007
using namespace std;
const int maxn=1e6+5;
int cas=1;
int ans[maxn],a[maxn];
int vis[maxn];
int main()
{
    int n;
    while(~scanf("%d",&n)){
        memset(ans,0,sizeof(ans));
        memset(vis,0,sizeof(vis));
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
        }
        for(int i=1;i<=n;i++){
            if(vis[a[i]]==0){
                ans[i] = (ans[i-1]*2+1)%mod;
            }
            else{
                ans[i] = ((ans[i-1]*2 - ans[vis[a[i]]-1])%mod+mod)%mod;  //這樣做的目的是為了防止出現(xiàn)負(fù)數(shù)(我是
//wa試出來(lái)的)因?yàn)槲艺也坏骄唧w樣列會(huì)出現(xiàn)負(fù)數(shù).所以必須這才能A .
            }
            vis[a[i]] = i;
        }
        printf("%d\n",ans[n]%mod);
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市峭弟,隨后出現(xiàn)的幾起案子附鸽,更是在濱河造成了極大的恐慌,老刑警劉巖瞒瘸,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坷备,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡情臭,警方通過(guò)查閱死者的電腦和手機(jī)省撑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)谎柄,“玉大人丁侄,你說(shuō)我怎么就攤上這事〕祝” “怎么了鸿摇?”我有些...
    開封第一講書人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)劈猿。 經(jīng)常有香客問我拙吉,道長(zhǎng),這世上最難降的妖魔是什么揪荣? 我笑而不...
    開封第一講書人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任筷黔,我火速辦了婚禮,結(jié)果婚禮上仗颈,老公的妹妹穿的比我還像新娘佛舱。我一直安慰自己,他們只是感情好挨决,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開白布请祖。 她就那樣靜靜地躺著,像睡著了一般脖祈。 火紅的嫁衣襯著肌膚如雪肆捕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,158評(píng)論 1 308
  • 那天盖高,我揣著相機(jī)與錄音慎陵,去河邊找鬼眼虱。 笑死,一個(gè)胖子當(dāng)著我的面吹牛席纽,可吹牛的內(nèi)容都是我干的捏悬。 我是一名探鬼主播,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼胆筒,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼邮破!你這毒婦竟也來(lái)了诈豌?” 一聲冷哼從身側(cè)響起仆救,我...
    開封第一講書人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎矫渔,沒想到半個(gè)月后彤蔽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡庙洼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年顿痪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片油够。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蚁袭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出石咬,到底是詐尸還是另有隱情揩悄,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布鬼悠,位于F島的核電站删性,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏焕窝。R本人自食惡果不足惜蹬挺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望它掂。 院中可真熱鬧巴帮,春花似錦、人聲如沸虐秋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)熟妓。三九已至雪猪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間起愈,已是汗流浹背只恨。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工译仗, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人官觅。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓纵菌,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親休涤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子咱圆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗(yàn)。 張土汪:刷leetcod...
    土汪閱讀 12,747評(píng)論 0 33
  • 1功氨、用C語(yǔ)言實(shí)現(xiàn)一個(gè)revert函數(shù)序苏,它的功能是將輸入的字符串在原串上倒序后返回。 2捷凄、用C語(yǔ)言實(shí)現(xiàn)函數(shù)void ...
    希崽家的小哲閱讀 6,275評(píng)論 0 12
  • 【1】7忱详,9,-1跺涤,5匈睁,( ) A、4桶错;B航唆、2;C院刁、-1糯钙;D、-3 分析:選D黎比,7+9=16超营;9+(-1)=8;(...
    Alex_bingo閱讀 18,946評(píng)論 1 19
  • 扯微信出來(lái)并不是要搶眼球米碰,非得在名頭上要說(shuō)道說(shuō)道的話,在某種程度上勉強(qiáng)可以說(shuō)是微信“樹大招風(fēng)”:微信的注冊(cè)用戶規(guī)模...
    4a50cd7f4a50閱讀 899評(píng)論 0 1
  • 我是個(gè)獨(dú)處的時(shí)候經(jīng)常會(huì)反省自己生活的雙子女购城。享受那一刻難得的清醒吕座。,最近開始思考自己的人生軌跡了瘪板,夾雜著些許說(shuō)不出...
    七月上的冥王星閱讀 242評(píng)論 1 1