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

【treaptree】HDOJ3726&&LA5031&&UVA1479GraphandQueries

在线转离线。。先构建出最终的图,然后逆着处理。。不过有几个要注意的地方。。。答案超int,要用longlong。。逆着处理的时候C操作要反着操作。。求第k大的时候,k可能是0或负数,也可能超过

在线转离线。。先构建出最终的图,然后逆着处理。。不过有几个要注意的地方。。。答案超int,要用long long。。逆着处理的时候C操作要反着操作。。求第k大的时候,k可能是0或负数,也可能超过集合元素个数。。

#include   
#include   
#include   
#include   
#include   
#include   
#include   
#include   
#include   
#include   
#include 
#include 
#include 
#define maxn 20005
#define eps 1e-10
#define mod 1000000009
#define INF 99999999  
#define lowbit(x) (x&(-x))  
//#define lson o<<1, L, mid  
//#define rson o<<1 | 1, mid+1, R  
typedef long long LL;
//typedef int LL;
using namespace std;

int value[maxn], n, m;
char s[100];
struct Edge
{
	int u, v, done;
}edges[60005];
struct opr
{
	int kk, x, y;
}op[1000005];
int opp, cnt;
LL ans;
int f[maxn], num[maxn];
struct node
{
	int key, v, s;
	struct node *ch[2];
	int cmp(int x) const {
		if(x == v) return -1;
		return x s + ch[1]->s + 1;
	}
}*null, *root[maxn];

