LA_4730 Kingdom 并查集+树状数组
给定N个点的坐标,代表N各城市,有M种操作,共分两种,一种是连线,把两个点连起来(一旦构成连通图,这个连通图即为一个州),还有种询问操作,为y=c,(c为小数部分恒为.5的实数),问y=c这条线经过了多少个大周,这些州总共有多少个城市
很明显要用到并查集,比较好的做法是把并查集落实到线段树上,并查集维护的是每个集合的最大y和最小y,以及rank表示集合数目。但是线段树要用到离散化、
然后参照一个用树状数组的博客,其实思路差不多,都是把每次的变更落实到树上
不过这个树状数组跟之前写的不一样,这个是改段查点型的,之前的是改点查段型的,其实只要改一下辅助数组的定义即可,在这个树状数组里面,把辅助数组d当做从1到当前所有的变更,每次更新时从当前往递减方向,所以,为了得到某个点值,必须把当前点以及当前之前的变更都加起来。
所以这个
add(int loc,int v)
{
while (loc>0){d[loc]+=v;loc-=lowbit(loc);}
}
query(int loc)
{
int ret=0;
while (loc<n) {ret+=d[loc];loc+=lowbit(loc);}
return ret;
}
因为给定的数是.5的实数,故意把坐标往后压一位即可,把每一个小格子往后压成一个点即可
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; int n,m;
int f[],rank[],y1[],y2[];
void init()
{
for (int i=;i<=n;i++){
f[i]=i;
rank[i]=;
}
}
int findset(int x)
{
if (x!=f[x]){
f[x]=findset(f[x]);
}
return f[x];
}
int lowbit(int x)
{
return x&(-x);
}
struct bit
{
int d[];
int limit;
void clear()
{
memset(d,,sizeof d);
}
void add(int L,int R,int v){
while (R>=){
d[R]+=v;
R-=lowbit(R);
}
while (L>=){
d[L]+=-v;
L-=lowbit(L); //L这里不能算点,因为每个格子都往后压,每个点x,就代表x-1到x这个区间,所以在这里可以抵消L的格子的影响
}
}
int query(int x)
{
int ret=;
while (x<=limit){
ret+=d[x];
x+=lowbit(x);
}
return ret;
}
}city,state;
void unit(int r1,int r2)
{
f[r1]=r2;
rank[r2]+=rank[r1];
}
int main()
{
int t;
scanf("%d",&t);
int a,b;
double c;
char ch[];
while (t--)
{
city.clear();
state.clear();
scanf("%d",&n);
init();
int maxn=;
for (int i=;i<n;i++){
scanf("%d%d",&a,&b);
y1[i]=b;y2[i]=b;
maxn=max(maxn,b);
}
city.limit=state.limit=maxn;
scanf("%d",&m);
for (int i=;i<=m;i++){
scanf("%s",ch);
if (ch[]=='r'){
scanf("%d%d",&a,&b);
int r1=findset(a);
int r2=findset(b);
if (r1==r2) continue;
if (rank[r1]== && rank[r2]==){
unit(r1,r2);
y1[r2]=min(y1[r2],y1[r1]);
y2[r2]=max(y2[r2],y2[r1]);
city.add(y1[r2],y2[r2],);
state.add(y1[r2],y2[r2],rank[r2]);
}
else
if (rank[r1]== || rank[r2]==){
if (rank[r1]==) swap(r1,r2);
city.add(y1[r1],y2[r1],-);
state.add(y1[r1],y2[r1],-rank[r1]);
unit(r1,r2);
y1[r2]=min(y1[r1],y1[r2]);
y2[r2]=max(y2[r1],y2[r2]);
city.add(y1[r2],y2[r2],);
state.add(y1[r2],y2[r2],rank[r2]);
}
else
{
city.add(y1[r1],y2[r1],-);
state.add(y1[r1],y2[r1],-rank[r1]); city.add(y1[r2],y2[r2],-);
state.add(y1[r2],y2[r2],-rank[r2]); unit(r1,r2);
y1[r2]=min(y1[r1],y1[r2]);
y2[r2]=max(y2[r1],y2[r2]);
city.add(y1[r2],y2[r2],);
state.add(y1[r2],y2[r2],rank[r2]);
}
}
else {
scanf("%lf",&c);
int tmp=c;
tmp++;
printf("%d %d\n",city.query(tmp),state.query(tmp));
}
}
}
return ;
}
LA_4730 Kingdom 并查集+树状数组的更多相关文章
- BZOJ-3211花神游历各国 并查集+树状数组
一开始想写线段树区间开方,简单暴力下,但觉得变成复杂度稍高,懒惰了,编了个复杂度简单的 3211: 花神游历各国 Time Limit: 5 Sec Memory Limit: 128 MB Subm ...
- BZOJ3211 花神游历各国 并查集 树状数组
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3211 题意概括 有n个数形成一个序列. m次操作. 有两种,分别是: 1. 区间开根(取整) 2. ...
- hdu 6200 mustedge mustedge(并查集+树状数组 或者 LCT 缩点)
hdu 6200 mustedge mustedge(并查集+树状数组 或者 LCT 缩点) 题意: 给一张无向连通图,有两种操作 1 u v 加一条边(u,v) 2 u v 计算u到v路径上桥的个数 ...
- 【bzoj4869】[Shoi2017]相逢是问候 扩展欧拉定理+并查集+树状数组
题目描述 Informatik verbindet dich und mich. 信息将你我连结. B君希望以维护一个长度为n的数组,这个数组的下标为从1到n的正整数.一共有m个操作,可以分为两种:0 ...
- HDU 5458 Stability(双连通分量+LCA+并查集+树状数组)(2015 ACM/ICPC Asia Regional Shenyang Online)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5458 Problem Description Given an undirected connecte ...
- la4730(并查集+树状数组)
https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=30& ...
- 【BZOJ3211】花神游历各国 并查集+树状数组
[BZOJ3211]花神游历各国 Description Input Output 每次x=1时,每行一个整数,表示这次旅行的开心度 Sample Input 41 100 5 551 1 22 1 ...
- HDU 4750 Count The Pairs ★(图+并查集+树状数组)
题意 给定一个无向图(N<=10000, E<=500000),定义f[s,t]表示从s到t经过的每条路径中最长的边的最小值.Q个询问,每个询问一个t,问有多少对(s, t)使得f[s, ...
- 【BZOJ4382】[POI2015]Podział naszyjnika 堆+并查集+树状数组
[BZOJ4382][POI2015]Podział naszyjnika Description 长度为n的一串项链,每颗珠子是k种颜色之一. 第i颗与第i-1,i+1颗珠子相邻,第n颗与第1颗也相 ...
随机推荐
- 多元线性回归算法的python底层代码编写实现
1.对于多元线性回归算法,它对于数据集具有较好的可解释性,我们可以对比不过特征参数的输出系数的大小来判断它对数据的影响权重,进而对其中隐含的参数进行扩展和收集,提高整体训练数据的准确性. 2.多元回归 ...
- 2017北京网络赛 J Pangu and Stones 区间DP(石子归并)
#1636 : Pangu and Stones 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 In Chinese mythology, Pangu is the fi ...
- Ayoub's function
思维,就是反过来想,题解太强了 #include <bits/stdc++.h> using namespace std; int main() { long long t; cin> ...
- 蓝桥杯 2n皇后问题
题意: 问题描述 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行.同一列或同一条对角线上,任意的两个白皇后都不在同一行.同一 ...
- Rabbitmq与spring整合之重要组件介绍——rabbitAdmin组件
rabbitAdmin组件是一个管理组件,主要是用户通过该组件进行rabbitmq的队列交换器虚拟主机等等进行操作.这里面有些教程说不用声明可以直接绑定,但是本博主运行时,不生命情况下就会报错,可能是 ...
- 动态设置html根字体大小(随着设备屏幕的大小而变化,从而实现响应式)
代码如下:如果设置了根字体大小,font-size必须是rem var html =document.querySelector('html'); html.style.fontSize = docu ...
- 我的第一个爬虫【python selenium】
去年写的一个小功能,一年过得好快,好快! 目的:爬取京东商品详情页面的内容(商品名称.价格.评价数量)后存储到xls文档中,方便商家分析自己商品的动态. 软件:chrome(windows).chro ...
- SpringBoot#ConfigurationProperties注解相关的一些知识
用途:ConfigurationProperties注解,用于在spring环境定义bean的时候.通过这个注解,把配置文件中的相关属性注入到实例化的bean中. 原理:spring中bean的生命周 ...
- [笔记]ul>li>a做分布时, 让其居中显示效果
结构: <div id="page"> <ul> <li><a href="#">首页</a>< ...
- hashCode() 和 equals()的问题解答及重写示范
本章的内容主要解决下面几个问题: 1 equals() 的作用是什么? 2 equals() 与 == 的区别是什么? 3 hashCode() 的作用是什么? 4 hashCode() 和 equa ...