1180: [CROATIAN2009]OTOCI

Time Limit: 50 Sec  Memory Limit: 162 MB
Submit: 967  Solved: 597
[Submit][Status][Discuss]

Description

给出n个结点以及每个点初始时对应的权值wi。起始时点与点之间没有连边。有3类操作:
1、bridge A B:询问结点A与结点B是否连通。如果是则输出“no”。否则输出“yes”,并且在结点A和结点B之间连一条无向边。
2、penguins A X:将结点A对应的权值wA修改为X。 3、excursion A
B:如果结点A和结点B不连通,则输出“impossible”。否则输出结点A到结点B的路径上的点对应的权值的和。给出q个操作,要求在线处理所有操作。数据范围:1<=n<=30000,
1<=q<=300000, 0<=wi<=1000。

Input

第一行包含一个整数n(1<=n<=30000),表示节点的数目。第二行包含n个整数,第i个整数表示第i个节点初始时对应的权值。第三行包含一个整数q(1<=n<=300000),表示操作的数目。以下q行,每行包含一个操作,操作的类别见题目描述。任意时刻每个节点对应的权值都是1到1000的整数。

Output

输出所有bridge操作和excursion操作对应的输出,每个一行。

Sample Input

5
4 2 4 5 6
10
excursion 1 1
excursion 1 2
bridge 1 2
excursion 1 2
bridge 3 4
bridge 3 5
excursion 4 5
bridge 1 3
excursion 2 4
excursion 2 5

Sample Output

4
impossible
yes
6
yes
yes
15
yes
15
16

HINT

Source

抄了抄答案,自己想不出来。。。。。。。。

这道题的重点在于求和,怎么理解很关键。。。

首先我们一定要记住:splay维护的是一条链,这就很方便了。那么我们想做的就是让这两个点x,y处于一条链中,并且一个在头,一个在尾。那么我们先rever(x),让x到根(似乎LCT的精髓在于把两个点转化到一颗splay中,利用rever和access,把一个点先放到根,在把另外一个点access和根联系起来,因为只有根是他们共同有的,所以利用根进行两个点的联系与连接。)然后再access(y),让y和x联系起来,处于同一颗splay中,然后splay(x,或y),这里只是让一个点到这颗splay的根,从而能获得整个根的和,因为根的和是这条链中所有点的和。很巧妙啊。

学习东西似乎先抄几遍,然后碰到不会的一边抄一边想,抄完再想一会,似乎效果比想清楚再写好很多,因为第一遍很难想清楚。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 3000010
int n,m;
int size[N],fa[N],tag[N],st[N],key[N],sum[N];
int child[N][];
void update(int x)
{
sum[x]=sum[child[x][]]+sum[child[x][]]+key[x];
}
void pushdown(int x)
{
if(!tag[x]) return;
tag[x]^=;
swap(child[x][],child[x][]);
tag[child[x][]]^=;
tag[child[x][]]^=;
}
bool isroot(int x)
{
return (!fa[x]||(child[fa[x]][]!=x&&child[fa[x]][]!=x));
}
void zig(int x)
{
int y=fa[x];
fa[x]=fa[y];
if(!isroot(y)) child[fa[x]][child[fa[x]][]==y]=x;
child[y][]=child[x][]; fa[child[x][]]=y;
child[x][]=y; fa[y]=x;
update(y); update(x);
}
void zag(int x)
{
int y=fa[x];
fa[x]=fa[y];
if(!isroot(y)) child[fa[x]][child[fa[x]][]==y]=x;
child[y][]=child[x][]; fa[child[x][]]=y;
child[x][]=y; fa[y]=x;
update(y); update(x);
}
void splay(int x)
{
int top=; st[++top]=x;
for(int y=x;!isroot(y);y=fa[y]) st[++top]=fa[y];
for(int i=top;i;i--) pushdown(st[i]);
while(!isroot(x))
{
int y=fa[x],z=fa[y];
if(isroot(y))
{
child[y][]==x?zig(x):zag(x); break;
}
child[y][]==x?zig(x):zag(x);
child[z][]==x?zig(x):zag(x);
}
}
void access(int x)
{
for(int t=;x;t=x,x=fa[x])
{
splay(x);
child[x][]=t;
update(x);
}
}
void rever(int x)
{
access(x); splay(x); tag[x]^=;
}
void link(int x,int y)
{
rever(x); fa[x]=y;
update(x); update(y);
}
void cut(int x,int y)
{
rever(x); access(y); splay(y); child[y][]=fa[x]=;
update(x); update(y);
}
int find(int x)
{
access(x); splay(x);
for(;child[x][];x=child[x][]);
return x;
}
void query1(int x,int y)
{
if(find(x)==find(y))
{
printf("no\n");
return;
}
printf("yes\n");
link(x,y);
}
void change(int x,int y)
{
key[x]=y; splay(x);
}
void query2(int x,int y)
{
if(find(x)!=find(y))
{
printf("impossible\n");
return;
}
rever(x); access(y); splay(x);
printf("%d\n",sum[x]);
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d",&key[i]);
update(i);
}
scanf("%d",&m);
while(m--)
{
char s[]; int x,y; scanf("%s",s);
if(s[]=='b')
{
scanf("%d%d",&x,&y); query1(x,y);
}
if(s[]=='p')
{
scanf("%d%d",&x,&y); change(x,y);
}
if(s[]=='e')
{
scanf("%d%d",&x,&y); query2(x,y);
}
}
return ;
}

