Arduino IDE 搭建 ESP8266 開發環境及專案演示
阿新 • • 發佈:2021-07-12
0x00 前言
(我說我在快睡著的情況下寫了個這你信嗎
0x01 區間查詢
#include<bits/stdc++.h> #define int long long//跟同機房大佬學到的,懶到無可救藥時可以寫寫,考試時千萬別 using namespace std; const int N=5000100; int n,m; int tree[N]; int read(){ int x=0,y=1; char c=getchar(); while(c<'0'||c>'9'){ if(c=='-') y=-1; c=getchar(); } while(c>='0'&&c<='9'){ x=x*10+c-'0'; c=getchar(); } return x*y; } int lowbit(int x){ return x&-x; } void add(int x,int y){ while(x<=n){ tree[x]+=y; x+=lowbit(x); } } int sum(int x){ int ans=0; while(x!=0){ ans+=tree[x]; x-=lowbit(x); } return ans; } signed main(){ n=read(); m=read(); for(int i=1;i<=n;i++){ int a; a=read(); add(i,a); } for(int i=1;i<=m;i++){ int a,b,c; a=read(); b=read(); c=read(); if(a==1) add(b,c); else printf("%d\n",sum(c)-sum(b-1)); } return 0; }
這也是\(P3374\)的正解
0x02 單點查詢
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=10000010; ll n,m,q,x,y,k; ll sig[N],tree[N]; ll read(){ ll x=0,y=1; char c=getchar(); while(c<'0'||c>'9'){ if(c=='-') y=-1; c=getchar(); } while(c>='0'&&c<='9'){ x=x*10+c-'0'; c=getchar(); } return x*y; } ll lowbit(ll num){ return num&-num; } void add(ll k,ll num){ for(ll i=k;i<=n;i+=lowbit(i)) tree[i]+=num; } ll ask(ll k){ ll ans=0; for(ll i=k;i>=1;i-=lowbit(i)) ans+=tree[i]; return ans; } int main(){ n=read(); m=read(); for(int i=1;i<=n;i++) sig[i]=read(); for(int i=1;i<=m;i++){ q=read(); if(q==1){ x=read(); y=read(); k=read(); add(x,k); add(y+1,-k); } if(q==2){ x=read(); printf("%lld\n",sig[x]+ask(x)); } } return 0; }
這也是\(P3368\)的正解