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. a:focus{outline: none;} 如何去掉点击链接时周围的虚线框outline属性

    1. CSS方式 在IE下是使用html属性:hideFoucs,在HTML标签中加上hidefocus=”true”属性即可,但这个属性是IE私有的,Firefox是不认的. 加了hidefocus ...

  2. Redis源代码分析(二十四)--- tool工具类(2)

    在上篇文章中初步的分析了一下,Redis工具类文件里的一些使用方法,包含2个随机算法和循环冗余校验算法,今天,继续学习Redis中的其它的一些辅助工具类的使用方法.包含里面的大小端转换算法,sha算法 ...

  3. html5 Geolocation(地理位置定位)学习

    1.html5 Geolocation html5 Geolocation API 使用很简单,请求一个位置信息,如果用户同意,浏览器会返回一个位置信息,该位置是通过用户的底层设备(手机,电脑) 提供 ...

  4. html5 音频和视频(audio And video)

    1.音频和视频  Web 上的视频 直到现在,仍然不存在一项旨在网页上显示视频的标准. 今天,大多数视频是通过插件(比如 Flash)来显示的.然而,并非所有浏览器都拥有同样的插件. HTML5 规定 ...

  5. jquery 移动端轮播图

    <div class="slide"> <div class="slide-box"> <ul class="slide ...

  6. MVC5入门学习系列④

    添加Model且简单的使用EF 对于EF(EntityFramework)不了解的朋友可以去百度文科或者在园子里搜一些简资源看下,假如和我一样知道EF的概念,那么就知道EF有一个code first的 ...

  7. SAX解析XML文件实例代码

    import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; ...

  8. Kindergarten Counting Game - UVa494

    欢迎访问我的新博客:http://www.milkcu.com/blog/ 原文地址:http://www.milkcu.com/blog/archives/uva494.html 题目描述  Kin ...

  9. SugarSync的API总结

    SugarSync API App支持SugarSync网盘的前提: 1.AccessKeyID:xxx 2.Private Access Key:xxx 3.AppID:xxx 详细的API总结如下 ...

  10. [转]iOS Tutorial – Dumping the Application Heap from Memory

     Source:https://blog.netspi.com/ios-tutorial-dumping-the-application-heap-from-memory/ An essential ...