• POJ 2528 Mayor's posters


    傻逼线段树。。一开始内存开小了。

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<algorithm>
    #define maxn 50500
    using namespace std;
    int t,n,tot=0,root,x[maxn],y[maxn],ans=0,hash[maxn],cnt=0,len=0;
    bool vis[maxn];
    int ls[maxn<<2],rs[maxn<<2],lazy[maxn<<2];
    void build(int &now,int left,int right)
    {
        now=++tot;
        if (left==right) return;
        int mid=(left+right)>>1;
        build(ls[now],left,mid);
        build(rs[now],mid+1,right);
        return;
    }
    void modify(int now,int left,int right,int l,int r,int x)
    {
        if ((left==l) && (right==r))
        {
            lazy[now]=max(lazy[now],x);
            return;
        }
        int mid=(left+right)>>1;
        if (r<=mid) modify(ls[now],left,mid,l,r,x);
        else if (l>=mid+1) modify(rs[now],mid+1,right,l,r,x);
        else
        {
            modify(ls[now],left,mid,l,mid,x);
            modify(rs[now],mid+1,right,mid+1,r,x);
        }
        return;
    }
    int ask(int now,int left,int right,int pos)
    {
        if ((left==right) && (left==pos))
            return lazy[now];
        int mid=(left+right)>>1;
        if (pos<=mid) return max(ask(ls[now],left,mid,pos),lazy[now]);
        else return max(ask(rs[now],mid+1,right,pos),lazy[now]);
    }
    void work()
    {
        memset(vis,false,sizeof(vis));
        memset(lazy,0,sizeof(lazy));
        cnt=0;tot=0;len=0;ans=0;
        scanf("%d",&n);
        for (int i=1;i<=n;i++)
        {
            scanf("%d%d",&x[i],&y[i]);
            hash[++cnt]=x[i];hash[++cnt]=y[i];
        }
        sort(hash+1,hash+cnt+1);
        len=unique(hash+1,hash+cnt+1)-hash-1;
        build(root,1,len);
        for (int i=1;i<=n;i++)
        {
            int l=lower_bound(hash+1,hash+len+1,x[i])-hash;
            int r=lower_bound(hash+1,hash+len+1,y[i])-hash;
            modify(root,1,len,l,r,i);
        }
        for (int i=1;i<=len;i++)
            vis[ask(root,1,len,i)]=true;
        for (int i=1;i<=n;i++)
            if (vis[i])
                ans++;
        printf("%d
    ",ans);
    }
    int main()
    {
        scanf("%d",&t);
        for (int i=1;i<=t;i++)
            work();
        return 0;
    }
  • 相关阅读:
    ORA01102 cannot mount database in EXCLUSIVE mode
    VC中cl.exe命令参数详解
    (转)LIB和DLL的区别与使用
    (转)DOS循环:bat/批处理for命令详解之一 (史上虽详尽的总结和说明~~)
    常用Win IDE库函数
    (转)Windows下多媒体计时器使用举例
    (转)C++进阶必读书籍
    (转)sql 行专列 列转行 普通行列转换
    VLFeat(1)——SIFT图像特征提取(VC++实现)
    (转)SIFT算法研究
  • 原文地址:https://www.cnblogs.com/ziliuziliu/p/5650755.html
Copyright © 2020-2023  润新知