#include<cstdio>
#include<algorithm>
#include<cstring>
#define N 400000
using namespace std;
];
],cnt,n,m,x,y,k,rson[],sum[];
bool cmp(node a,node b)
{
  return a.x<b.x;
}
void update(int st,int ed,int x,int &y,int v)
{
  //printf("%d %d %d %d\n",st,ed,x,y);
  ;y=++cnt;sum[y]=sum[x]+;
  if(st==ed)return;
  lson[y]=lson[x];rson[y]=rson[x];
  if(v<=mid)
  {
    update(st,mid,lson[x],lson[y],v);
  }else
  {
    update(mid+,ed,rson[x],rson[y],v);
  }
}
int query(int x,int y,int rk)
{
  ,r=n,a=root[x-],b=root[y];
  while(l<r)
  {
    ;
    int tmp=sum[lson[b]]-sum[lson[a]];
    if(tmp>=rk)r=mid,a=lson[a],b=lson[b];
    ,a=rson[a],b=rson[b];
  }
  return l;
}
int main()
{
  scanf("%d%d",&n,&m);
  ;i<=n;i++)scanf("%d",&a[i]),b[i].x=a[i],b[i].h=i;
  sort(b+,b+n+,cmp);].x,rank=;
  ;i<=n;i++)if(b[i].x==now)a[b[i].h]=rank;else
  now=b[i].x,rank++,a[b[i].h]=rank;
  memset(root,,sizeof(root));
  ;i<=n;i++)
  {
    update(,n,root[i-],root[i],a[i]);
  }
  ;i<=m;i++)
  {
    scanf("%d%d%d",&x,&y,&k);
    int last=query(x,y,k);printf("%d\n",last);
  }
}

以上是罗oj的模板题,这里输出的答案没有离散回去还有点问题。。先不要交到poj上

下面可以先尝试着用主席树写一下[bzoj2161]。。。虽然ppt的题解上是扔到平衡树里搞?

暑期主席树小专题

要做的事情多着呢。

A:也是一个模(mu)板题,不多说。

B:count on a tree,强制在线,以前就做过了。这里感觉只有query()需要注意一下的。

#include<cstdio>
#include<algorithm>
#define M 2000005
#define N 200005
using namespace std;
int n,m,cnt,size,tot,last,k,edgenum;
],num[N],pos[N],hash[N],root[N],ls[M],rs[M],sum[M],deep[N],head[N],vet[N],next[N],fa[N][];
];
bool cmp(node a,node b)
{
    return a.x<b.x;
}
void add(int u,int v)
{
    edgenum++;vet[edgenum]=v;next[edgenum]=head[u];head[u]=edgenum;
}
void update(int st,int ed,int x,int &y,int nb)
{
    //printf("%d %d %d %d\n",st,ed,x,y);
    y=++size;sum[y]=sum[x]+;if(st==ed)return;
    ls[y]=ls[x];rs[y]=rs[x];
    ;
    if(nb<=mid)update(st,mid,ls[x],ls[y],nb);
    ,ed,rs[x],rs[y],nb);
}
int lca(int x,int y)
{
    if(deep[x]<deep[y])swap(x,y);
    int t=deep[x]-deep[y];
    ;i<=;i++)<<i)&t)x=fa[x][i];
    ;i>=;i--)if(fa[x][i]!=fa[y][i])
     x=fa[x][i],y=fa[y][i];
    ];
}
int query(int x,int y,int rk)
{
    ];
    a=root[pos[a]],b=root[pos[b]],c=root[pos[c]],d=root[pos[d]];
    ,r=tot;
    while(l<r)
    {
        ;
        int tmp=sum[ls[a]]+sum[ls[b]]-sum[ls[c]]-sum[ls[d]];
        if(tmp>=rk)r=mid,a=ls[a],b=ls[b],c=ls[c],d=ls[d];
        ,a=rs[a],b=rs[b],c=rs[c],d=rs[d];
    }
    return hash[l];
}
void dfs(int u)
{
    num[++cnt]=u,pos[u]=cnt;
    ;i<=;i++)
     <<i)<=deep[u])fa[u][i]=fa[fa[u][i-]][i-];
     else break;
    int e=head[u];
    )
    {
        int v=vet[e];
        ])
        {
            deep[v]=deep[u]+;
            fa[v][]=u;dfs(v);
        }
        e=next[e];
    }
}
int main()
{
    scanf("%d%d",&n,&m);
    ;i<=n;i++)scanf("%d",&a[i]),bx[i].x=a[i],bx[i].h=i;
    sort(bx+,bx+n+,cmp);
    ,now=bx[].x;tot++;hash[tot]=now;
    ;i<=n;i++)
    {
        if(bx[i].x==now)a[bx[i].h]=rank;
        else
        {
            rank++;now=bx[i].x;a[bx[i].h]=rank;
            tot++;hash[tot]=now;
        }
    }
    int x,y;
    ;i<=n-;i++)
    {
        scanf("%d%d",&x,&y);
        add(x,y);add(y,x);
    }
    cnt=;dfs();
    ;i<=n;i++)
    {
        int t=num[i];
        update(,tot,root[pos[fa[t][]]],root[i],a[t]);
    }
    ;i<=m;i++)
    {
        scanf("%d%d%d",&x,&y,&k);
        x=x^last;last=query(x,y,k);
        printf("%d",last);if(i!=m)printf("\n");
    }
}

