题意:有T组測试数据。每组数据的N表示有N个城市,接下来的N行里每行给出每一个城市的坐标(0<=x,y<=1000000),然后有M(1<M<200000)个操作,操作有两类,(1)"road A B",表示将城市A和城市B通过一条道路连接,假设A和B原来属于不同的城市群。经过这个操作。A和B就在一个城市群里了。保证每条道路不会和其它道路相交(除了端点A和B)。(2)"line C"。表示查询当穿过y=C的直线,有多少个城市群、这几个城市群一共同拥有多少个城市。

思路:线段树加并查集

#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
#include<stack>
#include<string>
#include<map>
#include<set>
#define eps 1e-6
#define LL long long
using namespace std; const int maxn = 100000 + 100;
const int maxl = 1000000 + 10;
const int INF = 0x3f3f3f3f;
int pa[maxn], low[maxn], high[maxn], pos[maxn], node[maxn];
int sumv1[2*maxl], addv1[2*maxl]; //有多少州
int sumv2[2*maxl], addv2[2*maxl];
int n, m;
//pa保存父亲结点,low,high保存该连通分量的上下边界。node保存连通分量中的结点个数
int find(int x) {
if(x != pa[x]) return pa[x] = find(pa[x]);
return x;
} void maintain1(int o, int L, int R) {
int lc = o*2, rc = o*2+1;
sumv1[o] = 0;
if(R > L) { //考虑左右子树
sumv1[o] = sumv1[lc] + sumv1[rc];
}
sumv1[o] += addv1[o] * (R-L+1);//考虑add操作
}
void update1(int o, int L, int R, int v, int yl, int yr) {
int lc = o*2, rc = o*2+1;
if(yl <= L && yr >= R) { //递归边界
addv1[o] += v; //累加边界的add值
} else {
int M = L + (R-L)/2;
if(yl <= M) update1(lc, L, M, v, yl, yr);
if(yr > M) update1(rc, M+1, R, v, yl, yr);
}
maintain1(o, L, R); //递归结束前又一次计算本节点的附加信息
}
int query1(int o, int L, int R, int add, int yl, int yr) {
if(yl <= L && yr >= R) {
return sumv1[o] + add*(R-L+1);
} else {
int ans = 0;
int M = L + (R-L)/2;
if(yl <= M) ans += query1(o*2, L, M, add + addv1[o], yl, yr);
if(yr > M) ans += query1(o*2+1, M+1, R, add + addv1[o], yl, yr);
return ans;
}
} void maintain2(int o, int L, int R) {
int lc = o*2, rc = o*2+1;
sumv2[o] = 0;
if(R > L) { //考虑左右子树
sumv2[o] = sumv2[lc] + sumv2[rc];
}
sumv2[o] += addv2[o] * (R-L+1);//考虑add操作
}
void update2(int o, int L, int R, int v, int yl, int yr) {
int lc = o*2, rc = o*2+1;
if(yl <= L && yr >= R) { //递归边界
addv2[o] += v; //累加边界的add值
} else {
int M = L + (R-L)/2;
if(yl <= M) update2(lc, L, M, v, yl, yr);
if(yr > M) update2(rc, M+1, R, v, yl, yr);
}
maintain2(o, L, R); //递归结束前又一次计算本节点的附加信息
}
int query2(int o, int L, int R, int add, int yl, int yr) {
if(yl <= L && yr >= R) {
return sumv2[o] + add*(R-L+1);
} else {
int ans = 0;
int M = L + (R-L)/2;
if(yl <= M) ans += query2(o*2, L, M, add + addv2[o], yl, yr);
if(yr > M) ans += query2(o*2+1, M+1, R, add + addv2[o], yl, yr);
return ans;
}
} void init() {
memset(addv1, 0 ,sizeof(addv1)); memset(addv2, 0, sizeof(addv2));
memset(sumv1, 0, sizeof(sumv1)); memset(sumv2, 0, sizeof(sumv2));
cin >> n;
for(int i = 0; i < n; i++) {
int tmp; cin >> tmp >> pos[i];
}
for(int i = 0; i < n; i++) {
pa[i] = i;
node[i] = 1;
high[i] = low[i] = pos[i];
}
cin >> m;
} void solve() {
char cmd[5];
int a, b;
float c;
while(m--) {
cin >> cmd;
if(cmd[0] == 'r') {
cin >> a >> b;
if(find(a) != find(b)) {
if(high[pa[a]] != low[pa[a]]) {
update1(1, 1, 1000000, -1, low[pa[a]]+1, high[pa[a]]);
update2(1, 1, 1000000, -node[pa[a]], low[pa[a]]+1, high[pa[a]]);
}
if(high[pa[b]] != low[pa[b]]) {
update1(1, 1, 1000000, -1, low[pa[b]]+1, high[pa[b]]);
update2(1, 1, 1000000, -node[pa[b]], low[pa[b]]+1, high[pa[b]]);
}
node[pa[a]] += node[pa[b]];
low[pa[a]] = min(low[pa[a]], low[pa[b]]);
high[pa[a]] = max(high[pa[a]], high[pa[b]]);
pa[pa[b]] = pa[a];
if(high[pa[a]] != low[pa[a]]) {
update1(1, 1, 1000000, 1, low[pa[a]]+1, high[pa[a]]);
update2(1, 1, 1000000, node[pa[a]], low[pa[a]]+1, high[pa[a]]);
}
}
} else {
cin >> c;
cout << query1(1, 1, 1000000, 0, (int)(c+1), (int)(c+1)) << " ";
cout << query2(1, 1, 1000000, 0, (int)(c+1), (int)(c+1)) << endl;
// cout << (int)(c+1) << endl;
}
}
} int main() {
// freopen("input.txt", "r", stdin);
int t; cin >> t;
while(t--) {
init();
solve();
}
return 0;
}

