【主席树】【bzoj2161】[hdu4348]
#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]的更多相关文章
- [HDU4348]To the moon(主席树+标记永久化)
学可持久化treap的时候才发现自己竟然没写过需要标记下传的主席树,然而现在发现大部分操作都可以标记永久化,下传会增大占用空间. 这题一种写法是和普通的线段树一样标记下传,注意所有修改操作(包括put ...
- hdu4348 To the moon (主席树 || 离线线段树)
Problem Description Background To The Moon is a independent game released in November 2011, it is a ...
- HDU4348 To the moon (主席树)
标记永久化,除非想\(MLE\) 忽然感到主席树不过是函数式的树套树 #include <iostream> #include <cstdio> #include <cs ...
- bzoj3207--Hash+主席树
题目大意: 给定一个n个数的序列和m个询问(n,m<=100000)和k,每个询问包含k+2个数字:l,r,b[1],b[2]...b[k],要求输出b[1]~b[k]在[l,r]中是否出现. ...
- bzoj1901--树状数组套主席树
树状数组套主席树模板题... 题目大意: 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]--a[ ...
- BZOJ 3626: [LNOI2014]LCA [树链剖分 离线|主席树]
3626: [LNOI2014]LCA Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2050 Solved: 817[Submit][Status ...
- BZOJ 1146: [CTSC2008]网络管理Network [树上带修改主席树]
1146: [CTSC2008]网络管理Network Time Limit: 50 Sec Memory Limit: 162 MBSubmit: 3522 Solved: 1041[Submi ...
- 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 ...
- BZOJ 1901: Zju2112 Dynamic Rankings[带修改的主席树]【学习笔记】
1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 7143 Solved: 2968[Su ...
随机推荐
- GridView中使用分页控件
前台:导入<%@ Register assembly="AspNetPager" namespace="Wuqi.Webdiyer" tagprefix= ...
- mongodb3.2配置文件yaml格式 详解
mongodb3.x版本后就是要yaml语法格式的配置文件,下面是yaml配置文件格式如下:官方yaml配置文件选项参考:https://docs.mongodb.org/manual/ ... #c ...
- 如何用Endnote导入你要用的格式
在Google搜索某一个期刊名 ens格式的文件,下载,然后放入endnote的文件夹中(C:\Program Files (x86)\EndNote X7\Styles) 然后将其导入即可
- 模拟赛1030d1
[问题描述]从1− ?中找一些数乘起来使得答案是一个完全平方数,求这个完全平方数最大可能是多少.[输入格式]第一行一个数字?.[输出格式]一行一个整数代表答案对100000007取模之后的答案.[样例 ...
- 关于jQuery新的事件绑定机制on()的使用技巧
关于jQuery新的事件绑定机制on()的使用技巧 http://www.jb51.net/article/36064.htm 本篇文章介绍了,关于jQuery新的事件绑定机制on()的使用技巧.需要 ...
- hdu2030 汉字统计
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2030 解题思路:主要考察汉字的编码方式, 汉字机内码在计算机的表达方式的描述是,使用二个字节,汉字的每 ...
- jquery学习笔记----元素筛选
1.eq() 筛选指定索引号的元素2.first() 筛选出第一个匹配的元素3.last() 筛选出最后一个匹配的元素4.hasClass() 检查匹配的元素是否含有指定的类5.filter() 筛 ...
- C#4.0图解教程 - 第24章 反射和特性 - 1.反射
24.1 元数据和反射 有关程序及类型的数据被成为 元数据.他们保存在程序集中. 程序运行时,可以查看其他程序集或其本身的元数据.一个运行的程序查看本身元数据或其他程序的元数据的行为叫做 反射. 24 ...
- poj 1004:Financial Management(水题,求平均数)
Financial Management Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 126087 Accepted: ...
- 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 ...