戳這裡
隨便來個資料結構直接模擬,但是操作量達到了 \(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...