标题

标题

标题

标题

标题
标题
#include <cstdio>
#define R register int
#define I inline void
#define IL inline
#define ls c[x][0]
#define rs c[x][1] const int _ = 3e5 + 5;
int n, m;
struct Link_Cut_Tree
{
int f[_], c[_][2], v[_], s[_], st[_], r[_];
I _swap(R &x, R &y) { R t = x; x = y; y = t; }
IL bool nroot(R x) { return c[f[x]][0] == x || c[f[x]][1] == x; }
I pushup(R x) { s[x] = s[ls] ^ s[rs] ^ v[x]; }
I pushr(R x) { _swap(ls, rs); r[x] ^= 1; }
I pushdown(R x) { if(r[x]) { if(ls) pushr(ls); if(rs) pushr(rs); r[x] = 0; } }
I pushall(R x) { if(nroot(x)) pushall(f[x]); pushdown(x); }
I rotate(R x) {
R y = f[x], z = f[y], k = c[y][1] == x, w = c[x][!k];
if(nroot(y)) c[z][c[z][1] == y] = x; c[x][!k] = y; c[y][k] = w;
if(w) f[w] = y; f[y] = x; f[x] = z; pushup(y);
}
I splay(R x) {
R y, z; pushall(x);
while(nroot(x)) {
y = f[x]; z = f[y];
if(nroot(y)) rotate((c[y][0] == x) ^ (c[z][0] == y) ? x : y);
rotate(x);
} pushup(x);
}
I access(R x) { for(R y = 0; x; x = f[y = x]) splay(x), rs = y, pushup(x); }
I makeroot(R x) { access(x); splay(x); pushr(x); }
IL int findroot(R x) { access(x); splay(x); while(ls) pushdown(x), x = ls; splay(x); return x; }
I split(R x, R y) { makeroot(x); access(y); splay(y); }
I link(R x, R y) { makeroot(x); if(findroot(y) != x) f[x] = y; }
I cut(R x, R y) {
makeroot(x); if(findroot(y) != x || f[y] != x || c[y][0]) return;
f[y] = c[x][1] = 0; pushup(x);
}
}lct;
int main()
{
int opt, x, y;
scanf("%d%d", &n, &m);
for(R i = 1; i <= n; ++i) scanf("%d", &lct.v[i]);
while(m--) {
scanf("%d%d%d", &opt, &x, &y);
if(opt == 0) lct.split(x, y), printf("%d\n", lct.s[y]);
else if(opt == 1) lct.link(x, y);
else if(opt == 2) lct.cut(x, y);
else if(opt == 3) lct.splay(x), lct.v[x] = y;
}
return 0;
}
#include <iostream>
#include <cstdio>
#define ll long long using namespace std;
const int N = 1e5 + 10;
int n,m,root,mod,cnt,a[N],father[N],deep[N],size[N],son[N],rk[N],top[N],id[N];
struct Edge {
int Next, to;
}e[N<<1];
int head[N], num;
void add(int from, int to) {
e[++num].Next = head[from];
e[num].to = to;
head[from] = num;
}
struct Segment_Tree
{
ll ans[N<<2], tag[N<<2];
inline ll ls(ll p) { return p << 1; }
inline ll rs(ll p) { return p << 1 | 1; }
inline void pushup(ll p) {
ans[p] = (ans[ls(p)] + ans[rs(p)]) % mod;
}
inline void pushdown(ll p, ll l, ll r) {
ll mid = (l + r) >> 1;
ans[ls(p)] += (mid - l + 1) * tag[p] % mod;
tag[ls(p)] += tag[p] % mod;
ans[rs(p)] += (r - mid) * tag[p] % mod;
tag[rs(p)] += tag[p] % mod;
tag[p] = 0;
}
void build(ll p, ll l, ll r) {
if(l == r) {
ans[p] = a[rk[l]];
return;
}
ll mid = (l + r) >> 1;
build(ls(p), l, mid);
build(rs(p), mid + 1, r);
pushup(p);
}
void update(ll p, ll l, ll r, ll ul, ll ur, ll k) {
if(ul <= l && r <= ur) {
ans[p] += (r - l + 1) * k % mod;
tag[p] += k % mod;
return;
}
if(tag[p]) pushdown(p, l, r);
ll mid = (l + r) >> 1;
if(ul <= mid) update(ls(p), l, mid, ul, ur, k);
if(ur > mid) update(rs(p), mid + 1, r, ul, ur, k);
pushup(p);
}
ll query(ll p, ll l, ll r, ll ql, ll qr) {
if(ql <= l && r <= qr)
return ans[p];
if(tag[p]) pushdown(p, l, r);
ll mid = (l + r) >> 1, res = 0;
if(ql <= mid) res = (res + query(ls(p), l, mid, ql, qr)) % mod;
if(qr > mid) res = (res + query(rs(p), mid + 1, r, ql, qr)) % mod;
return res % mod;
}
}T;
struct lianpou
{
void dfs1(int u, int f, int depth)
{
father[u] = f;
deep[u] = depth;
size[u] = 1;
for(int i = head[u]; i; i = e[i].Next)
{
int v = e[i].to;
if(v == f) continue;
dfs1(v, u, depth + 1);
size[u] += size[v];
if(size[v] > size[son[u]])
son[u] = v;
}
}
void dfs2(int u, int tp)
{
top[u] = tp;
id[u] = ++cnt;
rk[cnt] = u;
if(!son[u]) return;
dfs2(son[u], tp);
for(int i = head[u]; i; i = e[i].Next)
{
int v = e[i].to;
if(v != son[u] && v != father[u])
dfs2(v, v);
}
}
ll sum(int x, int y)
{
ll ans = 0;
int fx = top[x], fy = top[y];
while(fx != fy)
{
if(deep[fx] >= deep[fy]) {
ans = (ans + T.query(1, 1, n, id[fx], id[x])) % mod;
x = father[fx], fx = top[x];
}
else {
ans = (ans + T.query(1, 1, n, id[fy], id[y])) % mod;
y = father[fy], fy = top[y];
}
}
if(id[x] > id[y]) swap(x, y);
ans = (ans + T.query(1, 1, n, id[x], id[y])) % mod;
return ans % mod;
}
void update(int x, int y, int z)
{
int fx = top[x], fy = top[y];
while(fx != fy)
{
if(deep[fx] >= deep[fy]) {
T.update(1, 1, n, id[fx], id[x], z);
x = father[fx], fx = top[x];
}
else
{
T.update(1, 1, n, id[fy], id[y], z);
y = father[fy], fy = top[y];
}
}
if(id[x] > id[y]) swap(x, y);
T.update(1, 1, n, id[x], id[y], z);
}
}L;
int main()
{
scanf("%d%d%d%d", &n, &m, &root, &mod);
for(int i = 1; i <= n; i++)
scanf("%lld", &a[i]);
for(int i = 1, u, v; i < n; i++)
{
scanf("%d%d", &u, &v);
add(u,v); add(v,u);
}
L.dfs1(root, 0, 1);
L.dfs2(root, root);
T.build(1, 1, n);
for(int i = 1, opt, x, y, z; i <= m; i++)
{
scanf("%d", &opt);
if(opt == 1)
{
scanf("%d%d%d", &x, &y, &z);
L.update(x, y, z);
}
else if(opt == 2)
{
scanf("%d%d", &x, &y);
printf("%lld\n", L.sum(x, y));
}
else if(opt == 3)
{
scanf("%d%d", &x, &z);
T.update(1, 1, n, id[x], id[x] + size[x] - 1, z);
}
else if(opt == 4)
{
scanf("%d", &x);
printf("%lld\n", T.query(1, 1, n, id[x], id[x] + size[x] - 1));
}
}
return 0;
}