bzoj2588

C:count on a treeⅡ,八中oj上面基本上都被卡了,又没有很多std供我在hdu上测试。。。就算啦(懒人就是这样,AC无望的题连学都不想学惹

E:也蛮简单的,然而写了一下午。

#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 400000
using namespace std;
;
],root[N],rson[],sum[];
],back[];
struct node{
  int x,h;
}b[];
bool cmp(node a,node b)
{
  return a.x<b.x;
}
void update(int st,int ed,int x,int &y,int v)
{
   ;y=++cnt;sum[y]=sum[x]+;
   if(st==ed)return;
   lson[y]=lson[x];rson[y]=rson[x];
   if(v<=mid)update(st,mid,lson[x],lson[y],v);
    ,ed,rson[x],rson[y],v);

}
int query(int x,int y,int kth)
{
  ,r=n,a=root[x-],b=root[y],tmp=;
  while(l<=r)
  {
    if(l==r){
      if(back[l]<=kth)tmp+=sum[lson[b]]-sum[lson[a]];
      return tmp;
    }
    ;int x=sum[lson[b]]-sum[lson[a]];
    ,tmp+=x,a=rson[a],b=rson[b];
     else r=mid,a=lson[a],b=lson[b];
    //printf("====%d %d %d %d %d\n",l,r,mid,x,tmp);
  }
  return tmp;
}
int main()
{
scanf("%d",&cases);
;cas<=cases;cas++)
{
  scanf(;
  memset(sum,,sizeof(sum));
  memset(root,,sizeof(root));
  memset(lson,,sizeof(lson));
  memset(rson,,sizeof(rson));
  ;i<=n;i++)
  {
    scanf("%d",&a[i]);b[i].x=a[i];b[i].h=i;
  }
  ;i<=n;i++)back[i]=;
  sort(b+,b+n+,cmp);
  ].x,rank=;back[rank]=now;
  ;i<=n;i++)
   if(b[i].x==now)a[b[i].h]=rank;
    else now=b[i].x,rank++,back[rank]=b[i].x,a[b[i].h]=rank;
  ;i<=n;i++)update(,n,root[i-],root[i],a[i]);
  printf("Case %d:\n",cas);
  ;i<=m;i++)
  {
    int L,R,H;
    scanf("%d%d%d",&L,&R,&H);L++;R++;
    printf("%d\n",query(L,R,H));
  }
}
}  

hdu4417 Super Mario

[bzoj2161]布娃娃

QAQ不造为啥这道题做的人这么少。。。是因为太水?还是因为雨荨萌萌的题面?。。。。

我不管,除了读入略坑以外,其它的看起来还是很可做的嘛。

把每一条线段看作插入与删除两个操作,对于它们的耐心值P【i】,(我这里看不到完整的题面,但是从一些std可以看出j喜欢i,当且仅当i被j的线段包围了)

那么思路就来了,把魅力值离散一下,add操作与query操作套一套就可以了。

而且这里也不需要什么继承,一棵root搞定。yep

#include<cstdio>
#include<algorithm>
#define mo 19921228
#define ll long long
#define N 100005
using namespace std;
,n,qn,root=;
],rson[],sum[],back[N];
struct node{
  int x,h;
}dat[N];
struct wxx{
  int c,k,x,f;
}q[];
bool cmp1(node a,node b)
{
  return a.x<b.x;
}
bool cmp2(wxx a,wxx b)
{
  if(a.x==b.x)return a.f<b.f;
  return a.x<b.x;
}
void work()
{
  int add,fir,mdd,prod;
  scanf("%d%d%d%d",&add,&fir,&mdd,&prod);
  ]=x;
  ;i<=n;i++)
   a[i]=(1ll*a[i-]*prod+add+i)%mdd;
}
void add(int &x,int l,int r,int v,int val)
{
  )x=++cnt;sum[x]+=val;//printf("%d %d\n",l,r);
  if(l==r)return;
  ;
  ,r,v,val);
}
int query(int x,int l,int r,int kth)
{
  //printf("%d %d\n",l,r);
  if(l==r)return l;
  //printf("%d %d\n",l,r);
  ;
  ,r,kth);
   else return query(lson[x],l,mid,kth-sum[rson[x]]);
}
int main()
{
  scanf("%d",&n);
  work();;i<=n;i++)P[i]=a[i];
  work();;i<=n;i++)C[i]=a[i];
  work();;i<=n;i++)L[i]=a[i];
  work();;i<=n;i++)R[i]=a[i];
  //for(int i=1;i<=n;i++)printf("%d ",C[i]);printf("\n");
  ;i<=n;i++)dat[i].x=C[i],dat[i].h=i;
  sort(dat+,dat+n+,cmp1);
  ].x,rank=;back[]=now;
  ;i<=n;i++)
   if(dat[i].x==now)C[dat[i].h]=rank;else now=dat[i].x,rank++,back[rank]=now,C[dat[i].h]=rank;
  //for(int i=1;i<=n;i++)printf("%d ",C[i]);  printf("\n");
  ;i<=n;i++)
  {
    if(L[i]>R[i])swap(L[i],R[i]);
    qn++;q[qn].f=;  q[qn].x=L[i];    q[qn].c=C[i];
    qn++;q[qn].f=;  q[qn].x=P[i];    q[qn].c=;   q[qn].k=i;
    qn++;q[qn].f=-; q[qn].x=R[i]+;  q[qn].c=C[i];
  }
  sort(q+,q+qn+,cmp2);
  //for(int i=1;i<=qn;i++)printf("%d %d %d\n",q[i].x,q[i].f,q[i].c);
  ll ans=;
  ;i<=qn;i++)
  {
    )add(root,,n,q[i].c,);
     )add(root,,n,q[i].c,-);
    else if(sum[root]>=q[i].k)
     ans=(ans+back[query(root,,n,q[i].k)])%mo;
  }
  printf("%lld\n",ans);
} 