uvalive 4730王国kingdom(并查集+线段树)的更多相关文章

  1. UVA1455 - Kingdom(并查集 + 线段树)

    UVA1455 - Kingdom(并查集 + 线段树) 题目链接 题目大意:一个平面内,给你n个整数点,两种类型的操作:road x y 把city x 和city y连接起来,line fnum ...

  2. 并查集&线段树&树状数组&排序二叉树

    超级无敌巨牛逼并查集(带权并查集)https://vjudge.net/problem/UVALive-4487 带删点的加权并查集 https://vjudge.net/problem/UVA-11 ...

  3. 【Codeforces576E_CF576E】Painting Edges(可撤销并查集+线段树分治)

    题目 CF576E 分析: 从前天早上肝到明天早上qwq其实颓了一上午MC ,自己瞎yy然后1A,写篇博客庆祝一下. 首先做这题之前推荐一道很相似的题:[BZOJ4025]二分图(可撤销并查集+线段树 ...

  4. BZOJ 3910 并查集+线段树合并

    思路: 1. 并查集+线段树合并 记得f[LCA]==LCA的时候 f[LCA]=fa[LCA] 2.LCT(并不会写啊...) //By SiriusRen #include <cstdio& ...

  5. 并查集 + 线段树 LA 4730 Kingdom

    题目传送门 题意:训练指南P248 分析:第一个操作可以用并查集实现,保存某集合的最小高度和最大高度以及城市个数.运用线段树成端更新来统计一个区间高度的个数,此时高度需要离散化.这题两种数据结构一起使 ...

  6. YYHS-猜数字(并查集/线段树维护)

    题目描述     LYK在玩猜数字游戏.    总共有n个互不相同的正整数,LYK每次猜一段区间的最小值.形如[li,ri]这段区间的数字的最小值一定等于xi.     我们总能构造出一种方案使得LY ...

  7. luogu5012 水の数列 (并查集+线段树)

    如果我们能求出来每个区间个数的最大分值,那就可以用线段树维护这个东西 然后出答案了 然后这个的求法和(luogu4269)Snow Boots G非常类似,就是我们把数大小排个序,每次都拿<=x ...

  8. 【CF471E】MUH and Lots and Lots of Segments 扫描线+并查集+线段树+set

    [CF471E]MUH and Lots and Lots of Segments 题意:给你平面上n条水平或竖直的,端点在整点处的线段.你需要去掉一些线段的一些部分,使得剩下的图形:1.连通,2.无 ...

  9. bzoj 3237 连通图 - 并查集 - 线段树

    Input Output Sample Input 4 5 1 2 2 3 3 4 4 1 2 4 3 1 5 2 2 3 2 1 2 Sample Output Connected Disconne ...

随机推荐

  1. SpringCloud学习笔记(4)----Spring Cloud Netflix之Eureka的配置

    1. Eureka监控配置 Eureka的客户端需要加入依赖 <dependency> <groupId>org.springframework.boot</groupI ...

  2. Python内置数据结构之字符串str

    1. 数据结构回顾 所有标准序列操作(索引.切片.乘法.成员资格检查.长度.最小值和最大值)都适用于字符串,但是字符串是不可变序列,因此所有的元素赋值和切片赋值都是非法的. >>> ...

  3. tf.slice()解释

    转载:https://www.jianshu.com/p/71e6ef6c121b def slice(input_, begin, size, name=None): 其中“input_”是你输入的 ...

  4. VMware exsi 虚拟化嵌套

    默认情况下exsi 虚拟化嵌套是没开启的 需要我们连接exsi主机,从后台找到对应的虚拟机修改配置文件开启虚拟化功能 1.连接exsi主机,开启ssh功能 2.ssh到exsi主机,修改配置文件 查找 ...

  5. [terry笔记]redhat5.5_11gR2_RAC_安装

    redhat5.5_11gR2_RAC_安装,这篇主要记录RAC安装的执行步骤,最烦琐的就是前期配置,到后面图形界面runInstaller,asmca,dbca就很容易了. --hostname检查 ...

  6. FZU 1980 AbOr's story

    AbOr's story Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on FZU. Original I ...

  7. 生成apk文件遇到的编译问题error: format not a string literal and no format arguments

    编译错误时使用的android-ndk为r9的版本号.报下面错误: "Compile++ thumb : cocosdenshion_static <= SimpleAudioEngi ...

  8. CCEditBox/CCEditBoxImplAndroid

    #ifndef __CCEDITBOXIMPLANDROID_H__ #define __CCEDITBOXIMPLANDROID_H__ #include "cocos2d.h" ...

  9. Django是什么

    Django是什么 Django是什么? 是基于python语言的优秀的web开发框架.很多有名的网站比如youtube就是用django开发的. Python写的开源Web应用框架, 快速搭建blo ...

  10. C# App.config 自定义 配置节 出现的问题:配置系统未能初始化

    C# 读取app.config配置文件 节点键值,提示 "配置系统未能初始化" 错误的解决方案 新建C#项目,在app.config中添加了appSettings项,运行时出现&q ...