题目链接:BZOJ - 2631

题目分析

LCT,像线段树区间乘,区间加那样打标记。

这道题我调了一下午。

提交之后TLE了,我一直以为是写错了导致了死循环。

于是一直在排查错误。直到..

直到我看了hzwer的博客,就一句话:“其实这题不需要开long long。。。只要unsigned int,不然可能会T”。

纳尼?!TLE是因为常数问题?于是我将 long long 改成了 unsighed int ,然后...AC。

我................!

long long 不能随便用啊...

代码

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm> using namespace std; inline void Read(int &Num)
{
char c = getchar();
bool Neg = false;
while (c < '0' || c > '9')
{
if (c == '-') Neg = true;
c = getchar();
}
Num = c - '0'; c = getchar();
while (c >= '0' && c <= '9')
{
Num = Num * 10 + c - '0';
c = getchar();
}
if (Neg) Num = -Num;
} const int MaxN = 100000 + 5, Mod = 51061; typedef unsigned int LL; int n, q;
int Father[MaxN], Son[MaxN][2], Size[MaxN]; LL T[MaxN], Mul[MaxN], Plus[MaxN], A[MaxN]; bool Rev[MaxN], isRoot[MaxN]; inline void Update(int x)
{
T[x] = (T[Son[x][0]] + T[Son[x][1]] + A[x]) % Mod;
Size[x] = Size[Son[x][0]] + Size[Son[x][1]] + 1;
} inline void Reverse(int x)
{
Rev[x] = !Rev[x];
swap(Son[x][0], Son[x][1]);
} inline void Paint_Mul(int x, LL Num)
{
Mul[x] = Mul[x] * Num % Mod;
Plus[x] = Plus[x] * Num % Mod;
T[x] = T[x] * Num % Mod;
A[x] = A[x] * Num % Mod;
} inline void Paint_Plus(int x, LL Num)
{
Plus[x] = (Plus[x] + Num) % Mod;
T[x] = (T[x] + Num * Size[x] % Mod) % Mod;
A[x] = (A[x] + Num) % Mod;
} inline void PushDown(int x)
{
if (Rev[x])
{
Rev[x] = false;
if (Son[x][0]) Reverse(Son[x][0]);
if (Son[x][1]) Reverse(Son[x][1]);
}
if (Mul[x] != 1)
{
if (Son[x][0]) Paint_Mul(Son[x][0], Mul[x]);
if (Son[x][1]) Paint_Mul(Son[x][1], Mul[x]);
Mul[x] = 1;
}
if (Plus[x] != 0)
{
if (Son[x][0]) Paint_Plus(Son[x][0], Plus[x]);
if (Son[x][1]) Paint_Plus(Son[x][1], Plus[x]);
Plus[x] = 0;
}
} void Rotate(int x)
{
int y = Father[x], f;
PushDown(y); PushDown(x);
if (x == Son[y][0]) f = 1;
else f = 0;
if (isRoot[y])
{
isRoot[y] = false;
isRoot[x] = true;
}
else
{
if (y == Son[Father[y]][0]) Son[Father[y]][0] = x;
else Son[Father[y]][1] = x;
}
Father[x] = Father[y];
Son[y][f ^ 1] = Son[x][f];
if (Son[x][f]) Father[Son[x][f]] = y;
Son[x][f] = y;
Father[y] = x;
Update(y);
Update(x);
} void Splay(int x)
{
int y;
while (!isRoot[x])
{
y = Father[x];
if (isRoot[y])
{
Rotate(x);
break;
}
if (y == Son[Father[y]][0])
{
if (x == Son[y][0])
{
Rotate(y);
Rotate(x);
}
else
{
Rotate(x);
Rotate(x);
}
}
else
{
if (x == Son[y][1])
{
Rotate(y);
Rotate(x);
}
else
{
Rotate(x);
Rotate(x);
}
}
}
} int Access(int x)
{
int y = 0;
while (x != 0)
{
Splay(x);
PushDown(x);
if (Son[x][1]) isRoot[Son[x][1]] = true;
Son[x][1] = y;
if (y) isRoot[y] = false;
Update(x);
y = x;
x = Father[x];
}
return y;
} void Make_Root(int x)
{
int t = Access(x);
Reverse(t);
} int main()
{
scanf("%d%d", &n, &q);
int a, b;
for (int i = 1; i <= n; ++i)
{
A[i] = T[i] = 1;
Mul[i] = 1; Plus[i] = 0;
isRoot[i] = true;
Size[i] = 1;
}
for (int i = 1; i <= n - 1; ++i)
{
Read(a); Read(b);
Make_Root(a);
Splay(a);
Father[a] = b;
}
char Str[5];
int x, y, Num, t;
for (int i = 1; i <= q; ++i)
{
scanf("%s", Str);
switch (Str[0])
{
case '+' :
Read(x); Read(y); Read(Num);
Make_Root(x);
t = Access(y);
Paint_Plus(t, (LL)Num);
break; case '-' :
Read(x); Read(y);
Make_Root(x);
Access(y);
Splay(y);
PushDown(y);
isRoot[Son[y][0]] = true;
Father[Son[y][0]] = 0;
Son[y][0] = 0;
Update(y);
Read(x); Read(y);
Make_Root(x);
Splay(x);
Father[x] = y;
break; case '*' :
Read(x); Read(y); Read(Num);
Make_Root(x);
t = Access(y);
Paint_Mul(t, (LL)Num);
break; case '/' :
Read(x); Read(y);
Make_Root(x);
t = Access(y);
printf("%d\n", (int)(T[t] % Mod));
break;
}
}
return 0;
}

  

