給你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。這題常規思路暴力求字首和時間複雜度和空間複雜度都是顯然不夠的,所以,採用莫隊演算法將t個詢問排序,之後將m看做l,n看做r,通過觀察可以發現∑i=
0mcn
i=2∗
∑i=0
mcn−
1i−c
n−1m
\sum_^m=2*\sum_^m^i}-c_^m
i=0∑m
cni
=2∗i
=0∑m
cn−
1i−
cn−1
m所以首先將r加/減到指定行,之後對l進行加/減,設res為答案,即:
r加的時候:res
=res
∗2−c
rl,r
++
;res=res*2-c_r^l,r++;
res=re
s∗2−
crl
,r++
; r減的時候:r−−
,res
=(re
s+cr
l)/2
;r--,res = (res + c_r^l )/2;
r−−,re
s=(r
es+c
rl)
/2;
l加的時候:l++
,res
=res
+crl
;l++,res=res+c_r^l;
l++,re
s=re
s+cr
l;
l減的時候:res
=res
−crl
,l−−
;res=res-c_r^l,l--;
res=re
s−cr
l,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;
intmain()
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)
;return0;
}
HDU6333 莫隊演算法
給你n,m求 t組資料 這題常規思路暴力求字首和時間複雜度和空間複雜度都是顯然不夠的,所以,採用莫隊演算法將t個詢問排序,之後將m看做l,n看做r,通過觀察可以發現 所以首先將r加 減到指定行,之後對l進行加 減,設res為答案,即 r加的時候 r減的時候 l加的時候 l減的時候 具體見 inclu...
HDU6333 莫隊演算法
給你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 re...
HDU 3874 Necklace 莫隊演算法
題目 題意 給定乙個陣列,每次詢問乙個區間 l,r 求區間內所有數字的和,出現多次的數字只加一次 思路 莫隊演算法掃一遍即可,注意會爆int。我陣列開小了不少re而是tle,蛋疼。include include include include include include using namesp...