这题想了很久没思路,不知道怎么不sort维护二维的最小值
emmmm原来是线段树/树状数组,一维sort,二维当成下标,维护三维的最小值
#include<bits/stdc++.h> #define fi first #define se second #define mp make_pair #define pb push_back #define pii pair<int,int> #define C 0.5772156649 #define pi acos(-1.0) #define ll long long #define mod 1000000007 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 using namespace std; const double g=10.0,eps=1e-7; const int N=100000+10,maxn=60000+10,inf=0x3f3f3f; void debug(){cout<<"fuck"<<endl;} struct pe{ int a,b,c; }s[N]; int sum[N]; void update(int i,int x) { while(i<N) { sum[i]=min(sum[i],x); i+=i&(-i); } } int query(int i) { int ans=inf; while(i>0) { ans=min(ans,sum[i]); i-=i&(-i); } return ans; } bool comp(pe x,pe y) { return x.a<y.a; } int main() { ios::sync_with_stdio(false); cin.tie(0); int t; cin>>t; while(t--) { int n; cin>>n; for(int i=1;i<=n;i++) cin>>s[i].a>>s[i].b>>s[i].c; sort(s+1,s+n+1,comp); memset(sum,inf,sizeof sum); int ans=0; for(int i=1;i<=n;i++) { if(query(s[i].b)<s[i].c)ans++; update(s[i].b,s[i].c); } cout<<n-ans<<endl; } return 0; } /******************** ********************/
#include<bits/stdc++.h> #define fi first #define se second #define mp make_pair #define pb push_back #define pii pair<int,int> #define C 0.5772156649 #define pi acos(-1.0) #define ll long long #define mod 1000000007 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 using namespace std; const double g=10.0,eps=1e-7; const int N=100000+10,maxn=60000+10,inf=0x3f3f3f; void debug(){cout<<"fuck"<<endl;} struct pe{ int a,b,c; }s[N]; int value[N<<2],res; void pushup(int rt) { value[rt]=min(value[rt<<1],value[rt<<1|1]); } void btree(int l,int r,int rt) { value[rt]=inf; if(l==r)return ; int m=(l+r)/2; btree(ls); btree(rs); } void update(int l,int r,int rt,int x,int c) { if(l==r) { value[rt]=min(value[rt],c); return ; } int m=(l+r)/2; if(x<=m)update(ls,x,c); else update(rs,x,c); pushup(rt); } void query(int l,int r,int rt,int L,int R) { if(L<=l&&r<=R) { res=min(res,value[rt]); return ; } int m=(l+r)/2; if(L<=m)query(ls,L,R); if(R>m+1) query(rs,L,R); pushup(rt); } bool comp(pe x,pe y) { return x.a<y.a; } int main() { ios::sync_with_stdio(false); cin.tie(0); int t; cin>>t; while(t--) { int n; cin>>n; for(int i=1;i<=n;i++) cin>>s[i].a>>s[i].b>>s[i].c; sort(s+1,s+n+1,comp); btree(1,n,1); int ans=0; for(int i=1;i<=n;i++) { res=inf; query(1,n,1,1,s[i].b); // cout<<res<<endl; if(res<s[i].c)ans++; update(1,n,1,s[i].b,s[i].c); } cout<<n-ans<<endl; } return 0; } /******************** 3 3 2 3 2 3 2 3 1 1 1 3 1 2 3 2 3 1 3 1 2 10 1 7 10 3 9 7 2 2 9 5 10 8 4 3 5 7 5 2 6 1 3 9 6 6 8 4 4 10 8 1 ********************/
线段树比树状数组慢