b. 小w的a=b問題
思路:把階乘hash就行
#include
#define ll long long
using namespace std;
const
int maxn =
1e5+
10, n =
1e5;
const
int mod1 =
1e9+
7, mod2 =
998244353
;ll p1[maxn]
, p2[maxn]
;int
main()
int t;
cin>>t;
while
(t--
) ll s3 =
1, s4 =1;
for(
int i =
1; i <= m; i++)if
(s1 == s3 && s2 == s4)
puts
("equal");
else
puts
("unequal");
}}
c. 小w的糖果
我們維護一下差分陣列sum,操作:1 x 就是sum[x]++,操作:2 x 就是sum[x] 到 sum[n] +=1,操作3不好搞了,我們記s陣列也是差分陣列,不過假設s[i] = x,那麼s[i] 真正的值是(2 * i - 1) * x,那麼操作:3 x 可以這樣轉化:s[x] 到 s[n] +=1,sum[x] 到 sum[n] -= 2 * (x - 1),這一步你們自己推一推,我們發現,對於差分陣列區間加減法,可以再進行一次差分,差分套差分o(n)搞定這題
#include
#define ll long long
using namespace std;
const
int maxn =
1e5+
10, mod =
1e9+7;
ll sum[2]
[maxn]
, a[maxn]
;void
add(ll &x, ll y)
intmain()
}for
(int i =
1; i <= n; i++
)for
(int i =
1; i <= n; i++)}
}
e. 小w的矩陣前k大元素
思路:對於每一次查詢,我們先用兩個set:s1,s2 維護當前a陣列前x個元素和b陣列前y個元素,並且用一顆權值線段樹維護b陣列前y個元素,如果要查詢前k小的元素,我們二分求第k小的元素mid,判斷方法:列舉第乙個set的元素x,從權值線段樹中找 <= mid - x的元素有多少個,然後和k對比就行。假設找到了mid = ans,那麼我們再列舉兩個set的元素 t1, t2,把所有滿足: t1 + t2 < mid 的元素加入優先佇列,然後輸出就行,複雜度:klognlogn
#include
#define ll long long
using namespace std;
const
int maxn =
1e5+
10, m =
1e9;
ll a[maxn]
, b[maxn]
, n =
4e9;
;multiset s1, s2;
priority_queue
, greater
> q;
int sum[maxn *40]
, ls[maxn *40]
, rs[maxn *40]
;int cnt, rt;
voidup(
int& o, ll l, ll r, ll k)
intqu
(int o, ll l, ll r, ll k)
intok
(ll t,
int k)
return0;
}int
main()
else
if(s[0]
=='d'
)else
int res =0;
for(
auto t1 : s1)if(
!flag)
break;}
while
(!q.
empty()
&& d)
while
(d--
)puts(""
);}}
}
牛客練習賽40 題解(部分)
官方題解 a 小d的劇場 大概意思就是,有1 49個數,代表著不同的音符,問你能組成長度為n的串有多少種 mod 109 7 有若干個限制,比如1 2 3,就是1,2,3不能放在一起,然後問你在這些限制下有多少種不同的長度為n的串。3 n 500,0 q 117649,1 a,b,c 49 思路 看...
牛客練習賽22題解
簡單瞎搞題 不會用bitset,所以沒做出來。實際上還是比較簡單的。include using namespace std bitset 1000005 dp 2 int main cout 2 count 簡單資料結構1 這裡要運用拓展尤拉定理。ab modp ab p b p p 0 modp ...
題解 牛客練習賽51
字首a的數量,字尾c的數量,遇到b就計算一次答案。includeusing namespace std typedef long long ll const int n 1e5 100 char s n int cnt n int main int tmp 0 for int i 1 i n i p...