bzoj2161

【主席树】【bzoj2161】[hdu4348]的更多相关文章

  1. [HDU4348]To the moon(主席树+标记永久化)

    学可持久化treap的时候才发现自己竟然没写过需要标记下传的主席树,然而现在发现大部分操作都可以标记永久化,下传会增大占用空间. 这题一种写法是和普通的线段树一样标记下传,注意所有修改操作(包括put ...

  2. hdu4348 To the moon (主席树 || 离线线段树)

    Problem Description Background To The Moon is a independent game released in November 2011, it is a ...

  3. HDU4348 To the moon (主席树)

    标记永久化,除非想\(MLE\) 忽然感到主席树不过是函数式的树套树 #include <iostream> #include <cstdio> #include <cs ...

  4. bzoj3207--Hash+主席树

    题目大意: 给定一个n个数的序列和m个询问(n,m<=100000)和k,每个询问包含k+2个数字:l,r,b[1],b[2]...b[k],要求输出b[1]~b[k]在[l,r]中是否出现. ...

  5. bzoj1901--树状数组套主席树

    树状数组套主席树模板题... 题目大意: 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]--a[ ...

  6. BZOJ 3626: [LNOI2014]LCA [树链剖分 离线|主席树]

    3626: [LNOI2014]LCA Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2050  Solved: 817[Submit][Status ...

  7. BZOJ 1146: [CTSC2008]网络管理Network [树上带修改主席树]

    1146: [CTSC2008]网络管理Network Time Limit: 50 Sec  Memory Limit: 162 MBSubmit: 3522  Solved: 1041[Submi ...

  8. BZOJ 2588: Spoj 10628. Count on a tree [树上主席树]

    2588: Spoj 10628. Count on a tree Time Limit: 12 Sec  Memory Limit: 128 MBSubmit: 5217  Solved: 1233 ...

  9. BZOJ 1901: Zju2112 Dynamic Rankings[带修改的主席树]【学习笔记】

    1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 7143  Solved: 2968[Su ...

随机推荐

  1. js判断手机端操作系统(Andorid/IOS),并自动为链接添加相应下载地址

    <script type="text/javascript"> $(document).ready(function(e) { var u = navigator.us ...

  2. mysql设置密码

    mysql如何设置密码 有很多方法: 1.用root 进入mysql后 mysql>set password =password('你的密码'); mysql>flush privileg ...

  3. php生成对象的研究

    <?php abstract class E{ protected $name; function __construct($name){ $this->name = $name; } a ...

  4. September 28th 2016 Week 40th Wednesday

    Love all, trust a few, do wrong to none. 爱所有人,信任一些人,不妨害任何人. Reading is a way for me to expand my min ...

  5. September 19th 2016 Week 39th Monday

    We come nearest to the great when we are great in humility. 我们最为谦逊的时候越接近伟大. When you are powerful en ...

  6. ReactNative环境配置

    参考链接 Windows系统安装React Native环境 windows下React Native Android 环境搭建 在Windows下搭建React Native Android开发环境 ...

  7. python中random模块使用

  8. Oracle如何写出高效的SQL

    转载:http://www.blogjava.net/ashutc/archive/2009/07/19/277215.html 1.选择最有效率的表明顺序(只在基于规则的优化器中有效) Oracle ...

  9. 图结构练习——最短路径(dijkstra算法(迪杰斯拉特))

      图结构练习——最短路径 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述  给定一个带权无向图,求节点1到节点n的最短路径.   ...

  10. SQL高级查询之一

    一,子查询 SELECT e.emp_id, e.fname, e.lname FROM (SELECT emp_id, fname, lname, start_date, title FROM em ...