la4730(并查集+树状数组)
题意:有t组测试数据,第一个是n,代表有n个城市,标号为0~~n-1,接下来的n行,依次是标号为0~~n-1个城市的坐标,然后有m个操作,road操作代表着将两个点联通,line操作代表询问,直线y=c穿过多少个州,这些州总共有多少个城市。州就是有两个及以上的城市联通所形成的东西........
思路:我的初始思路是用并查集先链接起来,并且设置固定的根节点,并维护它们......想了好久,发现实现起来,非常困难。看《训练指南》上的思路,是用并查集把点连接起来,再把他们按照y坐标来更新.......具体思路是用到了树状数组的成段更新,单点查询......值得注意的地方,就是直线y=c中,c一定是一个带0.5小数的实数。这样的话,我们可以将它的小数部分去掉,但同时,在树状数组更新的时候,最顶端部分,我们要可以不去更新.......其他的看代码吧
代码很好看懂,就是用并查集来查询两个城市是否联通,联通的话,不管,否则,就开始更新,把原来所在区域的的州减去,州所附带的城市减去,然后把两个州合并成一个州,再将新形成的州和它所附带的城市加入所在区域。
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
#define min(x,y) x>y? y:x
#define max(x,y) x>y? x:y
int c[1000006][2],maxn;
struct node
{
int zx;
int zd;
int ans;
int father;
}t[100005];
int find(int x)
{
int root,i=x;
while(x!=t[x].father)
x=t[x].father;
root=x;
x=i;
while(x!=t[x].father)
{
i=t[x].father;
t[x].father=root;
x=i;
}
return root;
}
int lowbit(int x)
{
return x&(-x);
}
void updata(int x,int y,int k)
{
for(int i=x;i<=maxn;i+=lowbit(i))
{
c[i][y]+=k;
}
}
int getsum(int x,int y)
{
int sum=0;
for(int i=x;i>0;i-=lowbit(i))
{
sum+=c[i][y];
}
return sum;
}
int main()
{
int text;
scanf("%d",&text);
while(text--)
{
int n;
scanf("%d",&n);
memset(c,0,sizeof(c));
//for(int i=0;i<100005;i++)
//t[i].father=i;
maxn=0;
for(int i=0;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
y++;
t[i].father=i;
t[i].zx=t[i].zd=y;
t[i].ans=1;
if(maxn<y)
maxn=y;
}
int m;
scanf("%d",&m);
while(m--)
{
char ch[10];
scanf("%s",ch);
if(ch[0]=='r')
{
int tmp,tmp1;
scanf("%d%d",&tmp,&tmp1);
int a=find(tmp);
int b=find(tmp1);
if(a!=b)
{
updata(t[a].zx,0,-1);
updata(t[a].zd,0,1);
updata(t[a].zx,1,-t[a].ans);
updata(t[a].zd,1,t[a].ans);
updata(t[b].zx,0,-1);
updata(t[b].zd,0,1);
updata(t[b].zx,1,-t[b].ans);
updata(t[b].zd,1,t[b].ans);
if(a>b)
swap(a,b);
t[a].father=b;
t[b].zx=min(t[a].zx,t[b].zx);
t[b].zd=max(t[a].zd,t[b].zd);
t[b].ans+=t[a].ans;
updata(t[b].zx,0,1);
updata(t[b].zd,0,-1);
updata(t[b].zx,1,t[b].ans);
updata(t[b].zd,1,-t[b].ans);
}
}
else
{
double tmp;
scanf("%lf",&tmp);
int tmp1=(int)tmp+1;
printf("%d %d\n",getsum(tmp1,0),getsum(tmp1,1));
}
}
}
return 0;
}
la4730(并查集+树状数组)的更多相关文章
- 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 ...
- 【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颗也相 ...
- Hdu 5458 Stability (LCA + 并查集 + 树状数组 + 缩点)
题目链接: Hdu 5458 Stability 题目描述: 给出一个还有环和重边的图G,对图G有两种操作: 1 u v, 删除u与v之间的一天边 (保证这个边一定存在) 2 u v, 查询u到v的路 ...
随机推荐
- Orchard运用 - 学习资源分享
这段时间研究Orchard,看到一些资源十分有用. 比如国内还是有些牛人在分享心得,在此也广播一下给新手: JustRun对Orchard的一些代码分析 Orchard源码分析 Orchard中文社区 ...
- .net平台借助第三方推送服务在推送Android消息(极光推送)
最近做的.net项目(Windows Service)需要向Android手机发送推送消息,真是有点困难,没有搞过就不停的搜文档,最后看到了一个开源项目PushSharp,可以在.net平台推送IOS ...
- [转发] git设置代理
一. 写的很好推荐,(http与ssh设置都有) https://imciel.com/2016/06/28/git-proxy/ 二. 只有 http的方式代码设置 http://stackover ...
- ActiveMQ API 详解
4.1 开发JSM的步骤 广义上说,一个JMS 应用是几个JMS 客户端交换消息,开发JMS 客户端应用由以下几步构成: 用JNDI 得到ConnectionFactory 对象: ...
- ckeditor 实现图片上传以及预览(亲测有效)
引用ckeditor <script type="text/javascript" src="static/ckeditor/ckeditor.js"&g ...
- 最佳实践扩展Windows窗体DataGridView控件 .net 4.5 附示例代码
Windows窗体DataGridView控件的性能调优.net 4.5 在处理大量数据时, DataGridView 控制可以消耗大量的内存开销,除非你仔细地使用它. 在客户有限的内存,你可以避 ...
- 淘宝网前端开发面试题(一)--HTML & CSS 面试题
所有答案仅供参考,不负责答案对错(^_^) 1.DOCTYPE? 严格模式不混杂模式-如何触发这两种模式,区分它们有何意义? 分析: DOCTYPE(是DOCument TYPE的缩写,即文档类型)是 ...
- FileItem 出现部分中文乱码解决办法
首先要进行两处的修改: 第一:如果你使用了上传文件的包, 如:ServletFileUpload sfu = new ServletFileUpload(factory); sfu.setHeader ...
- Cocos2d-x 处理双击事件的两种方法
在cocos2d-x的开发过程中有些时候也是需要用到双击的事件处理,那么由于在cocos2d-x中没有实现对双击的事件的处理,那么我们就需要自己用代码实现. 下面介绍两种方式实现双击事件的处理. (一 ...
- win7 配置IIS + php 环境
一:开启win7 的IIS功能:并开启 CGI 二:下载php5 for windows 解压 三:打开IIS --->>处理程序映射- 参考:http://php.net/manual/ ...