【NOI2002】银河英雄传说
来源:互联网 发布:java编程思想.pdf 编辑:程序博客网 时间:2024/04/28 22:32
Overview
有
每次操作如下:
(1)
(2)
Analysis
【STEP1】 要用在线算法
这道题的多个操作,感觉上就是在线维护了。
【STEP2】 暴力的想法
首先考虑暴力维护,合并操作用一个
【STEP3】 用并查集优化暴力算法
再考虑用数据结构来优化。
有合并操作,还要判断在不在一个集合中,想到了并查集。
在不在一个排列中很好解决,现在只用解决排列中两数间隔多少个数就可以了。
【STEP4】 试着求解来扩充并查集
现在要扩充并查集。
并查集求区间的方法,通常是维护前缀和,用区间减法。
于是我们设两个数组:
试着使得各个操作得以满足维护的要求。
首先求出
但是
再设一个数组
【STEP5】 整理思路
于是我们现在一共定义
对各个操作加以维护即可。
①
1 若
2 记
3 则
②
1
2
3
4
③
1
2 若
3 求
Attention
注意一个坑点,就是有
Sumarize
PS:话说NOI连续两年出并查集了……
然而是很早以前……
突然想起NOI2015用并查集坑了T1的9个点,2333333
这道题首先给了我一个启发,就是我们在求解问题的时候,可以先想一下暴力算法,再从数据结构、算法优化等各种角度加以优化。
这样不仅是一种好的方法,而且也有一个程序来对拍。
然后就是这类并查集问题:并查集可以将序列用链划分,同一条链上可以用区间减法求区间和。
最后就是在尝试求解的过程中,很可能会遭到失败。这时候不要全盘否定,要学会调整,增加几个变量。
例如本题发现
Code
#include <cstdio>#include <cctype>#include <cmath>const int M=30000;int n;int f[M+10],dis[M+10];int size[M+10];inline int read(void){ int x=0; char c=getchar(); for (;!isdigit(c);c=getchar()); for (;isdigit(c);c=getchar()) x=x*10+c-'0'; return x;}int findf(int i){ if (f[i]==i) return i; int pre=f[i],anc=findf(f[i]); f[i]=anc,dis[i]+=dis[pre]; return anc;}int main(void){ n=read(); for (int i=1;i<=M;i++) f[i]=i,size[i]=1; char c; int x,y; int fx,fy; for (int i=1;i<=n;i++) { scanf("\n"); c=getchar(); x=read(),y=read(); fx=findf(x),fy=findf(y); if (c=='M') { f[fx]=fy; dis[fx]=size[fy]; size[fy]+=size[fx]; } else printf("%d\n",fx!=fy?-1:dis[x]<dis[y]?dis[y]-dis[x]-1:dis[x]-dis[y]-1); } return 0;}
- 【noi2002】银河英雄传说
- Noi2002银河英雄传说
- 【NOI2002】银河英雄传说
- NOI2002 银河英雄传说
- NOI2002 银河英雄传说
- NOI2002-银河英雄传说
- 【NOI2002】银河英雄传说
- NOI2002 银河英雄传说
- vijos1443【noi2002】银河英雄传说
- 银河英雄传说(NOI2002)解题报告
- 【CodeVS1540】【Vijos1443】【NOI2002】银河英雄传说
- 洛谷 P1196 NOI2002 银河英雄传说
- 洛谷 P1196 [NOI2002 D1T1] 银河英雄传说
- NOI2002 银河英雄传说(并查集)
- NOI2002 洛谷P1196 VijosP1443 银河英雄传说
- NOI2002银河英雄传说 并查集
- Noi2002 银河英雄传说(并查集)
- [NOI2002]银河英雄传说(并查集)
- CKEditor图片上传实现详细步骤(使用Struts 2)
- hdoj--2015--偶数求和(水题)
- Android 内存溢出和内存泄漏的区别
- 核心产品开源项目配置说明
- TODO 晚上看下给 Android 开发者的 RxJava 详解 ok
- 【NOI2002】银河英雄传说
- 设计模式(5)--Adapter 适配器
- "This application is modifying the autolayout engine from a background thread, which can lead to en
- 2015年年终总结&2016年展望
- hadoop - hadoop2.6 分布式 - 简单实例学习 - 统计某年的最高温度和按年份将温度从高到底排序
- 基于OMAP3530硬件平台的ARM和DSP协同开发方法
- charter3 安卓辅助
- SPFA
- C语言字符检测函数:isalnum、isalpha、isascii、iscntrl、isdigit、isgraph、islower、isspace、ispunct、isupper