傳送門
day1 t1
給定乙個長度為 n
nn 的整數數列
\,有 q
qq 次操作,操作有 6
66 種,分別為:單點賦值,全域性加,全域性乘,全域性賦值,單點查值,全域性求和。
操作的讀入有點鬼畜啊,建議仔細讀一下。
資料範圍:1≤n
≤109
1≤n≤10^9
1≤n≤10
9,1≤q≤
10
71\le q\le 10^7
1≤q≤10
7。我們先分析一下資料範圍。操作有 107
10^7
107 個,應該是 o(1
)o(1)
o(1)
完成每個操作;n
nn 又有 109
10^9
109 那麼大,可以排除線段樹等資料結構。
然後發現題目的特性:好像只有單點操作和全域性操作,並沒有區間的操作。
我們可以按照線段樹的思路,記一 add
,mul
,sum
add,mul,sum
add,mu
l,su
m,表示全域性加,全域性乘,全域性求和。
那麼 2,3
,4,6
2,3,4,6
2,3,4,
6 操作就是套路,不多說了。想一想怎麼做單點操作。
對於 1
11,也可以開個 unordered_map 直接做,要記錄一下最後乙個更改此位置的時間。
那麼對於 5
55,我們可以取 a
xa_x
ax(就是最後一次單點賦值和最後一次區間賦值中時間靠後的那次),答案就是 ax×
mul+
ad
da_x\times mul+add
ax×mu
l+ad
d。那這也提示我們,單點賦值是時不能直接賦 val
valva
l,應該是 val
−add
mu
l\frac
mulval
−add
。因此我們還要處理處 mul
mulmu
l 的逆元。
#include
#include
#include
#include
#define n 100005
#define p 10000019
using
namespace std;
using
namespace tr1;
int n,q,t,add,mul=
1,sum,last,ans;
int a[
105]
,b[105
],inv[p]
;unordered_map<
int,
int>val,time;
struct queryq[n]
;int
add(
int x,
int y)
intdec
(int x,
int y)
intmul
(int x,
int y)
void
solve
(int i,
int t)
else
}int
main()
scanf
("%d"
,&t)
;for
(int i=
1;i<=t;
++i)
scanf
("%d%d"
,&a[i]
,&b[i]);
inv[1]
=1;for
(int i=
2;i++i) inv[i]
=mul
(p-p/i,inv[p%i]);
for(
int i=
1;i<=t;
++i)
for(
int j=
1;j<=q;
++j)
solve
((a[i]
+1ll
*j*b[i]
)%q+1,
(i-1
)*q+j)
;printf
("%d"
,ans)
;return0;
}
移動金幣 SDOI2019
乙個 1 times n 的棋盤上最初擺放有 m 枚金幣。其中每一枚金幣佔據了乙個獨立的格仔,任意乙個格仔內最多只有一枚金幣。alice 和 bob 將要進行如下的一場遊戲。二人輪流操作,且 alice 先行。當輪到乙個玩家的時候,他可以選擇一枚金幣,並將其向左移動任意多格,且至少移動一格。金幣不能...
SDOI 2019 移動金幣 題解
題目傳送門 題目大意 乙個長度為 n nn 的序列上有 m mm 個金幣,兩個人輪流操作,乙個人可以將乙個金幣向左移動任意格,但是不能越過別的金幣,問有多少種局面先手必勝。感覺像這兩題 1,2 的合體,不過合的也很巧妙。轉化一下這個博弈 相當於有 m 1 m 1m 1 堆石子,每次可以將一堆石子中的...
Luogu5358 SDOI2019 快速查詢
luogu5358 sdoi2019 快速查詢 不敢壓行了,調不動 qaq 注意查詢雜湊表時,如果已經找到了數,但是是在覆蓋以前的,直接返回找不到即可,因為雜湊表的特點是後插入的數先訪問到。include include include define n 100005 define m 105 de...