2959: 长跑

Description

  某校开展了同学们喜闻乐见的阳光长跑活动。为了能“为祖国健康工作五十年”,同学们纷纷离开寝室,离开教室,离开实验室,到操场参加3000米长跑运动。一时间操场上熙熙攘攘,摩肩接踵,盛况空前。

  为了让同学们更好地监督自己,学校推行了刷卡机制。

  学校中有n个地点,用1到n的整数表示,每个地点设有若干个刷卡机。

  有以下三类事件:

  1、修建了一条连接A地点和B地点的跑道。

  2、A点的刷卡机台数变为了B。

  3、进行了一次长跑。问一个同学从A出发,最后到达B最多可以刷卡多少次。具体的要求如下:

  当同学到达一个地点时,他可以在这里的每一台刷卡机上都刷卡。但每台刷卡机只能刷卡一次,即使多次到达同一地点也不能多次刷卡。

  为了安全起见,每条跑道都需要设定一个方向,这条跑道只能按照这个方向单向通行。最多的刷卡次数即为在任意设定跑道方向,按照任意路径从A地点到B地点能刷卡的最多次数。

Input

  输入的第一行包含两个正整数n,m,表示地点的个数和操作的个数。

  第二行包含n个非负整数,其中第i个数为第个地点最开始刷卡机的台数。

  接下来有m行,每行包含三个非负整数P,A,B,P为事件类型,A,B为事件的两个参数。

  最初所有地点之间都没有跑道。

  每行相邻的两个数之间均用一个空格隔开。表示地点编号的数均在1到n之间,每个地点的刷卡机台数始终不超过10000,P=1,2,3。

Output

  输出的行数等于第3类事件的个数,每行表示一个第3类事件。如果该情况下存在一种设定跑道方向的方案和路径的方案,可以到达,则输出最多可以刷卡的次数。如果A不能到达B,则输出-1。


思路:用LCT维护链的信息,用并查集进行缩点。

注意到每次缩点后只有虚边连的边是不对的,所以在access时重新练一下虚边和询问的时候询问并查集的根就可以了,但是bzoj我还是没卡过去...


Code:

#include <cstdio>
#include <cctype>
#define ll long long
#define fa par[now]
#define ls ch[now][0]
#define rs ch[now][1]
const int N=150010;
int read()
{
int x=0;char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) {x=x*10+c-'0';c=getchar();}
return x;
}
int ch[N][2],par[N],tag[N],s[N],F[N],tot,tmp,n,m;
ll sum[N],dat[N],Dat[N];
int Find(int x){return F[x]=F[x]==x?x:Find(F[x]);}
int identity(int now){return ch[fa][1]==now;}
bool isroot(int now){return ch[fa][0]==now||ch[fa][1]==now;}
void updata(int now){sum[now]=sum[ls]+sum[rs]+dat[now];}
void Reverse(int now){tag[now]^=1,tmp=ls,ls=rs,rs=tmp;}
void connect(int f,int now,int typ){ch[fa=f][typ]=now;}
void pushdown(int now)
{
if(tag[now])
{
if(ls) Reverse(ls);
if(rs) Reverse(rs);
tag[now]^=1;
}
}
void Rotate(int now)
{
int p=Find(fa),typ=identity(now);
connect(p,ch[now][typ^1],typ);
if(isroot(p)) connect(par[p],now,identity(p));
else fa=Find(par[p]);
connect(now,p,typ^1);
updata(p),updata(now);
}
void splay(int now)
{
while(isroot(now)) s[++tot]=now,now=fa;s[++tot]=now;
while(tot) pushdown(s[tot--]);now=s[1];
for(;isroot(now);Rotate(now))
if(isroot(fa))
Rotate(identity(now)^identity(fa)?now:fa);
}
void access(int now)
{
for(int las=0;now;las=now,now=(fa=Find(fa)))
splay(now),rs=las,updata(now);
}
void evert(int now){access(now),splay(now),Reverse(now);}
int findroot(int now)
{
access(now);
splay(now);
while(ls) now=ls;
return now;
}
void dfs(int now,int anc)
{
if(!now) return;
F[now]=anc;
dfs(ls,anc),dfs(rs,anc);
}
void link(int u,int v)
{
evert(u);
if(findroot(v)!=u) par[u]=v;
else dat[v]=sum[v],dfs(v,v),ch[v][0]=ch[v][1]=0;
}
void query(int u,int v)
{
evert(u);
if(findroot(v)!=u) puts("-1");
else printf("%lld\n",sum[v]);
}
int main()
{
freopen("data.in","r",stdin);
freopen("dew.out","w",stdout);
n=read(),m=read();
for(int i=1;i<=n;i++) F[i]=i,Dat[i]=sum[i]=dat[i]=read();
for(int op,x,y,i=1;i<=m;i++)
{
op=read(),x=read(),y=read();
if(op==1)
link(Find(x),Find(y));
else if(op==2)
{
int rt=Find(x);
splay(rt);
dat[rt]+=y-Dat[x];
Dat[x]=y;
updata(rt);
}
else
query(Find(x),Find(y));
}
return 0;
}

