二维偏序关系 只要有一个值比对方大就算
#include <bits/stdc++.h> #define PI acos(-1.0) #define mem(a,b) memset((a),b,sizeof(a)) #define TS printf("!!! ") #define pb push_back //std::ios::sync_with_stdio(false); using namespace std; //priority_queue<int,vector<int>,greater<int>> que; const double EPS = 1.0e-8; typedef pair<int, int> pairint; typedef long long ll; typedef unsigned long long ull; const int maxn = 1e5 + 100; const int maxm = 300; //next_permutation //priority_queue<int, vector<int>, greater<int>> que; int ans[maxn]; int counter[10000005]; struct node { int cf, num, tp; } person[maxn]; int n, m, i, num[10000001], t[20000001], l, r; //num:原数组;t:树状数组 int lowbit(int x) { return x & (-x); //右起第一个1的位置为第k个 返回值则为2^(k-1) } void update(int x, int p) //更新第x 的值 { while (x <= 2000000) { t[x] += p; x += lowbit(x); //不断找到自己的祖先 更新值 } return; } int sum(int k)//前k个数的和 { int ans = 0; while (k > 0) { ans += t[k]; k -= lowbit(k); } return ans; } int ask(int l, int r) //求l-r区间和 { if (r < l) { return 0; } return sum(r) - sum(l - 1); } bool cmp(node a, node b) { if (a.cf == b.cf) { return a.tp > b.tp; } return a.cf < b.cf; } void pf() { for (int i = 1; i <= n; i++) { cout << person[i].cf << " " << person[i].tp << " " << person[i].num << endl; } } int main() { cin >> n ; for (int i = 1; i <= n; i++) { scanf("%d %d", &person[i].cf, &person[i].tp); counter[person[i].cf]++; person[i].num = i; } sort(person + 1, person + 1 + n, cmp); //pf(); //cout << endl; for (int i = n; i >= 1; i--) { int cur = person[i].tp; int number = person[i].num; update(cur, 1); int x = ask(1, cur - 1); // cout << "x:" << x << endl; // cout << "cf:" << person[i].cf << " " << counter[person[i].cf] << endl; ans[number] = i + x - counter[person[i].cf]; counter[person[i].cf]--; } for (int i = 1; i <= n; i++) { cout << ans[i] << endl; } // cin>>n>>m; // for(i=1;i<=n;i++) // { // cin>>num[i]; // update(i,num[i]); // } // for(i=1;i<=m;i++) // { // cin>>l>>r; // cout<<ask(l,r)<<endl; // } return 0; }