bzoj1180,2843的更多相关文章

  1. Pyhton开源框架(加强版)

    info:Djangourl:https://www.oschina.net/p/djangodetail: Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC)风格的 ...

  2. MPlayer

    名称   mplayer − 电影播放器 mencoder − 电影编解码器 概要   mplayer [选项] [文件|URL|播放列表|−] mplayer [选项] 文件1 [指定选项] [文件 ...

  3. python 爬取腾讯微博并生成词云

    本文以延参法师的腾讯微博为例进行爬取并分析 ,话不多说 直接附上源代码.其中有比较详细的注释. 需要用到的包有 BeautifulSoup WordCloud jieba # coding:utf-8 ...

  4. 面经 cisco

    1. 优先级反转问题及解决方法 (1)什么是优先级反转 简单从字面上来说,就是低优先级的任务先于高优先级的任务执行了,优先级搞反了.那在什么情况下会生这种情况呢? 假设三个任务准备执行,A,B,C,优 ...

  5. linux驱动(续)

    网络通信 --> IO多路复用之select.poll.epoll详解 IO多路复用之select.poll.epoll详解      目前支持I/O多路复用的系统调用有 select,psel ...

  6. HttpServletRequest对象(一)

    javaweb学习总结(十)——HttpServletRequest对象(一) 一.HttpServletRequest介绍 HttpServletRequest对象代表客户端的请求,当客户端通过HT ...

  7. 【BZOJ1180】: [CROATIAN2009]OTOCI & 2843: 极地旅行社 LCT

    竟然卡了我....忘记在push_down先下传父亲的信息了....还有splay里for():卡了我10min,但是双倍经验还是挺爽的,什么都不用改. 感觉做的全是模板题,太水啦,不能这么水了... ...

  8. HDU 2843 I Will Win(概率题?,怨念颇深,简单)

    题目 真不想说什么,,,这神题真讨厌,,,多校的.. //又是一道神题... #include<stdio.h> #include<string.h> //最大公约数 int ...

  9. [bzoj2843&&bzoj1180]极地旅行社 (lct)

    双倍经验双倍的幸福... 所以另一道是300大洋的世界T_T...虽然题目是一样的,不过2843数据范围小了一点... 都是lct基本操作 #include<cstdio> #includ ...

随机推荐

  1. 用RequireJS优化Wijmo Web页面

    用RequireJS优化Wijmo Web页面 上周Wijmo 2014 V2版本刚刚发布(下载地址),  有网友下载后发现仅仅使用了40个Widgets的一小部分,还需要加载全部的jquery.wi ...

  2. windows server 2003断开远程之后自动注销用户

    windows server 2003断开远程之后自动注销用户 2011-07-30 09:42:52     我来说两句      收藏    我要投稿 最近一台服务器老是断开远程之后过没多久就自动 ...

  3. PHP类

    类就是很多方法的集合这些方法是你在程序中经常会用到的一些逻辑或算法将他们包进类里面,可以提升程序的效率,减少代码的重复 比如你有一个类文件 web_common.class.php ,里面有一个类,名 ...

  4. EF6+MVC4+EasyUI个人日记系统开源共享

    发现在2015年里学习MVC的人越来越多,本人的群成员也越来越多,为了更方便大家学习,在此共享一个个人的小项目. 如下是部分截图: 简单介绍一下本系统的一些相关知识. 1.简单的3层框架,易学易懂 2 ...

  5. MVC 过滤器1

    ASP.NET MVC 过滤器(一) 前言 前面的篇幅中,了解到了控制器的生成的过程以及在生成的过程中的各种注入点,按照常理来说篇幅应该到了讲解控制器内部的执行过程以及模型绑定.验证这些知识了.但是呢 ...

  6. Hadoop作业提交之TaskTracker获取Task

    [Hadoop代码笔记]Hadoop作业提交之TaskTracker获取Task 一.概要描述 在上上一篇博文和上一篇博文中分别描述了jobTracker和其服务(功能)模块初始化完成后,接收JobC ...

  7. HttpClient的使用-爬虫学习1

    HttpClient的使用-爬虫学习(一) Apache真是伟大,为我们提供了HttpClient.jar,这个HttpClient是客户端的http通信实现库,这个类库的作用是接受和发送http报文 ...

  8. WebForm和Asp.Net MVC的理解

    我对WebForm和Asp.Net MVC的理解   比较WebForm和Mvc的请求处理方式 首先简单了解一下Asp.Net中怎么对页面进行请求处理的: 在管道的第7-8个事件之间,有一个MapHt ...

  9. 通过VS2010命令提示窗口创建强命名文件时报错问题

    问题描述详见图 解决方案 00000005意思是Access Denied(即拒绝访问). 原因是:Program Files(x86)目录对一般用户和未提升权限的管理员是只读的. 所以只要赋予Use ...

  10. Power Designer导出实体类和NHibernate xml文件

    Power Designer导出实体类和NHibernate xml文件 今天研究了一下通过PowerDesigner生成实体类和NHibernate所需要的xml文件,方法是通过Power Desi ...