- 题意: 每个物品有两个参数(x,y),问xi>xj且yi>yj成立的j有多少个.
- 思路: 二维偏序,先对x进行排序,对y离散化,从后到前循环,对点i,树状数组求当前有多少个y比y_i小的,若小于n-i,则说明后面存在y比他大的,且后面的一定x比他大,所以当前这个点能贡献一次答案,然后再在y_i添加一次树状数组
#include<cstring>
#include<cstdio>
#include<queue>
#include<iostream>
#include<algorithm>
#define ll long long
#define pii pair<int,int>
using namespace std;
const int inf = 0x3f3f3f3f;
const int N = 1e5+10;
struct node{
int x,y;
}a[N];
int n,w[N];
struct bit{
int a[N];
void update(int x,int pos){
for(int i=pos;i<=n;i+=i&(-i))
a[i] += x;
}
int sum(int pos){
int res = 0;
for(int i=pos;i;i-=i&(-i))
res += a[i];
return res;
}
int query(int l,int r){
return sum(r) - sum(l-1);
}
}bt;
int cmp(node a,node b){
return a.x < b.x;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;++i) scanf("%d%d",&a[i].x,&a[i].y),w[i] = a[i].y;
sort(w+1,w+1+n);
int t = unique(w+1,w+1+n)-w-1;
for(int i=1;i<=n;++i){
a[i].y = lower_bound(w+1,w+t+1,a[i].y) - w;
}
sort(a+1,a+1+n,cmp);
int ans = 0;
for(int i=n;i>=1;--i){
int d = bt.sum(a[i].y);
if(n-i-d!=0) ans++;
bt.update(1,a[i].y);
}
printf("%d\n",ans);
return 0;
}
题目
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义