Loj 10115 「一本通 4.1 例 3」校门外的树 (树状数组)
題目鏈接:https://loj.ac/problem/10115
題目描述
原題來(lái)自:Vijos P1448
校門(mén)外有很多樹(shù),學(xué)校決定在某個(gè)時(shí)刻在某一段種上一種樹(shù),保證任一時(shí)刻不會(huì)出現(xiàn)兩段相同種類的樹(shù),現(xiàn)有兩種操作:
- K=1,讀入l,r 表示在l? 到 r 之間種上一種樹(shù),每次操作種的樹(shù)的種類都不同;
- K=2,讀入 l,r 表示詢問(wèn) l 到 r 之間有多少種樹(shù)。
注意:每個(gè)位置都可以重復(fù)種樹(shù)。
輸入格式
第一行??表示道路總長(zhǎng)為 n,共有? m個(gè)操作;
接下來(lái) m 行為 m 個(gè)操作。
輸出格式
對(duì)于每個(gè) K=2 輸出一個(gè)答案。
樣例
樣例輸入
5 4 1 1 3 2 2 5 1 2 4 2 3 5樣例輸出
1 2?
解題思路:開(kāi)始怎么想都不知道怎么維護(hù)不同段中樹(shù)的種類是否相同的情況,感覺(jué)這題有個(gè)思維技巧還是挺難想的,就是我們要開(kāi)兩個(gè)數(shù)組,sum1分別維護(hù)左端點(diǎn)的數(shù)目,另一個(gè)數(shù)組sum2維護(hù)右端點(diǎn)的數(shù)目。這樣區(qū)間[l,r]的樹(shù)的種類的數(shù)目就是1-r中左端點(diǎn)的數(shù)目減去1-(l-1)中右端點(diǎn)的數(shù)目,即表示為sum1[r]-sum2[l-1]。
如圖假如我們第一次在區(qū)間a[2,6]種上一種樹(shù),然后再在區(qū)間b[5,10]種上一種樹(shù),這時(shí)我們要統(tǒng)計(jì)區(qū)間c[8,12]中樹(shù)的種類數(shù)目,我們就統(tǒng)計(jì)[1,12]中左端點(diǎn)的數(shù)目即 sum1[12]等于2,說(shuō)明有兩種樹(shù)可能在給定區(qū)間內(nèi),然后我們?cè)偾髤^(qū)間[1,7]中右端點(diǎn)的數(shù)目即sum2[7-1]=1,表示有一種樹(shù)完全在給定區(qū)間左邊,并不是我們要求的,所以減去就好了,所以答案就為sum1[12]-sum2[7-1]了。
代碼:
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<map> #include<algorithm> #include<queue> #define mod 1000000007 using namespace std; typedef long long ll; const int maxn=5e4+10; int n,m,k,l,r,sum1[maxn],sum2[maxn]; //sum1[i]表示的是區(qū)間[1,i]中左端點(diǎn)的數(shù)目,sum2[i]表示的是區(qū)間[1,i]右端點(diǎn)的數(shù)目; int lowbit(int x){return x&(-x);} void update1(int x,int val){ //更新左端點(diǎn)的數(shù)目 while(x<=maxn){sum1[x]+=val;x+=lowbit(x);} } void update2(int x,int val){ //更新右端點(diǎn)的數(shù)目 while(x<=maxn){sum2[x]+=val;x+=lowbit(x);} } int ask1(int x){ //查找區(qū)間[1,x]中左端點(diǎn)的數(shù)目 int res=0;while(x){res+=sum1[x];x-=lowbit(x);}return res; } int ask2(int x){ //查找區(qū)間[1,x]中右端點(diǎn)的數(shù)目 int res=0;while(x){res+=sum2[x];x-=lowbit(x);}return res; } int main(){cin>>n>>m;while(m--){cin>>k>>l>>r;if(k==1){update1(l,1); update2(r,1);}else{cout<<ask1(r)-ask2(l-1)<<endl;}}return 0; }?
轉(zhuǎn)載于:https://www.cnblogs.com/zjl192628928/p/10630450.html
總結(jié)
以上是生活随笔為你收集整理的Loj 10115 「一本通 4.1 例 3」校门外的树 (树状数组)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python的内存分配
- 下一篇: 《微软的梦工场》 笔记(1)