bzoj1178

题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1178

看ppt

http://wenku.baidu.com/link?url=dJv6LNme7syiLGM-TzbEEKXwx36JWEnI5HFrIlzfmzUXXg4HG8FDggj5WQS3EKL3k3p-sUYeJ268jCvN4t_kq2YPo3I4GXvaGulQjXrO3d7

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<fstream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<utility>
#include<set>
#include<bitset>
#include<vector>
#include<functional>
#include<deque>
#include<cctype>
#include<climits>
#include<complex>
//#include<bits/stdc++.h>适用于CF,UOJ,但不适用于poj

using namespace std;

typedef long long LL;
typedef double DB;
typedef pair<int,int> PII;
typedef complex<DB> CP;

#define mmst(a,v) memset(a,v,sizeof(a))
#define mmcy(a,b) memcpy(a,b,sizeof(a))
#define re(i,a,b)  for(i=a;i<=b;i++)
#define red(i,a,b) for(i=a;i>=b;i--)
#define fi first
#define se second
#define m_p(a,b) make_pair(a,b)
#define SF scanf
#define PF printf
#define two(k) (1<<(k))

template<class T>inline T sqr(T x){return x*x;}
template<class T>inline void upmin(T &t,T tmp){if(t>tmp)t=tmp;}
template<class T>inline void upmax(T &t,T tmp){if(t<tmp)t=tmp;}

const DB EPS=1e-9;
inline int sgn(DB x){if(abs(x)<EPS)return 0;return(x>0)?1:-1;}
const DB Pi=acos(-1.0);

inline int gint()
  {
        int res=0;bool neg=0;char z;
        for(z=getchar();z!=EOF && z!=‘-‘ && !isdigit(z);z=getchar());
        if(z==EOF)return 0;
        if(z==‘-‘){neg=1;z=getchar();}
        for(;z!=EOF && isdigit(z);res=res*10+z-‘0‘,z=getchar());
        return (neg)?-res:res;
    }
inline LL gll()
  {
      LL res=0;bool neg=0;char z;
        for(z=getchar();z!=EOF && z!=‘-‘ && !isdigit(z);z=getchar());
        if(z==EOF)return 0;
        if(z==‘-‘){neg=1;z=getchar();}
        for(;z!=EOF && isdigit(z);res=res*10+z-‘0‘,z=getchar());
        return (neg)?-res:res;
    }

const int maxN=200000;
const int maxcnt=2*maxN;
const int INF=2147483647;

int N;
struct Ta
  {
      int l,r,id;
      inline friend bool operator < (Ta x,Ta y){return x.l<y.l;}
      inline Ta(int _l=0,int _r=0,int _id=0){l=_l;r=_r;id=_id;}
    }a[maxN+100],temp[maxN+100];

int flag[maxN+100];
int ans;
PII fin[maxN+100];int tol;

int cnt,bak[maxcnt+100];

inline bool cmpr(Ta x,Ta y){return x.r<y.r;}

int tree[maxcnt+100];

int next[maxN+100];
int jump[maxN+100][31];

#define lowbit(a) (a&(-a))
inline int ask(int p)
  {
      p=cnt-p+1;
      int res=INF;
      for(;p>=1;p-=lowbit(p))upmin(res,tree[p]);
      return res;
  }
inline void update(int p,int v)
  {
      p=cnt-p+1;
      for(;p<=cnt;p+=lowbit(p))upmin(tree[p],v);
  }

PII tr[4*maxcnt+1000];
inline void down(int root,int l,int r,int mid)
  {
      if(tr[root]!=PII(0,0))
        {
            tr[root*2]=tr[root*2+1]=tr[root];
            tr[root]=PII(0,0);
        }
  }
inline void askf(int root,int l,int r,int p,int &x,int &y)
  {
      if(l>r || p<l || r<p) return;
      if(p<=l && r<=p) {x=tr[root].fi;y=tr[root].se;return;}
      int mid=(l+r)/2;
      down(root,l,r,mid);
      if(p<=mid) askf(root*2,l,mid,p,x,y); else askf(root*2+1,mid+1,r,p,x,y);
  }
inline void updatef(int root,int l,int r,int x,int y,PII val)
  {
      if(l>r || x>y || r<x || y<l)return;
      if(x<=l && r<=y){tr[root]=val;return;}
      int mid=(l+r)/2;
      down(root,l,r,mid);
      updatef(root*2,l,mid,x,y,val);
      updatef(root*2+1,mid+1,r,x,y,val);
  }

inline int solve(int x,int y)
  {
      if(x>y)return 0;
      int res=0,i,p=lower_bound(a+1,a+N+1,Ta(x,0,0))-a;
      if(p>N)return 0;
      red(i,30,0)
          if(jump[p][i]!=0 && a[jump[p][i]].r<=y)
            {
                res+=two(i);
                p=jump[p][i];
            }
        if(a[p].r<=y)res++;
        return res;
  }
