3551: [ONTAK2010]Peaks加强版

Time Limit: 20 Sec  Memory Limit: 128 MB
Submit: 877  Solved: 297
[Submit][Status][Discuss]

Description

【题目描述】同3545

Input

第一行三个数N,M,Q。
第二行N个数,第i个数为h_i
接下来M行,每行3个数a b c,表示从a到b有一条困难值为c的双向路径。
接下来Q行,每行三个数v x k,表示一组询问。v=v xor lastans,x=x xor lastans,k=k xor lastans。如果lastans=-1则不变。
 

Output

同3545

Sample Input

 

Sample Output

 

HINT

【数据范围】同3545

Source

题解:

  过了这么久才又开始写博客(省选被虐成渣,现在还要准备半期考试 only shit)好吧,算了毕竟太渣,不多说了,写题解QAQ

  看了题目,一脸懵逼,怎么写?(不会) 怎么办?(看题解)

  首先看看这道题,它是一个无向图,根本不知道怎么来写主席树,操蛋。

  仔细看看题,我们可以这样想,我要走一个边权比x小的边,并且一直走下去,我们不就可以用最小生成树吗?每次走最小的边,那么一定是最优的,所以我们就用kruskal来写

  但是要注意的是,在找到一个新的边时,新建一个节点,权值为边的权值,把边的两端连向这个点,不难证明这是一课树。。。。。

  然后每次询问就从当前点往上面倍增地跳,直到不能走(点权大于x) 那么那个点的子树中的点就是我可以到达的点

  于是题目就变成求一个子树第k大的问题。。。用lca加和主席树就A了

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define maxn 300005
#define maxnode 2000005
using namespace std;
int n,m,q,lastans,top;
int size,tot,ext;
int pre[maxn],now[maxn],v[maxn],fa[maxn],sum[maxnode],son[maxnode][],pp[maxn];
int bin[],deep[maxn],f[maxn][],mx[maxn][];
int h[maxn],list[maxn],qz[maxn],root[maxn],st[maxn],ed[maxn];
bool vis[maxn];
struct date{int u,v,val;
}a[];
int read()
{
int x=; char ch; bool bo=;
while (ch=getchar(),ch<''||ch>'') if (bo=='-') bo=;
while (x=x*+ch-'',ch=getchar(),ch>=''&&ch<='');
if (bo) return -x; return x;
}
bool cmp_val(date a, date b)
{
return a.val<b.val;
}
int find(int x)
{
if (fa[x]!=x) fa[x]=find(fa[x]);
return fa[x];
}
void insert(int x,int y){tot++; pre[tot]=now[x]; now[x]=tot; v[tot]=y;
}
void ins(int l,int r,int x,int &y,int val)
{
int t;
if (!y) y=++tot; sum[y]=sum[x]+;
if (l==r) return;
int mid=(l+r)>>;
if (val<=mid) t=,r=mid; else t=,l=mid+;
son[y][t^]=son[x][t^];
ins(l,r,son[x][t],son[y][t],val);
}
void dfs(int x)
{
vis[x]=; pp[++top]=x;
for (int i=; i<=; i++)
if (bin[i]<=deep[x])
{
f[x][i]=f[f[x][i-]][i-];
mx[x][i]=max(mx[x][i-],mx[f[x][i-]][i-]);
}
for (int p=now[x]; p; p=pre[p])
{
int son=v[p];
deep[son]=deep[x]+;
f[son][]=x;
mx[son][]=qz[x];
dfs(son);
}
if (x>n) pp[++top]=x;
}
void build()
{
ext=n;
sort(a+,a+m+,cmp_val);
for (int i=; i<=m; i++)
{
int q=find(a[i].u),p=find(a[i].v);
if (q!=p)
{
ext++;
fa[q]=fa[p]=ext; qz[ext]=a[i].val;
insert(ext,p); insert(ext,q);
if (ext==*n-) break;
}
}
for (int i=; i<=n; i++)
{
if (!vis[i]) dfs(find(i));
}
for (int i=; i<=top; i++)
{
int t=pp[i];
if (t<=n) ins(,n,root[i-],root[i],h[t]);
else
{
root[i]=root[i-];
if (!st[t]) st[t]=i; else ed[t]=i;
}
}
}
int valfind(int x,int val)
{
for(int i=;i>=;i--)
if(deep[x]>=bin[i]&&mx[x][i]<=val)x=f[x][i];
return x;
}
int query(int l,int r,int x,int y,int val)
{
if (l==r) return l;
int mid=(l+r)>>;
int kk=sum[son[y][]]-sum[son[x][]],t;
//cout<<" "<<kk<<endl;
if (kk>=val) return query(l,mid,son[x][],son[y][],val);
else return query(mid+,r,son[x][],son[y][],val-kk);
}
void solve()
{
while (q--)
{
int x=read(),val=read(),k=read();
if (lastans!=-) x^=lastans,val^=lastans,k^=lastans;
int t=valfind(x,val);
int a=root[st[t]],b=root[ed[t]];
if (sum[b]-sum[a]<k) lastans=-;
else lastans=list[query(,n,a,b,sum[b]-sum[a]-k+)];
printf("%d\n",lastans);
} }
void prework()
{
bin[]=;
for (int i=; i<; i++) bin[i]=bin[i-]<<;
for (int i=; i<=*n; i++) fa[i]=i;
sort(list+,list++n);
for (int i=; i<=n; i++) h[i]=lower_bound(list+,list++n,h[i])-list;
for (int i=; i<=m; i++)
{
a[i].u=read(); a[i].v=read(); a[i].val=read();
}
build();
}
int main()
{
n=read(); m=read(); q=read();
for (int i=; i<=n; i++) list[i]=h[i]=read();
prework();
solve();
return ;
}

  

