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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

POJ 2352 Stars (线段树)

發布時間:2025/3/15 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 POJ 2352 Stars (线段树) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

POJ 2352 Stars (線段樹)

手動博客搬家:本文發表于20170819 22:11:49, 原地址https://blog.csdn.net/suncongbo/article/details/77417650

URL: http://poj.org/problem?id=2352

題目大意:給定n個點(n<=15000), 每個點有坐標(x, y) (0<=x, y<=32000), 規定每個點i的level等于滿足x[j]<=x[i] && y[j]<=y[i]的點j的個數,求出level值為0, 1, 2, ..., n-1的點分別有幾個. y以升序給出, y值相等的以x升序給出。

思路分析:既然y值以升序給出,那問題就簡化成了: 給定一個數列a, 求a[1]至a[i-1]共有多少個數在[0, i]之間。
(然后統計一下即可)不難觀察到,線段樹很適合處理此類問題。
把坐標看成區間,對[0,32000]的區間建線段樹,樹中的num記錄[l, r]區間內的x的個數。
(也可對[0,maxx]區間建樹,但是要先求出maxx)每次添加新的節點,找到x應該所在的那個節點,然后沿著遞歸之路每到一個節點就num++, 直到找到為止。
每次添加之前先詢問,詢問時求出區間[0,x]所跨子區間的num值之和。
由此算出level, 然后統計即可。
時間復雜度O(n log n).

部分易錯點:

  • 線段樹區間從0開始,而不是1.
  • 線段樹的數組要開MAXN的4倍,MAXN = 32000 but not 15000
  • 代碼呈現:(Time: 188 MS; Memory: 2248 K; Code: 1452 B)

    #include<cstdio> #include<algorithm> using namespace std;const int MAXN = 32000; struct Node {int left,right,num,tag; }; int lvl[MAXN+2]; struct SegmentTree {Node nd[MAXN*4+2];void init(){for(int i=1; i<=MAXN*4; i++){nd[i].left = nd[i].right = nd[i].num = 0;}}void build(int lbound,int rbound,int pos){nd[pos].left = lbound;nd[pos].right = rbound;if(lbound==rbound) return;int mid = (lbound+rbound)/2;build(lbound,mid,2*pos);build(mid+1,rbound,2*pos+1);}void addval(int lbound,int rbound,int val,int pos){nd[pos].num++;if(lbound==rbound) return;int mid = (nd[pos].left+nd[pos].right)/2;if(val<=mid) addval(lbound,mid,val,2*pos);else addval(mid+1,rbound,val,2*pos+1);}int query(int lbound,int rbound,int pos){int mid = (nd[pos].left+nd[pos].right)/2;if(lbound==nd[pos].left && rbound==nd[pos].right) return nd[pos].num; long long ans;if(rbound<=mid) ans = query(lbound,rbound,2*pos);else if(lbound>mid) ans = query(lbound,rbound,2*pos+1);else ans = query(lbound,mid,2*pos)+query(mid+1,rbound,2*pos+1);return ans;} }; SegmentTree st; int a[MAXN+2]; int n;int main() {int q,lbound,rbound,val;char flag[5];scanf("%d",&n);st.init();st.build(0,MAXN,1); //can be both [0,MAXN] or [0,MAXX]; MAXX is the maximum value of all xfor(int i=1; i<=n; i++){int x,y;scanf("%d%d",&x,&y);lvl[st.query(0,x,1)]++; //must be [0,x]st.addval(0,MAXN,x,1);}for(int i=0; i<n; i++){printf("%d\n",lvl[i]);} return 0; } 發表于 2018-12-26 22:34 suncongbo 閱讀(...) 評論(...) 編輯 收藏 刷新評論刷新頁面返回頂部

    總結

    以上是生活随笔為你收集整理的POJ 2352 Stars (线段树)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。