SDOI 2019 快速查詢

2021-09-25 19:04:16 字數 2295 閱讀 7474

傳送門

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...