牛客oj 小C的棋王之路 暴力分塊 塊重構

2021-10-06 06:29:30 字數 2283 閱讀 5487

傳送門

那場wa了12發還是過不去.主要是區間賦值的操作想複雜了.分享一下遇到的問題.

考慮題目給的幾個操作:

1.區間加 區間乘 這兩個沒什麼難度,乘的時候把塊裡面加法標記也乘一下就好了.

2 區間賦值 這個其實可以用上面兩個操作推導出來,不要多加乙個標記去記錄(速度會慢而且增大**難度).可以乘0再加x就ok了.

3 增加乙個x在尾部.這個操作可能會使最後乙個塊的大小太大.所以可以在這個操作超過sqrt(n)的時候重構一下塊.這個次數一次是o(n)的.而且不會超過sqrt(n)次.

複雜度方面塊取sqrt(n)的話總體就是o(nsqrt(n))的.題目給了3s.所以勉勉強強夠用.要注意減少取模運算.兩個intmax乘起來是不會爆longlongmax的.所以可以在中間的時候不取模.

**

#pragma gcc optimize(2)

#define ll long long

#define pq priority_queue

#define ull unsigned long long

#define pb push_back

#define mem(a,x) memset(a,x,sizeof a)

#define pii pair

#define fir(i,a,b) for(int i=a;i<=b;++i)

#define afir(i,a,b) for(int i=a;i>=b;--i)

#define ft first

#define vi vector

#define sd second

#define all(a) a.begin(),a.end()

#include

using

namespace std;

const

int n =

2e5+10;

inline ll read()

while

(ch<=

'9'&&ch>=

'0')

return x*f;

}int n,m,blo,num,mod,pos[n]

;ll l[n]

,r[n]

,sum[n]

,add[n]

,mul[n]

,a[n]

;void

clr(

int i)

bool f =0;

void

build()

} blo =

sqrt

(n);

num = n/blo;

fir(i,

1,num)

if(n % blo)if(

!f)}

return;}

fir(i,

1,num)}}

void

add(

int l,

int r,ll v)

else

clr(p)

;fir

(i,l,r[p]

) a[i]

=(a[i]

+ v)

%mod;

sum[p]

=(sum[p]

+(r[p]

-l+1

)*v)

%mod;

clr(q)

;fir

(i,l[q]

,r) a[i]

=(a[i]

+ v)

%mod;

sum[q]

=(sum[q]

+(r-l[q]+1

)*v)

%mod;}}

void

mul(

int l,

int r,ll v)

}else

clr(p)

;fir

(i,l,r[p]

)clr

(q);

fir(i,l[q]

,r)}

}ll query

(int l,

int r)

}else

clr(p)

;fir

(i,l,r[p]

)clr

(q);

fir(i,l[q]

,r)}

return res;

}int

main()

}else

if(op ==4)

}else

}return0;

}

牛客科大訊飛杯 日期小助手 暴力模擬

乙個很有趣的模擬題 給你乙個日期,問你最近的後面乙個母親節或父親節是什麼時候。可以看到資料範圍只有一百年,也就是100 365 100組資料,顯然可以暴力。先打出這一百年裡邊的母親節和父親節的表,然後每次輸入乙個日期,暴力 判斷即可。include include include include i...

小K的疑惑 牛客

bob有 n 1 leq n leq10000 個點的樹,每條邊有乙個邊權 d 0 leq d leq 233 現在定義 dis i,j 代表第 i 個點到第 j 個點的距離模2。問有多少 i,j,k 滿足 dis i,j dis i,k dis j,k 首先,一棵樹中不存在 i,j,k 使得 di...

牛客 小y的盒子

稍加觀察就會發現,4n 1就是題目要的答案。至於為什麼,看官方的題解。不過這個n非常的大,用正常快速冪解決不了。這道題我學到的就是解決冪非常大的情況。sol1 之前好像做過一道類似的題目,想不出來,在群裡看到發了乙個名詞叫十進位制快速冪。然後根據這個名字自己意淫通了。一般的快速冪是把冪當成二進位製用...