學(xué)樹狀數(shù)組的話,可以看英文的和中文的(中文的很多啊,可以自己搜,只不過我覺得這篇比較好)
后來看到有些blog(這個鏈接以前弄錯了,在此表示不好意思)寫到2352是入門題。
表示我一開始不會寫,后來是看了人家的思路才寫出來的-_-.
用樹狀數(shù)組,不用管y坐標(因為已經(jīng)是升序,后邊的星星不影響前邊星星的等級),用level(n)來統(tǒng)計x坐標為n以前的星星個數(shù),但是千萬注意樹狀數(shù)組需要數(shù)組以1為首項,由于坐標有0,所以每次需要給x坐標+1(因為出現(xiàn)0會死循環(huán))




還有一點就是那篇英文的介紹里面有點小錯誤,就是scale的第一個函數(shù)中,調(diào)用update時參數(shù)傳反了
#include <iostream>
using namespace std;
int tree[32006];
int level[32006];
int n;
void update(int idx)//更新,因為所有的都只會增加1,所以只用傳一個參數(shù)就行了
{
       
while(idx <= 32006)
          {
              tree[idx]
++;
              idx 
+= (idx & (-idx));
          }
}
int read(int idx)
{
//求一段數(shù)組的和
      int sum = 0;
      
while(idx > 0)
        {
            sum 
+= tree[idx];
            idx 
-= (idx & (-idx));
        }
      
return sum;
}
int main(void)
{
      freopen(
"2352.in","r",stdin);
      freopen(
"2352.out","w",stdout);
      
int x,y;
      scanf(
"%d",&n);
      memset(tree,
0,sizeof(tree));
      memset(level,
0,sizeof(level));
      
for(int i = 0;i < n;i++)
        {
            scanf(
"%d%d",&x,&y);
            x
++;//防止出現(xiàn)下標0
            level[read(x)]++;//先得到改點的level值
            update(x);//更新以x為下標的tree數(shù)組值
        }
      
for(int i = 0;i < n;i++)
        {
            printf(
"%d\n",level[i]);//不用減1  因為我是先求在更新的
        }
    
return 0;
}