E题:
树状数组做法:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn=1e5+10;
const int inf=0x3f3f3f3f;
int T;
int n;
int c[maxn<<2];
struct node{
int x,y,z;
}e[maxn<<1];
bool cmp(node a,node b){
return a.x<b.x;
}
int lowbit(int x){return x&-x;}
void add(int x,int v){
while(x<=n+1){
c[x]=min(c[x],v);
x+=lowbit(x);
}
}
int query(int x){
int ans=inf;
while(x){
ans=min(ans,c[x]);
x-=lowbit(x);
}
return ans;
}
int main(){
// freopen("1.out","w",stdout);
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for (int i=1;i<=n;i++){
scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].z);
c[i]=inf;
}
sort(e+1,e+1+n,cmp);
int ans=0;
for (int i=1;i<=n;i++){
int minr=query(e[i].y);
if(minr>e[i].z) ans++;
add(e[i].y,e[i].z);
}
printf("%d\n",ans);
}
return 0;
}
线段树做法:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn=1e5+10;
const int inf=0x3f3f3f3f;
int T;
int n;
int Min[maxn<<2];
struct node{
int x,y,z;
}e[maxn<<1];
bool cmp(node a,node b){
return a.x<b.x;
}
void pushup(int rt){
Min[rt]=min(Min[rt<<1],Min[rt<<1|1]);
}
void build(int l,int r,int rt){
if(l==r){
Min[rt]=inf;
return ;
}
int m=(l+r)>>1;
build(l,m,rt<<1);
build(m+1,r,rt<<1|1);
pushup(rt);
}
void update(int x,int v,int l,int r,int rt){
if(l==r){
Min[rt]=min(Min[rt],v);
return ;
}
int m=(l+r)>>1;
if(x<=m) update(x,v,l,m,rt<<1);
else update(x,v,m+1,r,rt<<1|1);
pushup(rt);
}
int query(int L,int R,int l,int r,int rt){
if(L<=l && r<=R){
return Min[rt];
}
int ans=inf;
int m=(l+r)>>1;
if(L<=m) ans=min(ans,query(L,R,l,m,rt<<1));
if(R>m) ans=min(ans,query(L,R,m+1,r,rt<<1|1));
pushup(rt);
return ans;
}
int main(){
// freopen("1.out","w",stdout);
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for (int i=1;i<=n;i++){
scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].z);
}
build(1,n,1);
sort(e+1,e+1+n,cmp);
int ans=0;
for (int i=1;i<=n;i++){
int minr=query(1,e[i].y,1,n,1);
if(minr>e[i].z) ans++;
update(e[i].y,e[i].z,1,n,1);
}
printf("%d\n",ans);
}
return 0;
}
to be continue…