首页 > 其他分享 >Luogu8990 做题记录

Luogu8990 做题记录

时间:2024-09-06 16:15:29浏览次数:10  
标签:Luogu8990 min ll 记录 tr maxn define lld

link

比较喜欢的题目。

考虑合法的条件,从点亮的灯的角度难以维护。反过来看,从未点亮的灯角度考虑,条件相当于这些灯形成了一个包含 \(1\) 号灯的连通块。

如何判定这些灯形成一个连通块?点减边!设 \(c_i\) 为操作前 \(i\) 次后,未点亮的灯的 \(|V| - |E|\) 的值,那么 \(c_i = 1\) 即合法。

对于固定的 \(i\),\(|V|\) 是固定的,等于 \(n - i\),可以先初始化 \(c_i = n - i\)。对于 \(|E|\),我们考虑每一条边的贡献。设 \(b_u\) 表示 \(u\) 号灯被点亮的时间,那么对于边 \((u,v)\),在时刻 \(1\sim \min(b_u, b_v) - 1\) 时有贡献,令 \(c_{1\sim \min(b_u, b_v) - 1}\) 减一。

对于 \(c_i = 1\),我们考虑如何计算答案。仍然考虑每条边的贡献,一条边有贡献的条件是两端的灯一个点亮,一个未点亮。设 \(w_i\) 为 \(i\) 时刻这样的边的数量,对于边 \((u,v)\),令 \(w_{\min(b_u, b_v) \sim \max(b_u, b_v) - 1}\) 加一。我们相当于求 \(\sum_{i = 1} ^ {n - 1} [c_i = 1] w_i\)。

多次询问时,由于我们并不关心树的形态,而只关心每条边的贡献,所以可以轻松使用线段树维护。具体的,维护 \(\min c,\ \sum_i [c_i = \min c], \ \sum_i [c_i = \min c] w_i\) 三个信息。

点击查看代码
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned ll
#define pir pair <ll, ll>
#define mkp make_pair
#define fi first
#define se second
#define pb push_back
using namespace std;
const ll maxn = 5e5 + 10, inf = 1e18;
ll n, m, x[maxn], y[maxn], a[maxn], b[maxn];
struct SGT {
	ll mn[maxn << 2], cnt[maxn << 2], sum[maxn << 2];
	ll tagmn[maxn << 2], tagw[maxn << 2];
	void addtag(ll p, ll v1, ll v2) {
		mn[p] += v1, tagmn[p] += v1;
		sum[p] += v2 * cnt[p], tagw[p] += v2;
	}
	void pushdown(ll p) {
		addtag(p << 1, tagmn[p], tagw[p]);
		addtag(p << 1|1, tagmn[p], tagw[p]);
		tagmn[p] = tagw[p] = 0;
	}
	void modify(ll p, ll l, ll r, ll ql, ll qr, ll v1, ll v2) {
		if(ql <= l && r <= qr) { addtag(p, v1, v2); return; }
		pushdown(p); ll mid = l + r >> 1;
		if(ql <= mid) modify(p << 1, l, mid, ql, qr, v1, v2);
		if(mid < qr) modify(p << 1|1, mid + 1, r, ql, qr, v1, v2);
		mn[p] = min(mn[p << 1], mn[p << 1|1]), cnt[p] = sum[p] = 0;
		if(mn[p << 1] == mn[p])
			cnt[p] += cnt[p << 1], sum[p] += sum[p << 1];
		if(mn[p << 1|1] == mn[p])
			cnt[p] += cnt[p << 1|1], sum[p] += sum[p << 1|1];
	}
	void build(ll p, ll l, ll r) {
		mn[p] = n - r, cnt[p] = 1;
		if(l == r) return;
		ll mid = l + r >> 1;
		build(p << 1, l, mid), build(p << 1|1, mid + 1, r);
	}
} tr;
void add(ll x, ll y, ll v) {
	if(min(b[x], b[y]) > 1)
		tr.modify(1, 1, n - 1, 1, min(b[x], b[y]) - 1, -v, 0);
	tr.modify(1, 1, n - 1, min(b[x], b[y]), max(b[x], b[y]) - 1, 0, v);
}
int main() {
	scanf("%lld%lld", &n, &m);
	for(ll i = 1; i < n; i++)
		scanf("%lld%lld", x + i, y + i);
	for(ll i = 1; i < n; i++) {
		scanf("%lld", a + i);
		b[a[i]] = i;
	} b[a[n] = 1] = n; tr.build(1, 1, n - 1);
	for(ll i = 1; i < n; i++)
		add(x[i], y[i], 1);
	printf("%lld\n", tr.sum[1]);
	while(m--) {
		ll u, v, p, q; scanf("%lld%lld%lld%lld", &u, &v, &p, &q);
		add(u, v, -1), add(p, q, 1);
		printf("%lld\n", tr.sum[1]);
	}
	return 0;
}

