hdu6794 Tokitsuka and Multiple // map&字首和
阿新 • • 發佈:2020-08-06
題目連結: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; }