傳送門
那場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 之前好像做過一道類似的題目,想不出來,在群裡看到發了乙個名詞叫十進位制快速冪。然後根據這個名字自己意淫通了。一般的快速冪是把冪當成二進位製用...