1. 程式人生 > 實用技巧 >hdu6794 Tokitsuka and Multiple // map&字首和

hdu6794 Tokitsuka and Multiple // map&字首和

題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=6794

題目大意:給定一個長度為n的數列,一個數字p,每次可任意選擇兩個相鄰數進行合併(最多合併n-1次 然而這並不重要hh),求合併過程中的數列中,使得其%p為0的數的個數。//表達能力好爛 草(笑)

主要思路:首先讀入,每個都去%p。想到字首和,但不用一上來就求完全部的。因為每當從第i個開始的k個數的sum為0,下標大於 i+k 的字首和在此之前是不用求出的。因而輕輕鬆鬆,只要用一個sum,我們一邊讀入,一邊就逐步計算字首和。而當加入data[i]後的 sum == 0,則res++,清零sum重新計算由下一位開始的字首和。這裡推薦使用map,速度很快還能以陣列形式訪問。直接一個.clear就可,不用vis陣列的memset。否則你會嚐到瘋狂TLE的美味感jio。

(本段看起來比較憨憨,給初學者或者像我這樣的憨憨看就很合適)))doge << 1

*轉載請註明本部落格連結 謝謝

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<map>

using namespace std;

const int maxn = 1e5+10;
int n, p, res;

int data[maxn];
map<int, int
> m;//map是真滴快 int main(){ int T;scanf("%d",&T); while(T--){ res = 0; m[0] = 1; scanf("%d %d",&n,&p); int sum = 0; for(int i = 1 ; i <= n ; i++){ scanf("%d",&data[i]); data[i] %= p; sum
= (sum + data[i]) % p; if(m[sum]){ res++; sum = 0; m.clear(); m[0] = 1;//sum == 0 時,此時計算的字首和恰好組成p的整數倍 }else{ m[sum]++; } } printf("%d\n",res); } return 0
; }