题目

题意简述

  给定两颗树 \(A,B\),\(A\) 中的任一结点 \(u\) 与 \(B\) 中的任一结点 \(v\) 都有一个关系值 \(f(u,v)\),初始为 \(0\)。再给出 \(q\) 个形如 \(a1,b1,a2,b2,c\) 的操作,表示对于 \(A\) 中路径 \(a1\leftrightarrow b1\) 上的任一结点 \(u\) 和 \(B\) 中路径 \(a2\leftrightarrow b2\) 上的任一结点 \(v\),\(f(u,v)\leftarrow f(u,v)+c\)。求操作完成后所有的 \(f(u,v)\)。

数据规模

  设 \(A\) 的结点数 \(n\),\(B\) 的结点数 \(m\)。

  \(n,m\le10^4;~q\le5\times10^5\)。

题解

  一道有意思的差分题 owo。

  首先将 \(A\) 和 \(B\) 分别树链剖分,把结点编号转化为 \(DFN\) 来考虑问题。

  形象地,我们把 \(f\) 列成一个表格,第 \(i\) 行第 \(j\) 列的值表示 \(A\) 中 \(DFN\) 为 \(i\) 的结点 \(u\) 和 \(B\) 中 \(DFN\) 为 \(j\) 的结点 \(v\) 的 \(f(u,v)\) 值。如果操作涉及路径的 \(DFN\) 值连续,那么就相当于修改这个表格的一个子矩阵,可以差分做到。推广到一般情况,只需要用树剖取出 \(A\) 中路径所覆盖的若干个 \(DFN\) 区间和 \(B\) 中路径覆盖的若干个 \(DFN\) 区间,暴力地两两配对,修改子矩阵即可。最后前缀和还原表格,就求出每一个 \(f(u,v)\) 啦~

  复杂度 \(O(q\log^2n)\)。

代码

  1. #include <cstdio>
  2. #include <vector>
  3. #include <utility>
  4. #define x1 tmpx1
  5. #define y1 tmpy1
  6. #define x2 tmpx2
  7. #define y2 tmpy2
  8. inline int rint () {
  9. int x = 0, f = 1; char s = getchar ();
  10. for ( ; s < '0' || '9' < s; s = getchar () ) f = s == '-' ? -f : f;
  11. for ( ; '0' <= s && s <= '9'; s = getchar () ) x = x * 10 + ( s ^ '0' );
  12. return x * f;
  13. }
  14. template<typename Tp>
  15. inline void wint ( Tp x ) {
  16. if ( x < 0 ) putchar ( '-' ), x = ~ x + 1;
  17. if ( 9 < x ) wint ( x / 10 );
  18. putchar ( x % 10 ^ '0' );
  19. }
  20. const int MAXN = 1e4;
  21. struct TreeSplit {
  22. int n, fa[MAXN + 5], dep[MAXN + 5], son[MAXN + 5], siz[MAXN + 5];
  23. int indx, top[MAXN + 5], dfn[MAXN + 5], ref[MAXN + 5];
  24. std :: vector<int> graph[MAXN + 5];
  25. inline void read () {
  26. n = rint ();
  27. for ( int i = 1, u, v; i < n; ++ i ) {
  28. u = rint (), v = rint ();
  29. graph[u].push_back ( v ), graph[v].push_back ( u );
  30. }
  31. }
  32. inline void DFS1 ( const int u, const int f ) {
  33. dep[u] = dep[fa[u] = f] + ( siz[u] = 1 );
  34. for ( int v: graph[u] ) if ( v ^ f ) {
  35. DFS1 ( v, u ), siz[u] += siz[v];
  36. if ( siz[son[u]] < siz[v] ) son[u] = v;
  37. }
  38. }
  39. inline void DFS2 ( const int u, const int tp ) {
  40. top[ref[dfn[u] = ++ indx] = u] = tp;
  41. if ( son[u] ) DFS2 ( son[u], tp );
  42. for ( int v: graph[u] ) if ( v ^ fa[u] && v ^ son[u] ) DFS2 ( v, v );
  43. }
  44. inline std :: vector<std :: pair<int, int> > getPath ( int u, int v ) {
  45. static std :: vector<std :: pair<int, int> > ret; ret.clear ();
  46. while ( top[u] ^ top[v] ) {
  47. if ( dep[top[u]] < dep[top[v]] ) u ^= v ^= u ^= v;
  48. ret.push_back ( { dfn[top[u]], dfn[u] } ), u = fa[top[u]];
  49. }
  50. if ( dep[u] < dep[v] ) u ^= v ^= u ^= v;
  51. return ret.push_back ( { dfn[v], dfn[u] } ), ret;
  52. }
  53. } T1, T2;
  54. int sum[MAXN + 5][MAXN + 5];
  55. inline void add ( const int x1, const int y1, const int x2, const int y2, const int k ) {
  56. sum[x1][y1] += k, sum[x1][y2 + 1] -= k, sum[x2 + 1][y1] -= k, sum[x2 + 1][y2 + 1] += k;
  57. }
  58. int main () {
  59. T1.read (), T2.read ();
  60. T1.DFS1 ( 1, 0 ), T1.DFS2 ( 1, 1 );
  61. T2.DFS1 ( 1, 0 ), T2.DFS2 ( 1, 1 );
  62. std :: vector<std :: pair<int, int> > pathA, pathB;
  63. for ( int q = rint (), a, b, u, v, k; q --; ) {
  64. a = rint (), b = rint (), u = rint (), v = rint (), k = rint ();
  65. pathA = T1.getPath ( a, b ), pathB = T2.getPath ( u, v );
  66. for ( auto seca: pathA ) for ( auto secb: pathB ) {
  67. add ( seca.first, secb.first, seca.second, secb.second, k );
  68. }
  69. }
  70. for ( int i = 1; i <= T1.n; ++ i ) {
  71. for ( int j = 1; j <= T2.n; ++ j ) {
  72. sum[i][j] += sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1];
  73. }
  74. }
  75. long long ans = 0;
  76. for ( int i = 1; i <= T1.n; ++ i ) {
  77. for ( int j = 1; j <= T2.n; ++ j ) {
  78. ans ^= 1ll * T1.ref[i] * T2.ref[j] * sum[i][j];
  79. }
  80. }
  81. wint ( ans ), putchar ( '\n' );
  82. return 0;
  83. }