bzoj3551的更多相关文章

  1. bzoj3551 3545

    我直接来讲在线好了 这是一个很巧妙的方法,把边作为一个点 做一遍最小生成树,当加如一条边时,我们把这条边两点x,y的并查集的根i,j的父亲都设为这条边代表的点k,由k向i,j连边 这样我们就构建出一棵 ...

  2. [您有新的未分配科技点][BZOJ3545&BZOJ3551]克鲁斯卡尔重构树

    这次我们来搞一个很新奇的知识点:克鲁斯卡尔重构树.它也是一种图,是克鲁斯卡尔算法求最小生成树的升级版首先看下面一个问题:BZOJ3545 Peaks. 在Bytemountains有N座山峰,每座山峰 ...

  3. BZOJ3551 [ONTAK2010]Peaks加强版 kruskal 并查集 主席树 dfs序

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3551 题意概括 Description 在Bytemountains有N座山峰,每座山峰有他的高度 ...

  4. 【BZOJ3551】 [ONTAK2010]Peaks加强版

    BZOJ3551 [ONTAK2010]Peaks加强版 Solution Kruscal重构树后发现可以对于小于的离散化然后倍增+主席树找到上一个的可行解. 然后就可以了. 如果数组开的不好,容易在 ...

  5. 【BZOJ3551】Peaks加强版(Kruskal重构树,主席树)

    [BZOJ3551]Peaks加强版(Kruskal重构树,主席树) 题面 BZOJ Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相 ...

  6. 【BZOJ3551】[ONTAK2010]Peaks加强版 最小生成树+DFS序+主席树

    [BZOJ3545][ONTAK2010]Peaks Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困 ...

  7. BZOJ3551 ONTAK2010Peaks加强版(kruskal重构树+dfs序+主席树)

    kruskal重构树本质就是给并查集显式建树来替代可持久化并查集.将边按困难度从小到大排序后建出该树,按dfs序建主席树即可.查询时跳到深度最浅的满足在该重要度下已被合并的点,在子树内查询第k大. # ...

  8. 【bzoj3545/bzoj3551】[ONTAK2010]Peaks/加强版 Kruskal+树上倍增+Dfs序+主席树

    bzoj3545 题目描述 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询 ...

  9. [BZOJ3551][ONTAK2010]Peaks(加强版)(Kruskal重构树,主席树)

    3551: [ONTAK2010]Peaks加强版 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 2438  Solved: 763[Submit][ ...

  10. [BZOJ3551]Peaks

    [BZOJ3551]Peaks BZOJ luogu 建Kruskal重构树,点权为边权 按dfn序建出主席树 倍增找到能跳到的最浅的祖先 主席树查询一下 #include<bits/stdc+ ...

随机推荐

  1. Telepro工具注册码

    Teleport Pro v1.54 注册码 Teleport Pro v1.54姓名(Name):3ddown.com序列号(Serial):161594593

  2. 使用JavaCV/OpenCV抓取并存储摄像头图像

    http://blog.csdn.net/ljsspace/article/details/6702178  分类: 图形图像(3)  版权声明:本文为博主原创文章,未经博主允许不得转载. 本程序通过 ...

  3. hibernate事务并发问题(脏读,不可重复读,幻读)

    脏读  dirty read:  读了别的事务没有提交的事务, 可能回滚, 数据可能不对. 不可重复读 non repeatable read: 同一个事务里前后读出来的数据不一样, 被另一个事务影响 ...

  4. 交换机VLAN、 TRUNK 、VTP 配置

    交换机VLAN. TRUNK .VTP 配置 1. 配置 CISCO 二层交换机的IP 地址(catalyst 2950 为例) SW1(config)#int vlan 1 //进入管理接口inte ...

  5. g1gc

    http://www.infoq.com/articles/G1-One-Garbage-Collector-To-Rule-Them-All http://blog.csdn.net/renfufe ...

  6. FusionCharts导出图表常见问题(FAQ)汇总---FusionCharts常见问题大全

    在前面几篇文章中,我们介绍了FusionCharts生成Flash图表常见问题FAQ以及使用中的一些常见报错及调试/解决方法.本文继续介绍FusionCharts导出图表时的一些常见问题(FAQ). ...

  7. dyld: Symbol not found: _OBJC_CLASS_$_UIBlurEffect

    信息如下: 不知道为撒出现这个问题,查资料也木有查到..看提示信息可能是UIKit的问题,所以就试着这样解决,结果居然好了....有谁知道原因的告诉额一声啊,拜托!

  8. GuideActivity.java引导界面:

    这是谷歌官方给我们提供的一个兼容低版本安卓设备的软件包,里面包囊了只有在安卓3.0以上可以使用的api. 而viewpager就是其中之一利用它,我们可以做很多事情,从最简单的导航,到页面菜单等等.那 ...

  9. Fragment在Activity中的应用 (转载)

    原文链接 http://www.cnblogs.com/nanxin/archive/2013/01/24/2875341.html 在本小节中介绍在Activity中创建Fragment. 官网有很 ...

  10. .net杂记

    1. .net 接口命名规范例如I***able; 2. 接口扩展功能,代表类Can do;抽象类代表族 Is a; 3. 不要在foreach中处理异常;