标签:Luogu8990,min,ll,记录,tr,maxn,define,lld
From: https://www.cnblogs.com/Sktn0089/p/18400461

相关文章

  • 2024年9月26日记录网站安全性配置优化
    1、修改apache配置httpd.conf文件 #关闭trace-methodTraceEnableoff#隐藏Apache版本信息ServerSignatureOffServerTokensProductOnly2、修改网站配置文件,不允许777目录执行任何可执行脚本<VirtualHost*:801>ServerNamewww.website.comServe......
  • 记录BUUCTF 中 的一道hook掉函数地址的题目
    题目[Zer0pts2020]easystrcmp1https://files.buuoj.cn/files/2961ba55f464e750aca703838dfca234/easy_strcmp_e1a6208fde4f52fd0c653c0b7e8ff614.tar.gz刚开始在main函数中发现if(!strcmp(a2[1],"zer0pts{********CENSORED********}"))puts("Correct!......
  • 记录 ThreadPoolExecutor任务队列放入任务的方式
    众所周知,ThreadPoolExecutor内部任务队列属性类型定义为:privatefinalBlockingQueueworkQueue;而其有三种提交任务方式:add、put和offer,好奇其内部用的哪个,又不想查资料,故而跳到源码内部一看。结果如下:三种提交任务方式:put(Eelement):将指定元素插入队列,如果队列已满,则阻塞......
  • 【随手记录】关于docker启动后一直处于Active: activating (start)状态
    docker部署之后systemctlstartdocker启动服务,服务状态一直处于Active:activating(start)状态,使用journalctl-n50|grepdocker查看日志,第一次发现有错误信息:warningmsg="couldnotchangegroup/var/run/docker.socktodocker:groupdockernotfound"这个错误表......
  • 微信聊天记录找回,守护你的珍贵记忆
    在这个信息爆炸的时代,微信已成为我们日常生活中不可或缺的一部分。它不仅连接着我们的亲朋好友,更承载着无数珍贵的回忆和重要的信息。然而,数据丢失的阴影始终潜伏,一旦发生,那些珍贵的对话、重要的文件、温馨的瞬间,都可能瞬间消失,留下的只有无尽的遗憾和焦急。但请记住,希望之光从......
  • 学会这三招,没人比你更快恢复聊天记录
    那些记录着生活点滴的微信对话,不仅仅是文字,更是情感的寄托和时间的见证。现代都市人在数字世界中寻找遗失记忆的缩影。它提醒我们,在享受科技带来的便利的同时,也要时刻警惕数据安全,珍惜那些通过屏幕传递的温暖与情感。我来告诉大家聊天记录不慎丢失了该如何恢复第一步打开手机......
  • LeetCode Hot100刷题记录-21. 合并两个有序链表
    题目描述:将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。需要知道的pre-knowledge:list1和list2起初可直接代表两个链表的头节点,无需用另外的变量比如current来表示头节点。思路:准备一个虚拟节点,指向合并完成新链表的h......
  • LeetCode Hot100刷题记录-206. 反转链表
    206.反转链表题目描述:给你单链表的头节点head,请你反转链表,并返回反转后的链表。这道题要用到两个指针,一个current指向当前节点,另一个prev指向当前节点的上一个节点。首先让current指向头节点head,prev指向head的前一个也就是null,这里要用next变量来暂时存储current的下一个......
  • 记录 VMware Workstation 官方下载方式
    VMwareWorkstation对个人使用已免费,但想找到官方下载地址很困难,在此记录一下下载地址:https://support.broadcom.com/group/ecx/productdownloads?subfamily=VMware+Workstation+Pro有账号的话直接登录,没有的话右上角注册即可(注册后需要主动登录)经过不太友好的登录后,再次访问......
  • 【模仿学习代码复现】环境安装踩坑记录
    (这人怎么又在装环境)下载了一下OpenAI的论文代码,官方readme里的依赖设置如下:*OpenAIGym>=0.1.0,mujoco_py>=0.4.0*numpy>=1.10.4,scipy>=0.17.0,theano>=0.8.2*h5py,pytables,pandas,matplotlib前面都好好的,装到theano突然发现这破玩意不支持3.6及以上版本,......