博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVA 1455 Kingdom 线段树+并查集
阅读量:7185 次
发布时间:2019-06-29

本文共 2157 字,大约阅读时间需要 7 分钟。

并查集维护:y的最大最小值、城市数量

线段树维护:城市数量,洲数量

合并两个集合时,先在线段树上删除两个子集合的旧的信息,然后再将合并完的新集合更新到线段树。

//#pragma comment(linker, "/STACK:1024000000,1024000000")#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;typedef long long ll;typedef pair
pii;#define pb(a) push_back(a)#define INF 0x1f1f1f1f#define lson idx<<1,l,mid#define rson idx<<1|1,mid+1,r#define PI 3.1415926535898template
T min(const T& a,const T& b,const T& c) { return min(min(a,b),min(a,c));}template
T max(const T& a,const T& b,const T& c) { return max(max(a,b),max(a,c));}void debug() {#ifdef ONLINE_JUDGE#else freopen("d:\\in.txt","r",stdin); // freopen("d:\\out1.txt","w",stdout);#endif}int getch() { int ch; while((ch=getchar())!=EOF) { if(ch!=' '&&ch!='\n')return ch; } return EOF;}const int maxn=1001000;const int N=100100;struct Tree{ int add1[maxn<<2],add2[maxn<<2]; int build() { memset(add1,0,sizeof(add1)); memset(add2,0,sizeof(add2)); return 0; } int update(int idx,int l,int r,int tl,int tr,int ad1,int ad2) { if(tl<=l&&tr>=r) { add1[idx]+=ad1; add2[idx]+=ad2; return 0; } int mid=(r+l)>>1; if(tl<=mid)update(lson,tl,tr,ad1,ad2); if(tr>mid)update(rson,tl,tr,ad1,ad2); return 0; } int query(int idx,int l,int r,int pos,int &a,int &b) { a+=add1[idx]; b+=add2[idx]; if(l==r)return 0; int mid=(r+l)>>1; if(pos<=mid)query(lson,pos,a,b); else query(rson,pos,a,b); return 0; }}tree;struct union_find{ int maxv[N],minv[N],num[N]; int da[N]; void init(int *y,int n) { for(int i=0;i
minv[fa])tree.update(1,0,1000000,minv[fa],maxv[fa]-1,-num[fa],-1); if(maxv[fb]>minv[fb])tree.update(1,0,1000000,minv[fb],maxv[fb]-1,-num[fb],-1); num[fa]+=num[fb]; maxv[fa]=max(maxv[fa],maxv[fb]); minv[fa]=min(minv[fa],minv[fb]); da[fb]=fa; if(maxv[fa]>minv[fa])tree.update(1,0,1000000,minv[fa],maxv[fa]-1,num[fa],1); } }}uf;int x[N],y[N];int main(){ int t; scanf("%d",&t); for(int ca=1;ca<=t;ca++) { int n; scanf("%d",&n); for(int i=0;i
View Code

 

转载于:https://www.cnblogs.com/BMan/p/3359352.html

你可能感兴趣的文章
Oracle分区测试
查看>>
单链表的删除
查看>>
输入函数
查看>>
Session,Cookie的问题
查看>>
记录前端遇到的坑
查看>>
Matlab查看数值不用科学计数法显示
查看>>
C# 读取资源文件.resx 中的xml资源
查看>>
python版mapreduce题目实现寻找共同好友
查看>>
提高mysql千万级大数据SQL查询优化30条经验(Mysql索引优化注意)
查看>>
前端性能优化(css动画篇)
查看>>
用户体验评价
查看>>
[SCOI2012]滑雪与时间胶囊
查看>>
phonegap ios开发环境搭建
查看>>
NOIP2003 传染病控制
查看>>
【java】深入分析Java ClassLoader原理
查看>>
c# 自定义事件,实现变量的值改变后就触发该事件
查看>>
AMD OpenCL大学教程(8)
查看>>
【转】实现运动的尾巴效果
查看>>
leetcode Permutations II 无重全排列
查看>>
微信开发好的地址
查看>>