51nod 1207

原创 2015年11月18日 10:26:59

#include <bits/stdc++.h>
#define rep(ii,a,b) for (int ii=(a);ii<=(b);ii++)
#define rek(ii,a,b) for (int ii=(a);ii>=(b);ii--)
using namespace std;
const int maxn=100010;
int n,m;
int len;
int fa[maxn],c[maxn][2],siz[maxn],lx[maxn],rx[maxn],maxs[maxn],sta[maxn];
int root;
void updata(int x){
    if (x==0) return;
    siz[x]=siz[c[x][0]]+siz[c[x][1]]+1;
    maxs[x]=rx[x]-lx[x]+1;
    if (c[x][0]) maxs[x]=max(maxs[x],maxs[c[x][0]]);
    if (c[x][1]) maxs[x]=max(maxs[x],maxs[c[x][1]]);
}
void link(int x,int y,int der){
    if (x!=0) c[x][der]=y;
    if (y!=0) fa[y]=x;
    updata(x);
}
void cut(int x,int y,int der){
    updata(x);
    if (x!=0) c[x][der]=0;
    if (y!=0) fa[y]=0;
    updata(x);
}
void rorate(int x){
    if (fa[x]==0) return ;
    int t=fa[x],t1=fa[fa[x]];
    int p=(c[t][1]==x);
    int p1=(c[fa[t]][1]==t);

    link(t1,x,p1);
    link(t,c[x][!p],p);
    link(x,t,!p);

    updata(t);
}
void splay(int x,int y){
    while (fa[x]!=y){
      if (fa[fa[x]]!=y){
         if ((c[fa[x]][0]==x)^(c[fa[fa[x]]][0]==fa[x])){
               rorate(x);
          }else{
             rorate(fa[x]);
         }
    }
      rorate(x);
    }
    updata(x);
    if (y==0) root=x; else updata(y);
}
int getrank(int x,int k){
    int i=x;
    int j=k;
    while (true){
        if (j==siz[c[i][0]]+1) return i;
        if (siz[c[i][0]]+1<j) {
            j-=(siz[c[i][0]]+1);
            i=c[i][1];
        } else{
            i=c[i][0];
        }
    }
}
void del(int now){
     splay(now,0);
     int i=c[now][0];
     while (c[i][1]) i=c[i][1];
     int j=c[now][1];
     while (c[j][0]) j=c[j][0];
     splay(i,0);
     splay(j,i);
     c[j][0]=0;
     updata(j);
     updata(i);
}
int getnext(int now){
    splay(now,0);
    int i=c[now][1];
    while (c[i][0]) i=c[i][0];
    return i;
}
int getlast(int now){
    splay(now,0);
    int i=c[now][0];
    while (c[i][1]) i=c[i][1];
    return i;
}
int solve(int x){
    int i=root;
    if (maxs[i]<x) return -1;
    while (i){
        if (maxs[c[i][0]]>=x && c[i][0]!=0) i=c[i][0];else {
                if (rx[i]-lx[i]+1>=x && rx[i]<=n && lx[i]>=0)
                        {
                            int ans=lx[i];
                            splay(i,0);
                            lx[i]+=x;
                            updata(i);
                            if (lx[i]>rx[i]) del(i);
                            return ans;
                        }
                i=c[i][1];
        }
    }
}
bool pd_lr(int l,int r,int ll,int rr){
    if (l>ll) {swap(l,ll);swap(r,rr);}
    if (r==ll-1) return true;
    if (r<ll) return false;
    if (l>rr) return false;
    return true;
}
void cover(int l,int r){
    int i=root,j,ans=0;
    while (i){
        if (rx[i]>=l)
        if ((ans==0)||(rx[ans]>rx[i])) ans=i;
        if (rx[i]>=l) i=c[i][0];else i=c[i][1];
    }
    int tlast=getlast(ans);
    if (lx[ans]>r+1 && rx[tlast]!=l-1) {
        len++;
        splay(ans,0);
        int j=c[root][0];
        while (c[j][1]) j=c[j][1];
        splay(j,root);
        lx[len]=l;rx[len]=r;
        updata(len);
        link(j,len,1);
        updata(root);
        return ;
    }
    int tt=0,ll=l,rr=r;
    i=ans;
    if (pd_lr(ll,rr,lx[tlast],rx[tlast])) {i=tlast;tlast=getlast(tlast);}
    while (pd_lr(ll,rr,lx[i],rx[i])){
        if (lx[i]<ll) ll=lx[i];
        if (rx[i]>rr) rr=rx[i];
        tt++;
        sta[tt]=i;
        i=getnext(i);
    }
    rep(i,1,tt) del(sta[i]);
    splay(tlast,0);
    i=c[tlast][1];
    while (c[i][0]) i=c[i][0];
    splay(i,root);
    len++;
    lx[len]=ll;rx[len]=rr;
    maxs[len]=rr-ll+1;
    siz[len]=1;
    link(i,len,0);
    updata(root);
}
int main(){
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    scanf("%d%d",&n,&m);
    len=3;
    root=1;
    lx[1]=0;rx[1]=n-1;
    lx[2]=-1;rx[2]=-2;
    lx[3]=n+4;rx[3]=n+3;
    c[root][0]=2;
    c[root][1]=3;
    fa[2]=1;fa[3]=1;
    rek(i,3,1) updata(i);
    rep(i,1,m)
     {
        int c,x,y;
        scanf("%d",&c);
        if (c==1) {
                scanf("%d",&x);
                printf("%d\n",solve(x));
        }else
        {
            scanf("%d%d",&x,&y);
            int l=x;
            int r=min(x+y-1,n);
            cover(l,r);
        }
    }
    return 0;
}