[BZOJ - 2631] tree 【LCT】的更多相关文章

  1. [BZOJ 3282] Tree 【LCT】

    题目链接:BZOJ - 3282 题目分析 这道题是裸的LCT,包含 Link , Cut 和询问两点之间的路径信息. 写代码时出现的错误:Access(x) 的循环中应该切断的是原来的 Son[x] ...

  2. BZOJ2631 tree 【LCT】

    题目 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 v2:将树中原有的边( ...

  3. 3282. Tree【LCT】

    Description 给定N个点以及每个点的权值,要你处理接下来的M个操作. 操作有4种.操作从0到3编号.点从1到N编号. 0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor和 ...

  4. bzoj 3159: 决战【LCT】

    只是想复健一下LCT没想到做了不得了的题--调了两天QAQ 题解是这么说的: 但是果然还不太理解--因为swap的前后问题调了好久,(所以一开始养成的习惯后面就不要再改啦-- 总之大概就是把对位置lc ...

  5. BZOJ 1468 Tree 【模板】树上点分治

    #include<cstdio> #include<algorithm> #define N 50010 #define M 500010 #define rg registe ...

  6. 606. Construct String from Binary Tree 【easy】

    606. Construct String from Binary Tree [easy] You need to construct a string consists of parenthesis ...

  7. BZOJ 2631: tree( LCT )

    LCT...略麻烦... -------------------------------------------------------------------------------- #inclu ...

  8. [BZOJ 2049] [Sdoi2008] Cave 洞穴勘测 【LCT】

    题目链接:BZOJ - 2049 题目分析 LCT的基本模型,包括 Link ,Cut 操作和判断两个点是否在同一棵树内. Link(x, y) : Make_Root(x); Splay(x); F ...

  9. BZOJ 2631: tree [LCT splay区间]

    2631: tree Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 3854  Solved: 1292[Submit][Status][Discus ...

随机推荐

  1. VSS的运用小内容(针对于vs2008版本)(小的问题都是,仅供参考--只针对于菜鸟级的)

    自己开始接触vss 的时候有些小的习惯没有很好的养成,下面的有关VSS内容都是简单的迁入迁出的问题,(仅供参考) 1.文件的迁入迁出:(.txt..xlsx..doc) a:文件的覆盖问题: 对于文件 ...

  2. Codeforces Round #198 (Div. 2) D. Bubble Sort Graph (转化为最长非降子序列)

    D. Bubble Sort Graph time limit per test 1 second memory limit per test 256 megabytes input standard ...

  3. 数据库修复工具 - DatabaseCompressor 之从9M到900K+

    数据库修复工具 - 仅限 *.mdb 格式的Access 数据库 引言: Access数据库操作有一严重Bug,当数据库文件内容添加�时,其文件容量随之添加�,但当删除数据库内容时,其数据库容量不会对 ...

  4. 标准库function类型的使用

    14.44编写一个简单的桌面计算器使其能处理二元运算. #include<iostream> #include<map> #include<functional> ...

  5. Java Interface是存放常量的最好地方吗?(转)

    虽然Inteface中默认常量就是static final 的.因此很多人就认为其实存放常量的最佳地方,effective java中就提过,不建议使用常量接口.其有一个原因就是:代码编译问题 好,我 ...

  6. Linux下rsync增加SSH端口号的用法

    rsync默认使用SSH的22号端口,为了安全起见,很多机器更改了SSH默认的端口号,对应rsync命令的用法为: rsync -e 'ssh -p 1234' username@hostname:S ...

  7. hibernate自动建表采用UTF-8字符编码

    hibernate自动建表采用UTF-8字符编码 hibernate建表默认为UTF-8编码 >>>>>>>>>>>>>& ...

  8. C#入门教程(二)–C#常用快捷键、变量、类型转换-打造C#学习教程

    C#入门教程(一)–.Net平台技术介绍.C#语言及开发工具介绍-打造C#学习教程 上次教程主要介绍了.Net平台以及C#语言的相关介绍.以及经典程序案例,helloworld程序. 初来乍到,第一次 ...

  9. HTTP 错误 500.19- Internal Server Error 错误解决方法 分类: Windows服务器配置 2015-01-08 20:16 131人阅读 评论(0) 收藏

    1.第一种情况如下: 解决方法如下: 经过检查发现是由于先安装Framework组件,后安装iis的缘故,只需重新注册下Framework就可以了,具体步骤如下 1 打开运行,输入cmd进入到命令提示 ...

  10. 查看Safari和钥匙串中的密码

    Safari Safari的同步书签功能很棒,还可以看到其他设备没关掉的网页.为了省时间,一些经常进的网站,比如博客,邮箱等,我都会选择让Safari保存密码,还使用iCloud同步!因为一直很放心苹 ...