樹狀陣列 數星星 #10114. 「一本通 4.1 例 2」數星星 Stars Ural 1028
阿新 • • 發佈:2018-12-18
其實是道巧妙的題,如果你想到了的話。。。
每一顆星星需要統計它的左下方的星星個數。
我們發現題目是按照縱座標從小到大輸入的,對於相同的縱座標是按照橫座標從小到大輸入。
也就是說,我們可以不管縱座標,按照它給出的橫座標依次插入,並統計當前星星之前的橫座標小於它的星星個數。
#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #define N 15006 #define X 32006 using namespace std; inline int wread(){ char c(getchar ());int wans(0),flag(1); while (c<'0' || c>'9'){if (c=='-') flag=-1;c=getchar ();} while (c>='0' && c<='9'){wans=wans*10+c-'0';c=getchar ();} return wans*=flag; } inline void OUT (int x){ if (x>9) OUT (x/10); putchar (x%10+'0'); } inline void init (){ freopen (" ","r",stdin); freopen (" ","w",stdout); } int n; int s[X]; int pr[N]; inline int lowbit (int x){return x&(-x);} inline void add (int pos){ while (pos<=X-5){ s[pos] += 1; pos += lowbit (pos); } } inline int fnd (int pos){ int res(0); while (pos>=1){ res += s[pos]; pos -= lowbit (pos); } return res; } int main (){ // init (); n=wread(); for (int i(1);i<=n;++i){ int x(wread()),y(wread()); x++; pr[fnd (x)]++; add(x); } for (int i(0);i<n;++i){ printf("%d\n",pr[i]); } return 0; }