NOIP大綱整理 (十四)預處理與字首和

2021-08-22 08:18:16 字數 2241 閱讀 7238

一、預處理

所謂預處理,顧名思義,就是事先計算好需要的值或事先處理某些東西,有時候你會發現你做乙個題目出現了tle,原因就是重複的計算會導致效率不高(或者說你的預處理不夠「優雅」)。 

a、直接把結果預處理

xtuoj 1052

題意:某乙個數字集合定義如下:

1.0屬於這個集合;

2.如果x屬於這個集合,那麼2x+1,3x+1也屬於這個集合;

3.集合只包含按增序排列的前100000個元素。

集合按增序排列,根據輸入的元素序號,輸出對應的元素值。

輸入每行乙個整數n(n<100000),表示元素的序號(從0開始記數),如果是-1,則輸入結束。

輸出每行輸出對應元素的值。

sample input

-1sample output

9 分析:很明顯,不能也不好直接判斷是否存在於這個集合中,只需要把所有存在於這個集合中標記,並且預處理這些元素的序號,之後輸出就行了,那麼一次預處理便可以知道所有序號對應的元素了。

#include

#define max 2000001 

using name space std;  

int a[100010], b[3*max]; 

int main() ; 

int main()  

int flag = 0; 

for (int i = m; i <= n; i++)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]單獨算一次的情況。

#include

#include

#include

#include

#define mod 1000000007

using name space 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; 

//這樣做的目的是為了防止出現負數(我是試出來的)因為我找不到具體樣列會出現負數.所以必須這才能a。

vis[a[i]] = i;

printf("%d\n",ans[n]%mod);

NOIP大綱整理 (一)常見問題與常用策略

數學類問題 1.精度處理 高精度 實數處理 各種浮點型別處理方法 2.組合數學問題 斐波那契數列 第二類數 卡特蘭數 polya原理 排列組合計數 加法原理與乘法原理 3.進製問題 特定二進位制串的統計 二分查詢 利用二進位制進行路徑 狀態描述 二進位制轉換 4.遞推與遞迴關係 遞推關係式 通項公式...

C 筆記整理 預處理命令

define和 undef define 它告訴編譯器存在給定名稱的符號 undef 它刪除符號的定義 if elif else endif 這些指令告訴編譯器是否編譯某個 塊 define debug define bug static void main string args if if el...

c語言整理編譯預處理

c程式執行過程 源程式 編譯預處理 編譯 優化程式 匯程式設計序 鏈結程式 可執行檔案。編譯預處理時,先要讀取源程式,對預處理指令 開頭指令 以及特殊的符號進行處理,比如define 替換指令,也會進行刪除注釋,多餘的空白字元,然後產生的預處理檔案或者程式傳給編譯器,在程式中以 開頭的編譯指令稱為預...