inline int check(int x,int y,int l,int r)
  {
      int t1=solve(x,y);
      int t2=solve(x,l-1);
      int t3=solve(r+1,y);
      return solve(x,y)==solve(x,l-1)+1+solve(r+1,y);
  }

int main()
  {
      freopen("bzoj1178.in","r",stdin);
      freopen("bzoj1178.out","w",stdout);
        int i,j;
        N=gint();
        re(i,1,N)a[i].l=gint(),a[i].r=gint(),a[i].id=i;
        re(i,1,N)bak[++cnt]=a[i].l,bak[++cnt]=a[i].r;
        sort(bak+1,bak+cnt+1);
        cnt=unique(bak+1,bak+cnt+1)-bak-1;
        re(i,1,N)a[i].l=lower_bound(bak+1,bak+cnt+1,a[i].l)-bak,a[i].r=lower_bound(bak+1,bak+cnt+1,a[i].r)-bak;
        re(i,1,N)fin[a[i].id]=PII(a[i].l,a[i].r);
        tol=N;
        sort(a+1,a+N+1,cmpr);
        int t=0;
        re(i,1,N){if(a[i].l<=t)flag[i]=1;upmax(t,a[i].l);}
        int ge=0;
        re(i,1,N)if(!flag[i])temp[++ge]=a[i];
        N=ge;
        re(i,1,N)a[i]=temp[i];
        t=0;
        re(i,1,N)if(t<a[i].l){ans++;t=a[i].r;}
        cout<<ans<<endl;
        re(i,1,cnt)tree[i]=INF;
        red(i,N,1)
          {
              next[i]=ask(a[i].r+1);if(next[i]==INF) next[i]=0;
              update(a[i].l,i);
          }
        red(i,N,1)
          {
              jump[i][0]=next[i];
              re(j,1,30)jump[i][j]=jump[jump[i][j-1]][j-1];
          }
        re(i,1,4*maxcnt+1000-1)tr[i]=PII(1,cnt);
        re(i,1,tol)
          {
              int l=fin[i].fi,r=fin[i].se,x,y;
              askf(1,1,cnt,l,x,y);
              if(x==-1 && y==-1)continue;
              if(!(x<=l && r<=y))continue;
              if(check(x,y,l,r))
                {
                    printf("%d ",i);
                    ans--;if(ans==0)break;
                    updatef(1,1,cnt,l,r,PII(-1,-1));
                    updatef(1,1,cnt,x,l-1,PII(x,l-1));
                    updatef(1,1,cnt,r+1,y,PII(r+1,y));
                }
          }
        printf("\n");
        return 0;
  }

时间: 2024-08-04 00:19:58

bzoj1178的相关文章

BZOJ1178 [Apio2009]CONVENTION会议中心 贪心 set

欢迎访问~原文出处--博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1178 题意概括 一堆线段,现在取出最多条数,并输出字典序最小的方案. 题解 这题好坑. 首先,注意一点,最后不能有多余的空格. 第一问就是基础的线段覆盖. 关键在于第二问. 我们要准备一个函数-- Get_Ans(L,R),用来求解L~R这个区间内,最多可以取多少线段. 这个可以O(log n)解决.前提是倍增预处理. 然后就是关键部分. 我们按照字典序从小到大,能选择就选择. 怎么判断是否可以

[BZOJ1177][BZOJ1178][BZOJ1179]APIO2009解题报告

抱着好奇心态去开始做APIO的往年试题感受一下难度 Oil Description 采油区域 Siruseri政府决定将石油资源丰富的Navalur省的土地拍卖给私人承包商以建立油井.被拍卖的整块土地为一个矩形区域,被划分为M×N个小块. Siruseri地质调查局有关于Navalur土地石油储量的估测数据.这些数据表示为M×N个非负整数,即对每一小块土地石油储量的估计值. 为了避免出现垄断,政府规定每一个承包商只能承包一个由K×K块相连的土地构成的正方形区域. AoE石油联合公司由三个承包商组

【BZOJ-1178】CONVENTION会议中心 倍增 + set (神思路好题!)

1178: [Apio2009]CONVENTION会议中心 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 812  Solved: 323[Submit][Status][Discuss] Description Siruseri政府建造了一座新的会议中心.许多公司对租借会议中心的会堂很感兴趣,他们希望能够在里面举行会议. 对于一个客户而言,仅当在开会时能够独自占用整个会堂,他才会租借会堂.会议中心的销售主管认为:最好的策略应该是将会堂租借给尽

【bzoj1178】 Apio2009—CONVENTION会议中心

http://www.lydsy.com/JudgeOnline/problem.php?id=1178 (题目链接) 题意 给出n个区间,问在区间两两不相交的情况下最多能选出多少区间,并输出字典序最小的方案. Solution 考试看错题,,还有60分.. 很巧妙的一道题. 代码 #include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cs