热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

BZOJ1095【动态点分治】【优先队列】

学会了用priority_queue实现带删除操作的堆.*Iwillwaitforyou*#include<cstdio>#include&l

学会了用priority_queue实现带删除操作的堆.

/* I will wait for you*/

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define make make_pair
#define fi first
#define se second

using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef pair pii;

const int maxn = 200010;
const int maxm = 1010;
const int maxs = 26;
const int inf = 0x3f3f3f3f;
const int P = 1000000007;
const double error = 1e-9;

inline int read()
{
	int x = 0, f = 1;
	char ch = getchar();
	while (ch <= 47 || ch >= 58)
		f = (ch == 45 ? -1 : 1), ch = getchar();
	while (ch >= 48 && ch <= 57)
		x = x * 10 + ch - 48, ch = getchar();
	return x * f;
}

struct edge
{
	int v, next;
} e[maxn];

struct heap
{
	priority_queue A, B;

	void push(int c) {
		A.push(c);
	}

	void erase(int c) {
		B.push(c);
	}

	void pop() {
		while (B.size() && A.top() == B.top())
			A.pop(), B.pop();
		A.pop();
	}

	int size() {
		return A.size() - B.size();
	}

	int first() {
		while (B.size() && A.top() == B.top())
			A.pop(), B.pop();
		return A.size() ? A.top() : 0;
	}

	int second() {
		if (size() <2)
			return 0;
		int x, y;
		x = first(), pop();
		y = first(), push(x);
		return y;
	}
} A, B[maxn >> 1], C[maxn >> 1];

int n, m, root, cnt, dfn, sum, tot, bin[maxn], lg[maxn],
    size[maxn], deep[maxn], sm[maxn], head[maxn], fa[maxn],
    st[maxn][20], pos[maxn], del[maxn], col[maxn];

void insert(int u, int v)
{
	e[cnt] = (edge) {v, head[u]}, head[u] = cnt++;
	e[cnt] = (edge) {u, head[v]}, head[v] = cnt++;
}

void dfs(int u, int p)
{
	st[++dfn][0] = deep[u], pos[u] = dfn;
	
	for (int i = head[u]; i != -1; i = e[i].next) {
		int v = e[i].v;
		if (v != p) {
			deep[v] = deep[u] + 1, dfs(v, u);
			st[++dfn][0] = deep[u];
		}
	}
}

void find(int u, int p)
{
	size[u] = 1, sm[u] = 0;
	
	for (int i = head[u]; i != -1; i = e[i].next) {
		int v = e[i].v;
		if (v != p && !del[v]) {
			find(v, u), size[u] += size[v];
			sm[u] = max(sm[u], size[v]);
		}
	}

	sm[u] = max(sm[u], sum - size[u]);

	if (sm[u]  v)
		swap(u, v);
	int t = lg[v - u + 1];

	return min(st[u][t], st[v - bin[t] + 1][t]);
}

int dis(int u, int v)
{
	return deep[u] + deep[v] - 2 * lca(u, v);
}

void turn_off(int u, int p)
{
	if (u == p) {
		B[u].push(0);
		if (B[u].size() == 2)
			A.push(B[u].first());
	}

	if (!fa[p])
		return;

	int f = fa[p], d = dis(u, f), tmp = C[p].first();

	C[p].push(d);

	if (d > tmp) {
		int mx = B[f].first() + B[f].second(),
		    size = B[f].size();

		B[f].push(d);

		if (tmp)
			B[f].erase(tmp);

		int now = B[f].first() + B[f].second();

		if (now > mx) {
			if (size >= 2)
				A.erase(mx);
			if (B[f].size() >= 2)
				A.push(now);
		}
	}

	turn_off(u, f);
}

void turn_on(int u, int p)
{
	if (u == p) {
		if (B[u].size() == 2)
			A.erase(B[u].first());
		B[u].erase(0);
	}

	if (!fa[p])
		return;
	
	int f = fa[p], d = dis(u, f), tmp = C[p].first();

	C[p].erase(d);

	if (d == tmp) {
		int mx = B[f].first() + B[f].second(),
		    size = B[f].size();

		B[f].erase(d);
		
		if (C[p].first())
			B[f].push(C[p].first());

		int now = B[f].first() + B[f].second();

		if (now = 2)
				A.erase(mx);
			if (B[f].size() >= 2)
				A.push(now);
		}
	}

	turn_on(u, f);
}	

void init()
{
	bin[0] = 1;
	for (int i = 1; i <= 20; i++)
		bin[i] = bin[i - 1] <<1;

	lg[0] = -1;
	for (int i = 1; i <= 200000; i++)
		lg[i] = lg[i >> 1] + 1;
}

int main()
{
	n = read(), init();

	memset(head, -1, sizeof head);	
	for (int i = 1; i  
 


推荐阅读
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 006_Redis的List数据类型
    1.List类型是一个链表结构的集合,主要功能有push,pop,获取元素等。List类型是一个双端链表的结构,我们可以通过相关操作进行集合的头部或者尾部添加删除元素,List的设 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
author-avatar
mobiledu2502886833
这个家伙很懒,什么也没留下!
Tags | 热门标签
RankList | 热门文章
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有