#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. GridView中使用分页控件

    前台:导入<%@ Register assembly="AspNetPager" namespace="Wuqi.Webdiyer" tagprefix= ...

  2. mongodb3.2配置文件yaml格式 详解

    mongodb3.x版本后就是要yaml语法格式的配置文件,下面是yaml配置文件格式如下:官方yaml配置文件选项参考:https://docs.mongodb.org/manual/ ... #c ...

  3. 如何用Endnote导入你要用的格式

    在Google搜索某一个期刊名 ens格式的文件,下载,然后放入endnote的文件夹中(C:\Program Files (x86)\EndNote X7\Styles) 然后将其导入即可

  4. 模拟赛1030d1

    [问题描述]从1− ?中找一些数乘起来使得答案是一个完全平方数,求这个完全平方数最大可能是多少.[输入格式]第一行一个数字?.[输出格式]一行一个整数代表答案对100000007取模之后的答案.[样例 ...

  5. 关于jQuery新的事件绑定机制on()的使用技巧

    关于jQuery新的事件绑定机制on()的使用技巧 http://www.jb51.net/article/36064.htm 本篇文章介绍了,关于jQuery新的事件绑定机制on()的使用技巧.需要 ...

  6. hdu2030 汉字统计

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2030 解题思路:主要考察汉字的编码方式, 汉字机内码在计算机的表达方式的描述是,使用二个字节,汉字的每 ...

  7. jquery学习笔记----元素筛选

    1.eq()  筛选指定索引号的元素2.first() 筛选出第一个匹配的元素3.last() 筛选出最后一个匹配的元素4.hasClass() 检查匹配的元素是否含有指定的类5.filter() 筛 ...

  8. C#4.0图解教程 - 第24章 反射和特性 - 1.反射

    24.1 元数据和反射 有关程序及类型的数据被成为 元数据.他们保存在程序集中. 程序运行时,可以查看其他程序集或其本身的元数据.一个运行的程序查看本身元数据或其他程序的元数据的行为叫做 反射. 24 ...

  9. poj 1004:Financial Management(水题,求平均数)

    Financial Management Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 126087   Accepted: ...

  10. Howto: Connect MySQL server using C program API under Linux or UNIX

    From my mailbag: How do I write a C program to connect MySQL database server? MySQL database does su ...