2015 Benelux Algorithm Programming Contest (BAPC 15)E - Excellent Engineers

这题想了很久没思路,不知道怎么不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;
}
/********************

********************/
BIT
#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
********************/
Segment Tree

线段树比树状数组慢

posted @ 2017-09-28 13:49  walfy  阅读(214)  评论(0编辑  收藏  举报