题意不说了。

很显然,这题我们可以用splay做,每个节点维护一段连续的未被占用的区间,以及所在该子树最长的区间。。。这个非常好维护。。比较蛋疼的是2操作,要把所有相关的区间提取出来求并。。然后再插入新节点。。。就是模拟而已。当然也可以用动态开节点的线段树。。不过本人抖m写了个splay

代码:


ZCMU—1207

1207: 取宝石 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 39  Solved: 9 [Submit][Status][Web ...
  • jnxxhzz
  • jnxxhzz
  • 2017年05月09日 15:24
  • 163

poj_1207

//将各个部分划分出来 就行 #include "iostream" using namespace std; int req_n(int a) {int b=0;   while(1)...
  • willpower1li
  • willpower1li
  • 2014年12月16日 01:37
  • 214

hdu1207(递推)

一、经典汉诺塔      有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子...
  • pmt123456
  • pmt123456
  • 2016年12月11日 11:20
  • 447

hdu 1207

hdu 1207 汉诺塔II 规律:a[1]=1;a[2]=a[1]+2;a[3]=a[2]+2;(2个加2^1)a[4]=a[3]+4;a[5]=a[4]+4;a[6]=a[5]+4;(3个加2^2...
  • yangzhao478970985
  • yangzhao478970985
  • 2010年06月27日 23:37
  • 407

九度OJ 1207 质因数的个数 (筛素数,勉强AC)

1 秒 内存限制:32 兆 特殊判题:否 提交:4466 解决:1375 题目描述: 求正整数N(N>1)的质因数的个数。 相同的质因数需要重复计算。如120=2*2*2*3*5,共有5...
  • wdkirchhoff
  • wdkirchhoff
  • 2014年12月10日 16:26
  • 2029

1207

#include int main() { int a,b; int i,j,k,max; int t; int x,y; while(scanf("%d%d",&a,&b)!=EOF)...
  • u012342878
  • u012342878
  • 2014年04月11日 08:11
  • 326

POJ1207-The 3n + 1 problem

转载请注明出处:優YoU http://user.qzone.qq.com/289065406/blog/1308926394 大致题意:根据给定的算法,可以计算一个整数的循环数现在给定一个区间,计算...
  • lyy289065406
  • lyy289065406
  • 2011年07月29日 01:51
  • 4431

[BZOJ1207]HNOI2004打鼹鼠|DP|LIS

蛮巧妙的,利用了和最大上升子序列相似的方法。。如果打完i鼹鼠后可以在限定时间内跑到j鼹鼠处(i #include #include #include using namespace std; int...
  • Tag_king
  • Tag_king
  • 2015年04月18日 09:54
  • 567

51Nod-1649-齐头并进

ACM模版描述题解其实这个题放在二级是有理由的,只不过有坑点而已。一开始看到这个题我很懵逼,怎么避免同时停靠在一个城市呢?如果出现这样的情况,如何绕路才是最好的方案呢?想了一会儿,才发现,想多了……根...
  • f_zyj
  • f_zyj
  • 2017年11月22日 13:19
  • 192

[莫比乌斯反演 复杂度分析] 51Nod 1222 最小公倍数计数

这么反演一通 转化为abc[暴力] HDU 4473 Exam  a 以立方根的复杂度枚举一通再讨论下就好了 既然糖老师强调复杂度分析 那就来分析分析 对于子问题  abc 复杂...
  • u014609452
  • u014609452
  • 2017年01月26日 23:15
  • 379
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:51nod 1207
举报原因:
原因补充:

(最多只允许输入30个字)