Solution -「NOI.AC 省选膜你赛」union的更多相关文章

  1. Solution -「NOI.AC 省选膜你赛」T2

      这道题就叫 T2 我有什么办法www 题目 题意简述   给定一个字符串 \(s\),其长度为 \(n\),求无序子串对 \((u,v)\) 的个数,其中 \((u,v)\) 满足 \(u,v\) ...

  2. Solution -「NOI.AC 省选膜你赛」array

    题目 题意简述   维护一个长度为 \(n\) 的序列 \(\{a_n\}\),并给出 \(q\) 个操作: 将下标为 \(x\) 的数修改为 \(y\). 给定 \(l,r,k\),求最大的 \(m ...

  3. Solution -「NOI.AC 省选膜你赛」寄蒜几盒

    题目 题意简述   给定一个含有 \(n\) 个顶点的凸多边形( \(n\) 是偶数),对于每一对相对的边(即中间有 \(\frac{n}2-1\) 条其它边),延长它们以将平面分割为多块,并把包含原 ...

  4. cdcqの省选膜你赛

    cdcqの省选膜你赛 比赛当天因为在杠hnoi2016的大数据结构没有参加,今天补了一下.挺好玩的虽然不看一句话题意的话真的卡读题 此生无悔入东方,来世愿生幻想乡 2651. 新史「新幻想史 -现代史 ...

  5. Solution -「NOI 2021」「洛谷 P7740」机器人游戏

    \(\mathcal{Description}\)   Link.   自己去读题面叭~ \(\mathcal{Solution}\)   首先,参悟[样例解释 #2].一种暴力的思路即为钦定集合 \ ...

  6. Solution -「NOI 2020」「洛谷 P6776」超现实树

    \(\mathcal{Description}\)   Link.   对于非空二叉树 \(T\),定义 \(\operatorname{grow}(T)\) 为所有能通过若干次"替换 \( ...

  7. Solution -「NOI 模拟赛」彩色挂饰

    \(\mathcal{Description}\)   给定一个含 \(n\) 个点 \(m\) 条边的简单无向图,设图中最大点双的大小为 \(s\),则保证 \(s\le6\).你将要用 \(k\) ...

  8. Solution -「NOI 模拟赛」出题人

    \(\mathcal{Description}\)   给定 \(\{a_n\}\),求一个 \(\{b_{n-1}\}\),使得 \(\forall x\in\{a_n\},\exists i,j\ ...

  9. Solution -「NOI 2016」「洛谷 P1587」循环之美

    \(\mathcal{Description}\)   Link.   给定 \(n,m,k\),求 \(x\in [1,n]\cap\mathbb N,y\in [1,m]\cap \mathbb ...

随机推荐

  1. 日志收集系统系列(四)之LogAgent优化

    实现功能 logagent根据etcd的配置创建多个tailtask logagent实现watch新配置 logagent实现新增收集任务 logagent删除新配置中没有的那个任务 logagen ...

  2. java mapreduce实现网站PV分析

    原文链接: https://www.toutiao.com/i6765677128022229517/ PV 是Page Views的缩写,即页面浏览量,用户每一次对网站中的每个网页访问均被记录一次. ...

  3. 学习Java爬虫文档的学习顺序整理

    1.认识正则表达式(Java语言基础) https://www.toutiao.com/i6796233686455943693/ 2.正则表达式学习之简单手机号和邮箱练习 https://www.t ...

  4. C#8.0 可空引用类型

    介绍 我们的项目代码运行时最频繁的错误之一就是 System.NullReferenceException 异常,c#8.0增加的可为空引用类型就是用来帮助开发者降低甚至消除NULL异常.我们需要注意 ...

  5. gin框架中HTTP请求和参数的解析

    1. 方法一: 通用的处理方法---Handle package main import ( "fmt" "github.com/gin-gonic/gin" ...

  6. 深入了解promise

    1. Promise基础 什么是回调地狱? 当使用回调函数来进行事件处理的时候,如果嵌套多层回调函数的时候,就会出现回调地狱,例如: method1(function(err, result) { i ...

  7. 使用 Kubeadm+Containerd 部署一个 Kubernetes 集群

    本文独立博客阅读地址:https://ryan4yin.space/posts/kubernetes-deployemnt-using-kubeadm/ 本文由个人笔记 ryan4yin/knowle ...

  8. maven 项目搭建,本地环境配置。

    一,下载地址 http://maven.apache.org/download.cgi 英文不好的,可以在浏览器下载个翻译的插件,就好了,我用的是谷歌. 二, 解压文件,安装在自己制定的目录,注意安装 ...

  9. Arduino+ESP32 之 驱动GC9A01圆形LCD(一),基于Arduino_GFX库

    最近买了一块圆形屏幕,驱动IC是GC9A01,自己参考淘宝给的stm32的驱动例程, 在ubuntu下使用IDF开发ESP32,也在windows的vscode内安装IDF开发ESP32,虽然都做到了 ...

  10. chapter3——逻辑回归手动+sklean版本

    1 导入numpy包 import numpy as np 2 sigmoid函数 def sigmoid(x): return 1/(1+np.exp(-x)) demox = np.array([ ...