void read(void)
{
	opp = 0;
	for(int i = 1; i <= n; i++) scanf("%d", &value[i]);
	for(int i = 1; i <= m; i++) scanf("%d%d", &edges[i].u, &edges[i].v), edges[i].dOne= 0;
	while(scanf("%s", s)!=EOF) {
		if(s[0] == 'E') break;
		if(s[0] == 'D') op[opp].kk = 0, scanf("%d", &op[opp++].x), edges[op[opp-1].x].dOne= 1;
		if(s[0] == 'Q') op[opp].kk = 1, scanf("%d%d", &op[opp].x, &op[opp].y), opp++;
		if(s[0] == 'C') op[opp].kk = 2, scanf("%d%d", &op[opp].x, &op[opp].y), swap(op[opp].y, value[op[opp].x]), opp++;
	}
}
void init(void)
{
	int i;
	ans = cnt = 0;
	for(i = 0; i s = null->v = 0;
	for(i = 0; i <= n; i++) {
		root[i] = new node;
		root[i] = null;
	}
}
int find(int x)
{
	return f[x] == x ? f[x] : find(f[x]);
}
void rotate(node* &o, int d)
{
	node *k = o->ch[d^1]; o->ch[d^1] = k->ch[d], k->ch[d] = o;
	o->maintain(), k->maintain(), o = k;
}
void insert(node* &o, int x)
{
	if(o == null) {
		o = new node;
		o->key = rand(), o->v = x;
		o->s = 1, o->ch[0] = o->ch[1] = null;
		return;
	}
	int d = x v ? 0 : 1;
	insert(o->ch[d], x);
	if(o->key ch[d]->key) rotate(o, d^1);
	o->maintain();
}
void remove(node* &o, int x)
{
	int d = o->cmp(x);
	if(d == -1) {
		if(o->ch[0] != null && o->ch[1] != null) {
			int d2 = (o->ch[0]->key > o->ch[1]->key ? 1 : 0);
			rotate(o, d2), remove(o->ch[d2], x);
		}
		else {
			node *u = o;
			if(o->ch[0] == null) o = o->ch[1];
			else o = o->ch[0];
			delete u;
		}
	}
	else remove(o->ch[d], x);
	if(o != null) o->maintain();
}
int kth(node *o, int k)
{
	if(o == null || o->s ch[1]->s >= k) return kth(o->ch[1], k);
	if(o->ch[1]->s + 1 == k) return o->v;
	return kth(o->ch[0], k - o->ch[1]->s - 1);
}
void debug(node* o)
{
	printf("FSDF  %d\n", o->v);
	if(o->ch[0] != null) debug(o->ch[0]);
	if(o->ch[1] != null) debug(o->ch[1]);
}
void removetree(node* &o, node* &p)
{
	if(o == null) return;
	if(o->ch[0] != null) removetree(o->ch[0], p);
	if(o->ch[1] != null) removetree(o->ch[1], p);
	insert(p, o->v);
	delete o;
}
void updata(int a, int v)
{
	int aa = find(a);
	remove(root[aa], value[a]);
	value[a] = v;
	insert(root[aa], value[a]);
}
void query(int a, int k)
{
	int aa = find(a);
	ans += kth(root[aa], k);
}
void merge(int a, int b)
{
	int aa = find(a), bb = find(b);
	if(aa == bb) return;
	if(num[aa] > num[bb]) {
		removetree(root[bb], root[aa]);
		f[bb] = aa, num[aa] += num[bb], num[bb] = 0;
		root[bb] = null;
	}
	else {
		removetree(root[aa], root[bb]);
		f[aa] = bb, num[bb] += num[aa], num[aa] = 0;
		root[aa] = null;
	}
}
void work(void)
{
	int i, aa, bb;
	for(i = 1; i <= m; i++)
		if(!edges[i].done) {
			aa = find(edges[i].u);
			bb = find(edges[i].v);
			if(aa != bb) {
				if(aa > bb) f[aa] = bb, num[bb] += num[aa], num[aa] = 0;
				else f[bb] = aa, num[aa] += num[bb], num[bb] = 0;
			}
		}
	for(i = 1; i <= n; i++) insert(root[find(i)], value[i]);
	for(i = opp-1; i >= 0; i--) {
		if(op[i].kk == 0) merge(edges[op[i].x].u, edges[op[i].x].v);
		if(op[i].kk == 1) query(op[i].x, op[i].y), cnt++;
		if(op[i].kk == 2) updata(op[i].x, op[i].y);
	}
}
int main(void)
{
	int _ = 0;
	while(scanf("%d%d", &n, &m), n!=0 || m!=0) {
		init();
		read();
		work();
		printf("Case %d: %.6f\n", ++_, ans/(double)cnt);
	}
	return 0;
}



推荐阅读
  • 寒假作业解析:第三周 2月12日 第7题
    尽快完成之前的练习任务!每日一练2.1 Problem A Laurenty and Shop 的题目要求是选择两条不同的路线以最小化总的等待时间。简要分析:通过对比不同路线的等待时间,可以找到最优解。此问题可以通过动态规划或贪心算法来解决,具体取决于路线的复杂性和约束条件。 ... [详细]
  • 在尝试对 QQmlPropertyMap 类进行测试驱动开发时,发现其派生类中无法正常调用槽函数或 Q_INVOKABLE 方法。这可能是由于 QQmlPropertyMap 的内部实现机制导致的,需要进一步研究以找到解决方案。 ... [详细]
  • 题目解析给定 n 个人和 n 种书籍,每个人都有一个包含自己喜好的书籍列表。目标是计算出满足以下条件的分配方案数量:1. 每个人都必须获得他们喜欢的书籍;2. 每本书只能分配给一个人。通过使用深度优先搜索算法,可以系统地探索所有可能的分配组合,确保每个分配方案都符合上述条件。该方法能够有效地处理这类组合优化问题,找到所有可行的解。 ... [详细]
  • 单链表的高效遍历及性能优化策略
    本文探讨了单链表的高效遍历方法及其性能优化策略。在单链表的数据结构中,插入操作的时间复杂度为O(n),而遍历操作的时间复杂度为O(n^2)。通过在 `LinkList.h` 和 `main.cpp` 文件中对单链表进行封装,我们实现了创建和销毁功能的优化,提高了单链表的使用效率。此外,文章还介绍了几种常见的优化技术,如缓存节点指针和批量处理,以进一步提升遍历性能。 ... [详细]
  • 在洛谷 P1344 的坏牛奶追踪问题中,第一问要求计算最小割,而第二问则需要找到割边数量最少的最小割。通过为每条边附加一个单位权值,可以在求解最小割时优先选择边数较少的方案,从而同时解决两个问题。这种策略不仅简化了问题的求解过程,还确保了结果的最优性。 ... [详细]
  • 本文详细解析了使用C++实现的键盘输入记录程序的源代码,该程序在Windows应用程序开发中具有很高的实用价值。键盘记录功能不仅在远程控制软件中广泛应用,还为开发者提供了强大的调试和监控工具。通过具体实例,本文深入探讨了C++键盘记录程序的设计与实现,适合需要相关技术的开发者参考。 ... [详细]
  • 开发笔记:实现1353表达式中的括号匹配(栈的应用) ... [详细]
  • 在C++程序中,文档A的每一行包含一个结构体数据,其中某些字段可能包含不同数量的数字。需要将这些结构体数据逐行读取并存储到向量中,随后不仅在控制台上显示,还要输出到新创建的文档B中。希望得到指导,感谢! ... [详细]
  • 在C语言中,指针的高级应用及其实例分析具有重要意义。通过使用 `&` 符号可以获取变量的内存地址,而 `*` 符号则用于定义指针变量。例如,`int *p;` 定义了一个指向整型的指针变量 `p`。其中,`p` 代表指针变量本身,而 `*p` 则表示指针所指向的内存地址中的内容。此外,指针在不同函数中可以具有相同的变量名,但其作用域和生命周期会有所不同。指针的灵活运用能够有效提升程序的效率和可维护性。 ... [详细]
  • 在使用 Qt 进行 YUV420 图像渲染时,由于 Qt 本身不支持直接绘制 YUV 数据,因此需要借助 QOpenGLWidget 和 OpenGL 技术来实现。通过继承 QOpenGLWidget 类并重写其绘图方法,可以利用 GPU 的高效渲染能力,实现高质量的 YUV420 图像显示。此外,这种方法还能显著提高图像处理的性能和流畅性。 ... [详细]
  • 经过两天的努力,终于成功解决了半平面交模板题POJ3335的问题。原来是在`OnLeft`函数中漏掉了关键的等于号。通过这次训练,不仅加深了对半平面交算法的理解,还提升了调试和代码实现的能力。未来将继续深入研究计算几何的其他核心问题,进一步巩固和拓展相关知识。 ... [详细]
  • 本文深入探讨了佩尔方程 \( x^2 - dy^2 = 1 \) 的递推关系式。通过构造特定的矩阵并利用矩阵快速幂的方法,可以高效地计算出该方程的第 k 组解。此外,文章还详细分析了递推关系式的数学背景及其在数论中的应用,为相关研究提供了坚实的理论基础。 ... [详细]
  • 本文详细介绍了使用 Python 进行 MySQL 和 Redis 数据库操作的实战技巧。首先,针对 MySQL 数据库,通过 `pymysql` 模块展示了如何连接和操作数据库,包括建立连接、执行查询和更新等常见操作。接着,文章深入探讨了 Redis 的基本命令和高级功能,如键值存储、列表操作和事务处理。此外,还提供了多个实际案例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 蓝桥杯算法实战:节点选取策略优化分析
    本文针对蓝桥杯算法竞赛中的节点选取策略进行了深入分析与优化。通过对比不同节点选择方法的效果,提出了基于贪心算法和动态规划的综合优化方案,旨在提高算法效率和准确性。实验结果表明,该优化策略在处理大规模数据集时表现出色,显著提升了算法性能。 ... [详细]
  • 在解决区间相关问题时,我发现自己经常缺乏有效的思维方式,即使是简单的题目也常常需要很长时间才能找到解题思路,而一旦得到提示便能迅速理解。题目要求对一个包含n个元素的数组进行操作,并给出一个参数k,具体任务是…… ... [详细]
author-avatar
走丢的鞋带2702934823
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有