洛谷P1501 [国家集训队] Tree II

news/2025/3/25 19:05:41/文章来源:https://www.cnblogs.com/OrangeRED/p/18788407

也是水上一段时间了。

新的科研项目到手了呢~

洛谷P1501 [国家集训队] Tree II

一、题目大意

一棵 \(n\) 个点的树,每个点的初始权值为 \(1\)
对于这棵树有 \(q\) 个操作,每个操作为以下四种操作之一:

  • + u v c:将 \(u\)\(v\) 的路径上的点的权值都加上自然数 \(c\)
  • - u1 v1 u2 v2:将树中原有的边 \((u_1,v_1)\) 删除,加入一条新边 \((u_2,v_2)\),保证操作完之后仍然是一棵树;
  • * u v c:将 \(u\)\(v\) 的路径上的点的权值都乘上自然数 \(c\)
  • / u v:询问 \(u\)\(v\) 的路径上的点的权值和,将答案对 \(51061\) 取模。

第一行两个整数 \(n,q\)

接下来 \(n-1\) 行每行两个正整数 \(u,v\),描述这棵树的每条边。

接下来 \(q\) 行,每行描述一个操作。

对于每个询问操作,输出一行一个整数表示答案。

样例输入
3 2
1 2
2 3
* 1 3 4
/ 1 1
样例输出
4

【数据范围】
对于 \(10\%\) 的数据,\(1\le n,q \le 2000\)
另有 \(15\%\) 的数据,\(1 \le n,q \le 5\times 10^4\),没有 - 操作,并且初始树为一条链;
另有 \(35\%\) 的数据,\(1 \le n,q \le 5\times 10^4\),没有 - 操作;
对于 \(100\%\) 的数据,\(1\le n,q \le 10^5\)\(0\le c \le 10^4\)

二、一波分析

首先有一条链的操作,那么直接锁定LCT或树链剖分。

再因为有加边、删边,直接锁定LCT。

那么,加边与删边都很简单,路径查询也是基操。

路径修改便是这道题的重点,相信读到这里的人都一定会线段树区间修改吧,这里一模一样。

完了。

