POJ 2481 Cows && POJ 2352 Stars(樹狀數組妙用)

來源:互聯網
上載者:User

標籤:樹狀數組

題目連結:POJ 2481 Cows

                    POJ 2352 Stars


發現這兩個題目都跟求逆序數有著異曲同工之妙,通過向樹狀數組中插入點的位置,賦值為1,或者++,然後通過求和來判斷比當前 點 ”小“ 的有多少點。


Cows需要自己排序, Stars題目已經給排好序。


POJ 2352 Stars


題目大意為在二維座標上給出一些星星的座標,求某一個星星左方,下方,左下方的星星個數。題目已經把星星按照Y座標從小到大,X從小到大排序。因此,在每次對一個星星進行統計時,之前出現過的星星,只要X座標比其小,則必在其左,下,左下方。

樹狀數組儲存X的座標。 就像 求逆序數 的方法一樣, 統計有多少之前的星星的X座標小於當前的X座標。

需要注意的是 X 座標的範圍是32000 ,所以樹狀數組要開到32000 而不是節點數15000。


【原始碼】

#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int maxn = 32010;int s[maxn];int level[maxn];int n;int lowbit(int x){return x&(-x);}int sum(int x){int ans = 0;for(int i=x;i>0;i-=lowbit(i)){ans+=s[i];}return ans;}void add(int x){for(int i=x;i<=maxn;i+=lowbit(i)){s[i]++;}}int main(){while(scanf("%d",&n)!=EOF){int a,b;memset(s,0,sizeof(s));memset(level,0,sizeof(level)); //初始化for(int i=1;i<=n;i++){scanf("%d%d",&a,&b);++a; //希望節點從1開始而不是0 ,所以++level[sum(a)]++; //直接將統計的數量當做level的下標add(a); //添加節點}for(int i=0;i<n;i++){printf("%d\n",level[i]);}}return 0;}

POJ 2481 Cows


和上一題類似的思想,不過需要手動排序。具體怎麼做只要上一題弄懂了應該很容易寫出來。

坑點在於可能出現相同的區間,在統計的時候簡單處理一下就好。


【原始碼】

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;int n;const int maxn = 100100;struct node{int st,end;int id;}cow[maxn];int s[maxn];int level[maxn];int lowbit(int x){ return x&(-x);}void add(int x){for(int i=x;i<=maxn;i+=lowbit(i))s[i]++;}int sum(int x){int ans=0;for(int i=x;i>0;i-=lowbit(i)){ans+=s[i];}return ans;}bool cmp(const node&a, const node&b){if(a.end==b.end)return a.st<b.st;return a.end>b.end;}int main(){while(scanf("%d",&n)!=EOF&&n){memset(s,0,sizeof(s));for(int i=1;i<=n;i++){scanf("%d%d",&cow[i].st,&cow[i].end);cow[i].st++; //希望節點從1開始 而不是0 ,所以++cow[i].id=i;}sort(cow+1,cow+n+1,cmp);for(int i=1;i<=n;i++){if(i>1&&cow[i].st==cow[i-1].st&&cow[i].end==cow[i-1].end){ //判重level[cow[i].id]=level[cow[i-1].id];}elselevel[cow[i].id]=sum(cow[i].st);add(cow[i].st);}for(int i=1;i<=n;i++){if(i!=1)printf(" ");printf("%d",level[i]);}puts("");}return 0;}





著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

POJ 2481 Cows && POJ 2352 Stars(樹狀數組妙用)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.