給你n,m求∑i
=0mc
ni%(
109+7
)' role="presentation" style="position: relative">∑mi
=0ci
n%(10
9+7)
∑i=0
mcni
%(109
+7)。
t組資料t≤
105,1
≤m,n
≤105' role="presentation" style="position: relative">t≤10
5,1≤
m,n≤
105t≤
105,1
≤m,n
≤105。
這題常規思路暴力求字首和時間複雜度和空間複雜度都是顯然不夠的,所以,採用莫隊演算法將t個詢問排序,之後將m看做l,n看做r,通過觀察可以發現∑i
=0mc
ni=2
∗∑i=
0mcn
−1i−
cn−1
m' role="presentation">∑i=
0mci
n=2∗
∑i=0
mcin
−1−c
mn−1
∑i=0
mcni
=2∗∑
i=0m
cn−1
i−cn
−1m所以首先將r加/減到指定行,之後對l進行加/減,設res為答案,即:
r加的時候:re
s=re
s∗2−
crl,
r++;
' role="presentation" style="position: relative">res
=res
∗2−c
lr,r
++;r
es=r
es∗2
−crl
,r++
;r減的時候:r−
−,re
s=(r
es+c
rl)/
2;' role="presentation" style="position: relative">r−−
,res
=(re
s+cl
r)/2
;r−−
,res
=(re
s+cr
l)/2
;l加的時候:l+
+,re
s=re
s+cr
l;' role="presentation" style="position: relative">l++
,res
=res
+clr
;l++
,res
=res
+crl
;l減的時候:re
s=re
s−cr
l,l−
−;' role="presentation" style="position: relative">res
=res
−clr
,l−−
;res
=res
−crl
,l−−
;具體見**:
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int maxn = 100000;
const int pt = 1e9 + 7;
struct nood q[maxn + 5];
ll p[maxn + 5], rp[maxn + 5];
int t;
int b[maxn + 5];
ll qwe(ll x, ll y)
return res;
}bool cmp(nood a, nood b)
void init()
int unit = sqrt(maxn);
for(int i = 1; i <= maxn; i++)b[i] = i / unit + 1;
scanf("%d", &t);
for(int i = 1; i <= t; i++)scanf("%d
%d", &q[i].r, &q[i].l), q[i].id = i;
sort(q + 1, q + t + 1, cmp);
}ll c(int n, int
m) vectorint, ll> > ans;
int main()
while(r > q[i].r)
while(l < q[i].l)
while(l > q[i].l)
ans.push_back(make_pair(q[i].id, res));
}sort(ans.begin(), ans.end());
for(int i = 0; i < ans.size(); i++)printf("%lld\n", ans[i].second);
return
0;}
HDU6333 莫隊演算法
給你n,m求 i 0mcn i 1 09 7 sum m 10 9 7 i 0m cni 10 9 7 t組資料t 1 05,1 m,n 105 t leq 10 5,1 leq m,n leq 10 5 t 105,1 m,n 10 5。這題常規思路暴力求字首和時間複雜度和空間複雜度都是顯然不夠的...
HDU6333 莫隊演算法
給你n,m求 t組資料 這題常規思路暴力求字首和時間複雜度和空間複雜度都是顯然不夠的,所以,採用莫隊演算法將t個詢問排序,之後將m看做l,n看做r,通過觀察可以發現 所以首先將r加 減到指定行,之後對l進行加 減,設res為答案,即 r加的時候 r減的時候 l加的時候 l減的時候 具體見 inclu...
HDU 3874 Necklace 莫隊演算法
題目 題意 給定乙個陣列,每次詢問乙個區間 l,r 求區間內所有數字的和,出現多次的數字只加一次 思路 莫隊演算法掃一遍即可,注意會爆int。我陣列開小了不少re而是tle,蛋疼。include include include include include include using namesp...