農夫約翰的牛發現,他的田地裡沿著山脊生長的三葉草(我們可以將其視為一維數字線)特別好。農夫約翰有n頭母牛(我們將母牛的編號從1到n)。每位農夫約翰的n頭母牛都有她特別喜歡的三葉草範圍(這些範圍可能重疊)。範圍由閉合間隔[s,e]定義。
但是有些母牛很強壯,有些卻很弱。給定兩個母牛:母牛i和母牛j,它們最喜歡的三葉草範圍是[si,ei]和[sj,ej]。如果si <= sj並且ej <= ei並且ei-si> ej-sj,我們說母牛i比母牛j強。
對於每頭母牛,有幾頭母牛比她強?農夫約翰需要您的幫助!
輸入包含多個測試用例。
對於每個測試用例,第一行是整數n(1 <= n <= 10 ^ 5),它是母牛的數量。然後是n行,其第i行包含兩個整數:s和e(0 <= s
輸入的末尾包含單個0。
對於每個測試用例,輸出一行包含n個以空格分隔的整數,其中第i個數字指定比母牛i強的母牛的數量。
31 20 3
3 40
1 0 0huge input and output,scanf and printf is recommended.
給你一些區間,對每個區間進行詢問,查詢所有區間中能包含當前區間的個數。二維偏序問題,我們可以對區間按照 s 從小到大排序,s相等則按照 e 從大到小排序。這樣可以使得後面的區間的起點一定大於前面的,因此我們就不用考慮s了,只需要考慮e就行了。
之後我們維護乙個樹狀陣列記錄一段區間內小於當前e的區間個數,然後我們求出已經插入所有的區間個數,減去小於的,剩下的就是大於等於當前e的區間個數。
不過這個題有個trick,就是區間相同的情況,這裡我們可以記錄下來有多少個相同的,直接一次插入完。
#include#include#include#include#include#include#include#include#include#include#include#define pi atan(1.0)*4
#define e 2.718281828
#define rp(i,s,t) for (i = (s); i <= (t); i++)
#define rp(i,s,t) for (i = (t); i >= (s); i--)
#define ll long long
#define ull unsigned long long
#define mst(a,b) memset(a,b,sizeof(a))
#define push_back() pb()
#define fastin \
ios_base::sync_with_stdio(0); \
cin.tie(0);
using namespace std;
inline int read()
while(c>='0'&&c<='9')
return a*b;
}inline void write(int n)
if(n>=10)
write(n/10);
putchar(n%10+'0');
}const int n = 1e5+7;
int c[n+2],res[n+2],n;
//維護樹狀陣列c為一段區間內的小於當前e的區間個數
//res陣列記錄詢問的結果
struct node
return res;
}int main()
rp(i,1,n-1) printf("%d ",res[i]);
printf("%d\n",res[n]);
}return 0;
}
poj 2481(樹狀陣列)
這題樹狀陣列明顯可解,不解釋,但是注意有相同的奶牛的處理 include include include include define n 100005 using namespace std int c n tem struct dian d n int cmp dian a,dian b int...
poj 2481 樹狀陣列
解法2 按si值做降序排序後,相當於求每個位置i左邊大於等於e i 的個數 樹狀陣列更新節點的路徑和求和的路徑要改變,getsum i 相當於求i i 1 maxn include include using namespace std const int maxn 100010 int sum m...
POJ2481 樹狀陣列
題意 給n個節點的s和e,求對於每個節點,其他節點和它的關係滿足si sj and ej ei and ei si ej sj 的個數 題解 由於e的關係遞減,s的關係遞增,因此可以先對e排序,然後利用樹狀陣列更新並查詢每個sj在其之前的si的個數就是問題的解 include include inc...