這下他慘了,程式碼全部被刪除了,又沒有存檔,於是他回到ZeroJudge,想要繼續刷題目。看到他一回來,所有寫程式的人便都看著他笑,有的叫道,「雨天(角色名),你怎麼又忘記存檔了!」他不回答,對CXXT GPT說,「給我一份完整的程式碼。」他們又故意的高聲嚷道,「你一定又抄AI的程式了!」雨天睜大眼睛說,「你怎麼這樣憑空汙人清白……」「什麼清白?我前天親眼見你抄,還訂閱CXXT Plus。」攗皥蒽便漲紅了臉,額上的青筋條條綻出,爭辯道,「借鑒不能算抄……抄!…… 工程師的事,能算抄嗎?」接連便是難懂的話,什麼「怎麼又TLE」,什麼「Binary Index Tree 加上 Binary search 好麻煩」之類的,引得眾人都哄笑起來:討論區內外充滿了快活的空氣。
註!!:本人沒借鑑 真的
用Binary Index Tree(BIT) 儲存 BIT [ i ] 儲存 i - i&-i 到 i 的總和 有點像 prefix
再用 二分搜找到符合的最小值
雖然很長但寫完很有成就感喔
底下附程式碼(反白)
#include<bits/stdc++.h>
using namespace std;
vector<long long> c(1,0), f(1,0);
int n;
long long query(int id){
long long sum=0;
while(id>0){
sum+=f[id];
id-=(id&-id);
}
return sum;
}
void binary_search(int l, int r, int g){
if(query(r)<g&&r==n){
cout<<"meh"<<endl;
return;
}
if(query(l)>=g&&l==1){
cout<<l<<endl;
return;
}
if(r==l+1){
cout<<r<<endl;
return;
}
int mid=(r+l)/2;
if(query(mid)>=g) binary_search(l, mid, g);
else binary_search(mid, r, g);
}
void change(int id, int m){
int C=m-c[id];
c[id]=m;
while(id<=n){
f[id]+=C;
id+=(id&-id);
}
}
void index(int id, int m){
while(id<=n){
f[id]+=m;
id+=(id&-id);
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int m, d, t, g;
cin>>n>>m;
for(int i=1; i<=n; i++){
cin>>d;
c.push_back(d);
f.push_back(0);
}
for(int i=1; i<=n; i++) index(i, c[i]);
for(int i=1; i<=m; i++){
cin>>t;
if(t==2){
cin>>g;
binary_search(1, n, g);
}
else{
cin>>t>>g;
change(t, g);
}
}
return 0;
}