P5358 SDOI2019 快速查詢 思維題

2022-06-13 20:54:09 字數 2000 閱讀 2742

戳這裡

隨便來個資料結構直接模擬,但是操作量達到了 \(1e7\) 級別,也就是說單個操作必須做到 \(o(1)\)

觀察發現只有全域性操作和單點操作,所以用到了乙個小 \(trick\) 就是維護乙個全域性標記,然後對於單點進行修改,這樣可以做到 \(o(1)\) 進行全域性修改,然後對於單點修改操作轉化一下也可以做到 \(o(1)\)

具體來說就是:

維護乙個全域性乘標記 \(mul\) 全域性加標記 \(add\) 全域性賦值標記 \(tag\) 全域性和 \(sum\) 時間戳 \(lst\) 每乙個點最近第一次單點賦值 \(tim\)

這樣每乙個位置的值等價於 \(v[x]*mul+add\) ,然後我們開始分操作考慮怎麼維護

單點賦值 \(val\)

我們逆向推出 \(v[pos]\) 應該變成什麼 \(v[pos]*mul+add=val\to v[pos]=(val-add)\times inv(mul)\) 然後直接修改 \(v[pos]\) 的值就好了

全域性加 \(val\)

\(add=add+val\ sum=sum+val*n\)

全域性乘 \(val\)

\(add=add*val\ mul=mul*val\ sum=sum*val\) 注意由於 \(0\) 沒有逆元所以乘 \(0\) 的操作要看成全域性賦值 \(0\)

全域性賦值 \(val\)

\(tag=val\ mul=1\ add=0 \ sum=val*n\) 同時更新一下 \(lst\)

單點查詢

分情況討論一下

\(a\) : 上一次全域性修改在這乙個點的單點賦值之前,也就是說全域性賦值被覆蓋了,那麼 \(ans=v[pos]*mul+add\)

\(b\) : 上一次全域性修改在單點修改之後,也就是說此時的值應該為全域性賦值標記 \(ans=tag*mul+add\)

全域性查詢

直接上 \(sum\)

由於這題讀入比較詭異,所以我們可以離散化出修改的點的座標,這樣就可以開的下 \(v,tim\)

tip:

詭異的讀入要求 \(a,b\) 必須開成 \(long long\) 不然兩個 \(int\) 相乘直接**,不要問我怎麼知道的/kk

#includeusing namespace std;

namespace zzc

while(isdigit(ch))

return x*f;

}const int maxn = 1e5+5;

const long long mod = 1e7+19;

long long n,qt,cnt,t,lst,sum,ans,mul,add,tag;

long long d[maxn],tim[maxn],inv[mod+5],v[maxn];

struct query

q[maxn];

void init()

sort(d+1,d+cnt+1);

cnt=unique(d+1,d+cnt+1)-d-1;

for(int i=1;i<=qt;i++) if(q[i].opt==1||q[i].opt==5) q[i].pos=lower_bound(d+1,d+cnt+1,q[i].pos)-d;

mul=1;tag=0;add=0;lst=0;

}void work()

else if(q[id].opt==2)

else if(q[id].opt==3)

else if(q[id].opt==4)

else if(q[id].opt==5)

else if(q[id].opt==6)

// printf("#%d: id=%d mul=%d add=%d tag=%d sum=%lld %lld\n",(i-1)*qt+j,id,mul,add,tag,sum,ans);}}

printf("%lld\n",ans%mod);

}}int main()

Luogu5358 SDOI2019 快速查詢

luogu5358 sdoi2019 快速查詢 不敢壓行了,調不動 qaq 注意查詢雜湊表時,如果已經找到了數,但是是在覆蓋以前的,直接返回找不到即可,因為雜湊表的特點是後插入的數先訪問到。include include include define n 100005 define m 105 de...

移動金幣 SDOI2019

乙個 1 times n 的棋盤上最初擺放有 m 枚金幣。其中每一枚金幣佔據了乙個獨立的格仔,任意乙個格仔內最多只有一枚金幣。alice 和 bob 將要進行如下的一場遊戲。二人輪流操作,且 alice 先行。當輪到乙個玩家的時候,他可以選擇一枚金幣,並將其向左移動任意多格,且至少移動一格。金幣不能...

SDOI 2019 快速查詢

傳送門 day1 t1 給定乙個長度為 n nn 的整數數列 有 q qq 次操作,操作有 6 66 種,分別為 單點賦值,全域性加,全域性乘,全域性賦值,單點查值,全域性求和。操作的讀入有點鬼畜啊,建議仔細讀一下。資料範圍 1 n 109 1 n 10 9 1 n 10 9,1 q 10 71 l...