2018.12.11

BZOJ 2959: 长跑 解题报告的更多相关文章

  1. BZOJ 2959: 长跑 [lct 双连通分量 并查集]

    2959: 长跑 题意:字词加入边,修改点权,询问两点间走一条路径的最大点权和.不一定是树 不是树

  2. bzoj 2959 长跑(LCT+BCC+并查集)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2959 [题意] n个点,提供操作:连边,修改点权,查询自定义边的方向后起点a终点b能经 ...

  3. bzoj 2959: 长跑

    Description 某校开展了同学们喜闻乐见的阳光长跑活动.为了能"为祖国健康工作五十年",同学们纷纷离开寝室,离开教室,离开实验室,到操场参加3000米长跑运动.一时间操场上 ...

  4. 【刷题】BZOJ 2959 长跑

    Description 某校开展了同学们喜闻乐见的阳光长跑活动.为了能"为祖国健康工作五十年",同学们纷纷离开寝室,离开教室,离开实验室,到操场参加3000米长跑运动.一时间操场上 ...

  5. BZOJ 2959: 长跑 lct 双联通分量 并查集 splay

    http://www.lydsy.com/JudgeOnline/problem.php?id=2959 用两个并查集维护双联通分量的编号和合并. #include<iostream> # ...

  6. BZOJ 2959: 长跑 LCT_并查集_点双

    真tm恶心...... Code: #include<bits/stdc++.h> #define maxn 1000000 using namespace std; void setIO ...

  7. BZOJ 2959 长跑 (LCT+并查集)

    题面:BZOJ传送门 当成有向边做的发现过不去样例,改成无向边就忘了原来的思路.. 因为成环的点一定都能取到,我们把它们压成一个新点,权值为环上所有点的权值和 这样保证了图是一颗森林 每次询问转化为, ...

  8. BZOJ 2959 长跑 (LCT、并查集)

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2959 题解 真是被这题搞得心态大崩--调了7个小时--然而并查集都能写成\(O(n^2) ...

  9. BZOJ 4238 电压 解题报告

    BZOJ 4238 电压 考虑一条边成为答案以后,删去Ta后剩下的图是一个或很多个二分图,即没有奇环 则一条边可以成为答案,当且仅当自己在所有奇环的交上且不在偶环上. 考虑建出dfs树,那么返祖边一定 ...

随机推荐

  1. 【MySQL高级特性】高性能MySQL第七章

    2017-07-25 14:15:43 前言:MYSQL从5.0和5.1版本开始引入了很多高级特性,例如分区.触发器等,这对有其他关系型数据库使用 背景的用户来说可能并不陌生.这些新特性吸引了很多用户 ...

  2. 解决WCF传输的数据量过大问题

    今天写了个WCF接口,然后自测通过,和别人联调时报 远程服务器返回错误: (413) Request Entity Too Large        错误!记得以前写的时候也出现过这个错误,大致解决办 ...

  3. 【Jmeter测试】BeanShell介绍和使用

      BeanShell是什么? BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法; BeanShell是一种松散类型的脚本语言: BeanShell是用Jav ...

  4. Jmeter接口测试(九)授权

    下面应该是jmeter的授权设置,但是由于本人目前对这块了解还不深,暂时写个标题,以后有时间再来补充,大家可以先看下一篇内容

  5. JMeter学习笔记(一) 工具的安装和基本介绍

    因为网上的资料比较多,就不多描述了,在此引用了其他大神的文档,用于学习 这个文档中有比较详细的jmeter工具介绍: https://wenku.baidu.com/view/64f3a5f75901 ...

  6. TPO-18 C2 Possible participation in a sociology project

    TPO-18 C2 Possible participation in a sociology project 第 1 段 1.listen to a conversation between a s ...

  7. 换Mac了,迈入了终端的大门

    多终端其实本质和多线程一样,所有终端其实都共享着同一个内存只不过不同终端对共享内存不同部分的权限不同罢了所以对终端的数量必须要有限制 我这里开启了四个线程,很明显四个线程都在跑同一个内存而且四个线程都 ...

  8. python购物车优化

    一.需求分析 拥有用户接口和商家接口 用户能够进行消费记录查询,充值,购物等功能,消费记录存储于数据库 商家可以进行商品的增删改等操作 二.程序流程图 程序大致流程图如下: 三.代码实现 本程序分成两 ...

  9. Kubernetes学习-相关概念

    Kubernetes架构图 上图可以看到如下组件,使用特别的图标表示Service和Label: Pod Container(容器) Label()(标签) Replication Controlle ...

  10. Dev C++支持ISOC++11标准

    报错如下: [Error] #error This file requires compiler and library support for the ISO C++ 2011 standard. ...