一些查错:

  1. 一定要开unsigned int 或者 long long
  2. struct初始化时不能直接在结构体内部赋值,具体见代码。(如果样例516就是这个问题啦~
三、代码
#include<cstdio>
namespace Fread { const int SIZE = (1 << 18); char buf[SIZE], * p1 = buf, * p2 = buf; inline char getchar() { return (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, SIZE, stdin), p1 == p2) ? EOF : *p1++); } }
namespace Fwrite { const int SIZE = (1 << 18); char buf[SIZE], * S = buf, * T = buf + SIZE; inline void flush() { fwrite(buf, 1, S - buf, stdout), S = buf; }  struct NTR { ~NTR() { flush(); } }ztr; inline void putchar(char c) { *S++ = c; if (S == T) flush(); } }
namespace Fastio {struct Reader { template <typename T> Reader& operator >> (T& x) { char c = Fread::getchar(); bool f = false; while (c < '0' or c > '9') { if (c == '-') f = true; c = Fread::getchar(); } x = 0; while (c >= '0' and c <= '9') { x = (x << 1) + (x << 3) + (c ^ 48); c = Fread::getchar(); } if (f) x = -x; return *this; }Reader& operator>>(char& c) { c = Fread::getchar(); while (c == '\n' || c == ' ' || c == '\r')c = Fread::getchar(); return *this; }Reader& operator>>(char* str) { int len = 0; char c = Fread::getchar(); while (c == '\n' || c == ' ' || c == '\r')c = Fread::getchar(); while (c != '\n' && c != ' ' && c != '\r')str[len++] = c, c = Fread::getchar(); str[len] = '\0'; return *this; }Reader() {} }cin;struct Writer { template <typename T> Writer& operator << (T   x) { if (x == 0) return Fwrite::putchar('0'), * this; if (x < 0) Fwrite::putchar('-'), x = -x; static int sta[45], top = 0; while (x)  sta[++top] = x % 10, x /= 10; while (top)  Fwrite::putchar(sta[top] + '0'), --top; return *this; } Writer& operator<<(char c) { Fwrite::putchar(c); return*this; }Writer& operator<<(const char* str) { int cur = 0; while (str[cur])Fwrite::putchar(str[cur++]); return *this; }Writer() {} }cout;
}
#define cin  Fastio :: cin
#define cout Fastio :: cout
#define int unsigned int
using namespace std;
const int N = 1e5+100,MOD = 51061;
struct node{int fa,son[2],val,sum,lazy,lazyp,lazym,siz;inline void init() {val = 1,sum = 1,lazym = 1,siz = 1;}
}T[N];
inline void swap(int &x,int &y){int tmp = x;x = y,y = tmp;
}
inline bool Isroot(int u){int f = T[u].fa;return T[f].son[0]!=u && T[f].son[1]!=u;
}
inline void Pushup(int u){T[u].sum = (T[u].val + T[T[u].son[0]].sum + T[T[u].son[1]].sum)%MOD;T[u].siz = T[T[u].son[0]].siz + T[T[u].son[1]].siz + 1;
}
inline void Reverse(int u){if(!u) return;swap(T[u].son[0],T[u].son[1]);T[u].lazy ^= 1;
}
inline void Pushdown(int u){if(T[u].lazym!=1){T[T[u].son[0]].lazym = T[T[u].son[0]].lazym*T[u].lazym%MOD;T[T[u].son[1]].lazym = T[T[u].son[1]].lazym*T[u].lazym%MOD;T[T[u].son[0]].sum = T[T[u].son[0]].sum*T[u].lazym%MOD;T[T[u].son[1]].sum = T[T[u].son[1]].sum*T[u].lazym%MOD;T[T[u].son[0]].lazyp = T[T[u].son[0]].lazyp*T[u].lazym%MOD;T[T[u].son[1]].lazyp = T[T[u].son[1]].lazyp*T[u].lazym%MOD;T[T[u].son[0]].val = T[T[u].son[0]].val*T[u].lazym%MOD;T[T[u].son[1]].val = T[T[u].son[1]].val*T[u].lazym%MOD;T[u].lazym = 1;}if(T[u].lazyp){T[T[u].son[0]].lazyp = (T[T[u].son[0]].lazyp + T[u].lazyp)%MOD;T[T[u].son[1]].lazyp = (T[T[u].son[1]].lazyp + T[u].lazyp)%MOD;T[T[u].son[0]].sum = (T[T[u].son[0]].sum + T[T[u].son[0]].siz*T[u].lazyp)%MOD;T[T[u].son[1]].sum = (T[T[u].son[1]].sum + T[T[u].son[1]].siz*T[u].lazyp)%MOD;T[T[u].son[0]].val = (T[T[u].son[0]].val + T[u].lazyp)%MOD;T[T[u].son[1]].val = (T[T[u].son[1]].val + T[u].lazyp)%MOD;T[u].lazyp = 0;}if(T[u].lazy){Reverse(T[u].son[0]),Reverse(T[u].son[1]);T[u].lazy = 0;}
}
inline void Push(int u){if(!Isroot(u)) Push(T[u].fa);Pushdown(u);
}
inline void Rotate(int u){int f = T[u].fa,g = T[T[u].fa].fa;int lorr = (T[f].son[1] == u);if(!Isroot(f)) T[g].son[T[g].son[1]==f] = u;T[u].fa = g;T[f].son[lorr] = T[u].son[lorr^1];if(T[u].son[lorr^1]) T[T[u].son[lorr^1]].fa = f;T[u].son[lorr^1] = f;T[f].fa = u;Pushup(f);
}
inline void Splay(int u){Push(u);while(!Isroot(u)){int f = T[u].fa,g = T[T[u].fa].fa;if(!Isroot(f)) Rotate(((T[f].son[1]==u)==(T[g].son[1]==f))?f:u);Rotate(u);}Pushup(u);
}
inline void Access(int u){int child = 0;while(u){Splay(u);T[u].son[1] = child;Pushup(u);child = u,u = T[u].fa;}
}
inline void Makeroot(int u){Access(u),Splay(u),Reverse(u);
}
inline void Split(int u,int v){Makeroot(u),Access(v),Splay(v);
}
inline void Link(int u,int v){Makeroot(u),T[u].fa = v;
}
inline void Cut(int u,int v){Split(u,v);if(T[v].son[0]!=u or T[v].son[1]) return;T[u].fa = T[v].son[0] = 0;Pushup(u);
}
inline int Findroot(int u){Access(u),Splay(u);while(T[u].son[0]) Pushdown(u),u = T[u].son[0];return u;
}
int n,m,x,y,c,xx,yy;
char op;
signed main(){cin>>n>>m;for(int i=1;i<=n;i++) T[i].init();for(int i=1;i<n;i++){int x,y;cin>>x>>y;Link(x,y);}for(int i=1;i<=m;i++){cin>>op;if(op=='+'){cin>>x>>y>>c;Split(x,y);T[y].sum = (T[y].sum + T[y].siz*c)%MOD;T[y].lazyp = (T[y].lazyp + c)%MOD;T[y].val = (T[y].val + c)%MOD;}else if(op=='-'){cin>>x>>y>>xx>>yy;Cut(x,y),Link(xx,yy);}else if(op=='*'){cin>>x>>y>>c;Split(x,y);T[y].lazym = T[y].lazym*c%MOD;T[y].lazyp = T[y].lazyp*c%MOD;T[y].sum = T[y].sum*c%MOD;T[y].val = T[y].val*c%MOD;}else if(op=='/'){cin>>x>>y;Split(x,y);cout<<T[y].sum<<'\n';}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/904396.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NSSCTF Round#28 Team web题解

真是让人操心,但是又无法转移视线ez_ssrf 很简单的ssrf,知识点在网上搜都能搜到 payload http://node3.anna.nssctf.cn:28658@127.255.255.254/flag ez_php 第一部分有个非预期,直接/file就能出flag is_numeric绕过和md5强比较,很简单的知识点,这里就不细说了 第二部分网上…

Netty源码—4.客户端接入流程

大纲 1.关于Netty客户端连接接入问题整理 2.Reactor线程模型和服务端启动流程 3.Netty新连接接入的整体处理逻辑 4.新连接接入之检测新连接 5.新连接接入之创建NioSocketChannel 6.新连接接入之绑定NioEventLoop线程 7.新连接接入之注册Selector和注册读事件 8.注册Reactor线程…

【Esp32】为 idf 定制本地 Arduino 组件

在开始今天的水文前,老周先要奉劝一下国内某些嵌入式砖家和穴者,不要看不起 Arduino,它不是一种开发板,而是一种规范。Arduino 的思想是正确的,把各种开发板封装为统一的 API,让许多开源库共享相同的基础代码,严重降低了移植成本。Arduino 本质上使用的是 C/C++ 开发,只…

编译原理第五次作业

2.2.1 1)S-> S S *-> S S + S *->a S + S *->a a + S *->a a + a * 2)3)L={由多个a,加号,乘号组成的后缀表达式} 2.2.2 1)L={0^n 1^n | n>=1} 2)L={由多个a,加号,减号组成的前缀表达式} 3)L={ε或任意排列,嵌套的括号} 4)L={ε或包含相同数量a,b的字符…

XN2025 集训记录 D2

我好想你们啊 . 我怀念高一啊 . 至少还有理由放任自己开心不是吗 .XN2025 集训记录 D2 又是摆烂的一天 , 感觉打模拟赛时候的自己和改题时的自己完全不是一个人 . 不过往好了想 , 至少足够的模拟赛量 , 意味着我的高效率时间虽然不多 , 但是还有 . 买了个usb转网线 , 破费 39.9…

基于对偶二次曲线的快速椭圆检测

利用对偶二次曲线可精确求解椭圆圆心坐标。1、对偶二次曲线原理 二次曲线也称圆锥曲线,其几何定义是一个平面与两个顶点相对的圆锥相交所产生的交线。通常二次曲线指的是点二次曲线,它是定义在曲线点上的方程。而在射影几何中,齐次点和齐次线存在着可以互换的二元关系,因此…

【程设の旅】Python速通作业三

这节课老师讲了Python的面向对象部分 速度比较快 但是结合前面cpp的大部分知识可以弄懂 最后一道题估计是py特性了 可以理解但是那两个函数不知道是什么鬼 01:运算符的实现 描述 程序填空class A:def __init__(self,x):self.x = x // 在此处补充你的代码 a,b,c = map(int,input…

C/C++开发文档和常用的输入方式汇总

前几天复习的几种输入方式和帮助文档C/C++开发文档获取 之前下载过应该开发文档,今天push到了Gitee上了。可以随时获取,链接字符串操作 C 字符串 | 菜鸟教程 输入输出【包含字符串】 C 输入 & 输出 | 菜鸟教程 #include<stdio.h> int main() {char s[20];int i = 0…

Eino overview

一段话总结 Eino 是基于Golang的大模型应用开发框架,通过组件抽象(如ChatModel、Tool、Retriever)和图编排能力(Chain/Graph/Workflow)简化LLM应用开发。其核心优势包括类型安全的流处理、并发管理、切面注入以及开箱即用的最佳实践,支持构建复杂智能体(如ReAct)和多模…

llm 量化技术综述

综述: LLM 量化 1. Intro 低比特量化主要是减少tensor的bit-width,可以有效减少内存以及计算需求;主要可以压缩权重, 激活值, 和梯度,使得可以在受限资源的设备上使用。 2. 低比特LLM的基础 在这一届,我们主要引入从以下三个方面讨论:low-bit 数值格式 量化粒度 动态或者静…

Top 出海 AI 公司招技术!HIX.AI Pollo.ai | 深圳

HIX.AI & Pollo.ai 招聘高级海外 AI 产品经理 (25-45K) 岗位职责:负责Web 端海外 AI 产品的规划与策划,负责产品需求分析及原型设计,并制定方案推动产品研发落地; 进行产品/竞品调研,了解用户需求,分析、发现需求本质,并给出对应的解决方案; 有效对接开发、测试、运…