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

有前綴和, 前綴GCD, 前綴奇數個數, 前綴偶數個數, 前綴差, 等等, 都要根據自己的思想來去解決!!!,前綴思想真的還是挺考人的, 如果想不到的話.....記住 : 一般涉及到區間的什么值時, 就要用前綴思想.

HDU --- 4223
思路 : 目的是找一個子串, 其和的絕對值最小. 其實不用前綴思想也好寫出來, 但是我一下就想了下前綴, 因為
子串還是一個區間賽. 所以求一個前綴和, 并排序, 然后一個一個相減, 這樣的差值就是某一個子串的最小值.
因為是排好序了的, 所以要最小一定是在某一個前綴和差值里, 然后加上一個絕對值就是了.
總之 : 看到區間就要聯想的前綴思想.

#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個數(n < 1e5), 問不能拼出的最小數是多少(從 1 開始算), 比如 : 1,2,3,4,5 不能拼出最小
的數為16 . 1,2,4,5 不能拼出的最小數為13.  2,3,4,5不能拼出的數為 1 .
輸入的n有多組數據, 每一個數<1e9.*/
// 思路 : 前綴和思想. 如果后面的數字如果大于前綴和+1 說明他和區間沒有交集 前綴和+1 這個數字就達不到 就不連續了, 就輸出此時的前綴和+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)  //如上面所說. 主要原因是連續的數之間是有一定的聯系的.
                break;
            ans += a[i];
        }
        printf("%d\n",ans+1);
    }
}

HDU --- 6025
思想 : 因為是要刪除其中一個數, 然后是總Gcd最大, 一個個刪肯定會T, 所以刪除一個, 相當于求前一個區間和后一個區間的GCD,
所以我們想到用求前綴GCD和后綴GCD的方法, 這樣我們只需要掃一遍就可以求出來最后答案.
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這樣刪數的復雜度是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 題目 :(維護前綴和)
Description
已知一個長度為N的數列A[1..N]。
現在給出Q次查詢,每次查詢一個區間[L, R]。
對于每一個區間,求使得(A[i] + A[j])為奇數的(i, j)的對數 (L <= i < j <= R)。

Input
多組數據,第一行有一個整數T表示數據組數。(T <= 5)
之后有T組數據,每組數據第一行為兩個整數N和Q,表示數列長度及查詢數量。
(1 <= N, Q <= 100000)
接著有一行N個元素的數列A[1..N]。(1 <= A[i] <= 1000)
接下來Q行,每行有兩個整數L, R,表示查詢的區間。(1 <= L <= R <= N)

Output
對于每次詢問,輸出一行數字,表示區間”Odd Pair”的對數.
Sample Input
1
5 2
1 5 3 4 2
1 5
2 3
Sample Output
6
0
思路 : 只有當一個奇數加一個偶數時才滿足題目要求. 所以知道該區間中奇數和偶數的個數就可以直接算.

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; //結構體中的變量會自動付初值.
    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;   //每一個繼承前面那個的奇數和偶數個數.
                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(這道題挺重要的!!!)
思維題. 也可以用前綴和思想, 只是有點難理解. 所以這兒就不給這種解法了. 給一種易理解的解法.
思路 :
設ans(k)為k長度的子序列的個數,,a[k]為第k個子序列,那么如果a[k]和前面的數都不相同的情況下,ans(k)]=ans(k-1)*2+1;如果前面的數字出現過的話,那么就要減去最近一次出現a[k]這個數值的地方-1的子序列個數,因為這些算重復的了,而且+1也沒有了,因為ans(a[k]上次出現的位置)包括了a[k]單獨算一次的情況
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;  //這樣做的目的是為了防止出現負數(我是
//wa試出來的)因為我找不到具體樣列會出現負數.所以必須這才能A .
            }
            vis[a[i]] = i;
        }
        printf("%d\n",ans[n]%mod);
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,739評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,634評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,653評論 0 377
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,063評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,835評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,235評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,315評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,459評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,000評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,819評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,004評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,560評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,257評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,676評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,937評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,717評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,003評論 2 374

推薦閱讀更多精彩內容