[测试] Markdown+Latex的更多相关文章

  1. MarkDown+LaTex 数学内容编辑样例收集

    $\color{green}{MarkDown+LaTex 数学内容编辑样例收集}$ 1.大小标题的居中,大小,颜色 [例1] $\color{Blue}{一元二次方程根的分布}$ $\color{R ...

  2. 奇怪的 Markdown / LaTeX 笔记

    记一下日常见到的一些奇怪的 Markdown / LaTeX 用法... Markdown LaTeX LaTeX 数学 1. 运算符 1.1 造运算符: a \operatorname{sin} c ...

  3. markdown | Latex | 书写测试

    我永远喜欢markdown! 建图 graph TD; 1-->2 1-->3 1-->4 2-->5 2-->6 3-->7 3-->8 4-->9 ...

  4. 测试markdown语法

    测试使用markdown 这是无序列表 空调 洗衣机 电脑 这是有序列表 西瓜 哈密瓜 火龙果 下划线bingo 测试 斜体好丑 粗体很赞 测试插入代码 $(document).ready(funct ...

  5. 测试markdown 博客功能

    欢迎使用 Cmd - 在线 Markdown 编辑阅读器 我们理解您需要更便捷更高效的工具记录思想,整理笔记.知识,并将其中承载的价值传播给他人,Cmd Markdown 是我们给出的答案 -- 我们 ...

  6. R+markdown+LaTeX 中文编译解决方案

    一丢丢前言 很久之前曾试图以Rmarkdown编译pdf文档,无奈怎么鼓捣都会error,搜索了很久都没能找到比较好的解决方案.在配置上将编译器调成了xeLaTeX后就不了了之.这两天心血来潮研究了一 ...

  7. Markdown & LaTex 常用语法

    目录 blog 的目录 博客园自带目录 用 javascript 自定义目录 主标题 副标题 h1,一级标题 h2,二级标题 h3,三级标题 注释 常用的符号及文本形式 如果你想在markdown中文 ...

  8. 利用Mathpix Snipping Tool轻松在markdown/LaTeX中输入电子书和论文的数学公式

    最近写图形学博客写累了,公式太多了,一个个输入实在太累,所以从数学建模队友那里吃了一个安利. 官网下载 下载安装后,直接新建一个截图,就可以转成LaTeX数学公式了.效果如下: 爽的一批啊!!! 另外 ...

  9. 测试数学公式latex

    \( J_\alpha(x) = \sum\limits_{m=0}^\infty \frac{(-1)^m}{m! + 1)}{\left({\frac{x}{2}}\right)}^{2 m + ...

随机推荐

  1. POJ2104(可持久化线段树)

    K-th Number Time Limit: 20000MS   Memory Limit: 65536K Total Submissions: 58759   Accepted: 20392 Ca ...

  2. FineReport新增多项目甘特图示例及操作

    1.描述 我们在做报表的时候,往往想体现其中随着时间的变化而产生的项目进度的变化和其他相关的系统进展,每当这种时候甘特图便是其中的不二之选.FineReport新增的多项目甘特图可以说是满足了大多数的 ...

  3. MariaDB MySQL变量取值避免四舍五入的方法

    MySQL变量取值避免四舍五入的方法 By:授客 QQ:1033553122 在一些对数据精确度要求比较高的场景(比如资金结算)下,变量取值时不能对变量值进行四舍五入操作,这时候就要做些预处理工作. ...

  4. 如何获取listview里面的edittext或者RadioGroup的值,涉及到引发的混乱现象

    最近要实现从数据库读数据,该数据对应listview的item布局里面的RadioButton值,并且item布局里面还有EditText的控件. 如何将每一条对应的listview对应值获取出来呢? ...

  5. ubuntu 搭建samba共享方案

    1.samba服务安装搭建 sudo apt-get install samba sudo vim /etc/samba/smb.conf workgroup = szsoft 设置用户密码登陆方式s ...

  6. IDEA报错:Error starting ApplicationContext. To display the auto-configuration report re-run your application with 'debug' enabled. ('crmWatcherService'错误)

    单表插入项目,插入前正常,插入后运行webapplication报错: run: debug: 于webapplication报错: Injection of autowired dependenci ...

  7. AndroidStudio 3.0升级之compile、implementation简要说明

    1.现象 androidStudio 升级至3.0后 之前引用库所使用的complie默认变成implementation 如以下: 3.0之前 compile 'io.reactivex.rxjav ...

  8. Android--自定义半圆环型进度(带动画)

    package com.newair.ondrawtext; import android.animation.ValueAnimator; import android.annotation.Tar ...

  9. Java中的StringTokenizer类的使用方法

    StringTokenizer是字符串分隔解析类型,属于:java.util包. 1.StringTokenizer的构造函数 StringTokenizer(String str):构造一个用来解析 ...

  10. Sql Server中的游标最好只用于有主键或唯一键的表

    游标cursor,我想大多数人都在sql server里面用过.当一个表数据量不太大的时候,游标还是可以用的,毕竟游标是循环一个表中每一行数据的最简便办法.但是如果你用一个游标去循环一个没有主键或唯一 ...