日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

千万别用树套树(线段树)

發(fā)布時間:2023/12/15 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 千万别用树套树(线段树) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.



對于每個線段,我們對于L和R分別統(tǒng)計它作為左端點和右端點有多少個線段。對于2操作,我們用線段總數(shù),減去不符合的線段。不符合的線段就是左端點大于l或者右端點小于r的線段。因為ri-li<=2,所以不會出現(xiàn)那種l<=pl&&pr<=r的情況(這種情況減了兩遍)
代碼如下:

#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e5+10; int n,q,s1[4*N],s2[4*N]; void up(int l,int r,int id,int x,int tp[]) {if(l==r) {tp[id]++;return ;}int m=(l+r)/2;if(x<=m) up(l,m,2*id,x,tp);else up(m+1,r,2*id+1,x,tp);tp[id]=tp[2*id]+tp[2*id+1]; }int qy(int l,int r,int ql,int qr,int id,int tp[]) {if(ql>qr) return 0;if(ql<=l&&qr>=r) return tp[id];int m=(l+r)/2,res=0;if(ql<=m) res+=qy(l,m,ql,qr,2*id,tp);if(qr>m) res+=qy(m+1,r,ql,qr,2*id+1,tp);return res; }int main() {while(scanf("%d%d",&n,&q)!=EOF) {memset(s1,0,sizeof(s1));memset(s2,0,sizeof(s2));int cnt=0;while(q--) {int op,l,r;scanf("%d%d%d",&op,&l,&r);if(op==1) {cnt++,up(1,n,1,l,s1),up(1,n,1,r,s2);}else printf("%d\n",cnt-qy(1,n,l+1,n,1,s1)-qy(1,n,1,r-1,1,s2));}}return 0; }

努力加油a啊,(o)/~

總結(jié)

以上是生活随笔為你收集整理的千万别用树套树(线段树)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。