bzoj2631: tree lct
要打mul和add的lct
50000+的mod用unsigned int好了TAT
(坑爹没打pc('\n');(静态)调了好久,样例竟然只输出一个,orz,也不提示PE T_T)
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cstdio> using namespace std; const int D=;
char in[D],out[*],*I=in,*O=out;
#define gc (*I++)
#define pc(x) ((*O++)=x)
template <typename Q>
void gt(Q&x) {
static char c,f;
for(c=gc,f=;!isdigit(c);c=gc)if(c=='-') f=;
for(x=;isdigit(c);c=gc) x=x*+c-'';
f && (x=-x);
}
template <typename Q>
void pt(Q x){
static char stk[];
static int top;
top=;
if(x==) pc('');
for(;x;x/=) stk[++top] = x%+'';
for(;top;top--) pc(stk[top]);
} typedef unsigned ll;
const int Maxn=,Mod=;
int n,m;
ll w[Maxn],tagm[Maxn],taga[Maxn],sz[Maxn];
int ch[Maxn][],p[Maxn],flip[Maxn],sum[Maxn]; void update(int x){
if(x==) return;
int&l=ch[x][],&r=ch[x][];
sum[x] = (sum[l] + sum[r] + w[x])%Mod;
sz[x] = (sz[l] + sz[r] + )%Mod;
} void add_tag(int x,ll a,ll m){
if(!x) return;
sum[x] = (sum[x]*m+a*sz[x])%Mod;
w[x] = (w[x]*m+a)%Mod;
tagm[x] = tagm[x]*m%Mod;
taga[x] = (taga[x]*m+a)%Mod;
} /*void tag_mul(int x,ll _v) {
(sum[x]*=_v)%=Mod;
(w[x]*=_v)%=Mod;
(tagm[x]*=_v)%=Mod;
(taga[x]*=_v)%=Mod;
} void tag_add(int x,ll _v) {
(sum[x]+=(sz[x]*_v)%Mod)%=Mod;
(w[x]+=_v)%=Mod;
(taga[x]+=_v)%=Mod;
}*/ bool isroot(int x) {
return ch[p[x]][]!=x && ch[p[x]][]!=x;
} void down(int x) {
int &l=ch[x][],&r=ch[x][];
if(flip[x]) {
swap(l,r);
flip[l]^=;
flip[r]^=;
flip[x]=;
}
/*if(tagm[x]!=1) {
for(int i=0;i<2;i++)if(ch[x][i])tag_mul(ch[x][i],tagm[x]);
tagm[x]=1;
}
if(taga[x]!=0) {
for(int i=0;i<2;i++)if(ch[x][i])tag_add(ch[x][i],taga[x]);
taga[x]=0;
}*/
ll&a=taga[x],&m=tagm[x];
if(a!= || m!=) {
add_tag(l,a,m);
add_tag(r,a,m);
a=;m=;
}
} void rotate(int x){
int y=p[x],z=p[y];
int l=ch[y][]==x,r=l^;
if(!isroot(y)){
ch[z][ch[z][]==y]=x;
}
p[y]=x;
p[ch[x][r]]=y;
p[x]=z; ch[y][l]=ch[x][r];
ch[x][r]=y; update(y);
// update(x);
} int stk[Maxn],top;
void splay(int x){
stk[top=]=x;
for(int t=x;!isroot(t);stk[++top]=t=p[t]);
for(;top;top--) down(stk[top]);
for(;!isroot(x);){
int y=p[x],z=p[y];
if(!isroot(y)) {
if( (ch[y][]==x) ^ (ch[z][]==y)) rotate(x);
else rotate(y);
}
rotate(x);
}
update(x);
} void access(int x) {
for(int t=;x;x=p[t=x]){
splay(x);
ch[x][]=t;
update(x);
}
} void newroot(int x) {
access(x);
splay(x);
flip[x]^=;
} inline void n_as(int u,int v){
newroot(u);
access(v);
splay(v);
} void Cut(int x,int y) {
n_as(x,y);
ch[y][]=p[x]=;
update(x);
} void Link(int x,int y) {
newroot(x);
p[x]=y;
} int en[Maxn*],next[Maxn*],fir[Maxn];
void Add(int from,int to) {
static int tot=;
en[++tot]=to;
next[tot]=fir[from];
fir[from]=tot;
} void BFS(int u) {
int *q=stk,ql=,qr=;
q[++qr]=u;
for(int x;ql<qr;){
x=q[++ql];
for(int k=fir[x];k;k=next[k]){
int v=en[k];
if(v==p[x]) continue;
p[v]=x;
q[++qr]=v;
}
}
} void init(){
gt(n),gt(m);
for(int u,v,i=;i<n;i++) {
gt(u),gt(v);
// Add(u,v),Add(v,u);
Link(u,v);
}
// BFS(1);
tagm[]=;
for(int i=;i<=n;i++) sz[i]=sum[i]=tagm[i]=w[i]=;
} void work() {
char c;
ll u,v,d;
/*printf("round%d:\n",0);
for(int i=1;i<=n;i++) {
printf("%d :p=%d,ch=(%d,%d),w=%d,taga=%d,tagm=%d\n",i,p[i],ch[i][0],ch[i][1],w[i],taga[i],tagm[i]);
}*/
for(int i=;i<=m;i++) {
for(;;) {
c=gc;
if(c=='+') {
gt(u),gt(v),gt(d);
n_as(u,v);
// tag_add(v,d);
add_tag(v,d,);
break;
}if(c=='-') {
gt(u),gt(v);
Cut(u,v);
gt(u),gt(v);
Link(u,v);
break;
}if(c=='*') {
gt(u),gt(v),gt(d);
n_as(u,v);
add_tag(v,,d);
// tag_mul(v,d);
break;
}if(c=='/'){
gt(u),gt(v);
n_as(u,v);
pt(sum[v]);
pc('\n');
break;
}
}
/*printf("round%d:\n",i);
for(int i=1;i<=n;i++) {
printf("%d :p=%d,ch=(%d,%d),w=%d,taga=%d,tagm=%d,sum=%d\n",i,p[i],ch[i][0],ch[i][1],w[i],taga[i],tagm[i],sum[i]);
}*/
}
} int main() {
#ifdef DEBUG
freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
#endif
fread(in,,D,stdin); init();
work(); return printf(out),;
}
bzoj2631: tree lct的更多相关文章
- [bzoj2631]tree——lct
Brief Description 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: u v c:将u到v的路径上的点的权值都加上自然数c: u1 v1 u2 ...
- bzoj2631 tree LCT 区间修改,求和
tree Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 4962 Solved: 1697[Submit][Status][Discuss] Des ...
- 【bzoj2631】tree LCT
题目描述 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一:+ u v c:将u到v的路径上的点的权值都加上自然数c:- u1 v1 u2 v2:将树中原有的边( ...
- BZOJ2631 tree(伍一鸣) LCT 秘制标记
这个题一看就是裸地LCT嘛,但是我wa了好几遍,这秘制标记...... 注意事项:I.*对+有贡献 II.先下传*再下传+(因为我们已经维护了+,不能再让*对+产生贡献)III.维护+用到size # ...
- [BZOJ2631]tree 动态树lct
2631: tree Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 5171 Solved: 1754[Submit][Status][Discus ...
- BZOJ2631 tree 【LCT】
题目 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 v2:将树中原有的边( ...
- BZOJ2631: tree(LCT)
Description 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 v2 ...
- bzoj2631: tree
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...
- BZOJ2631——tree
1.题目大意:bzoj1798的lct版本 2.分析:这个把线段树改成splay就好 #include <stack> #include <cstdio> #include & ...
随机推荐
- imod报错:error while loading shared libraries: libjpeg.so.62的解决办法
the file libjpeg.so.62(in /usr/lib/libjpeg.so.62)belongs to the package libjpeg62so try to reinstall ...
- 命令模式(Command)
1.本质: 封装请求 2.定义: 把一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作 3.核心: 原本“行为请求者”和“行为执行者”是紧紧 ...
- Android 学习手札(二) 活动(Activity)组件
1.建立和配置Activity 建立Android工程时已经自动生成了一个默认的Activity,同时也生成了很多与Activity相关的文件,例如,res目录中的XML及图像文件.AndroidMa ...
- 《find技巧》-“linux命令五分系列”之一
一天一个命令,做个记录, 我要成大神,哈哈哈 本原创文章属于<Linux大棚>博客. 博客地址为http://roclinux.cn. 文章作者为roc 希望您能通过捐款的方式支持Linu ...
- Create a simple js-ctypes example
js-ctypes 为Firefox extension访问由C/C++编写的native code提供了一种通用的方法. 从Firefox 4 开始支持js-ctypes,不同版本的之间有极好的兼容 ...
- 百度分享 ajax 或分页后显示不出问题解决方案
自从用了AJAX后,JS重新加载问题就如家常便饭般层出不穷啊.没有系统学习过js感觉亚历山大. 百度后,还是找到了解决办法. 百度分享创建了一个全局对象window._bd_share_main.通过 ...
- .net 实例化对象
定义TestClass,在调用的地方 TestClass a; 如果下面有引用 a.Property,VS会报错,而如果 TestClass a = null; 再次调用的话则不会报错. TestCl ...
- 基于 Webpack & Vue & Vue-Router 的 SPA 初体验
基于 Webpack & Vue & Vue-Router 的 SPA 初体验 本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com ...
- c++:参数型别的推导
STL源码剖析--侯捷 总结 尽管现在的很多语言支持参数类型的判别,但是c/c++并不支持这一特性. 但是我们可以通过一些技巧使得c++具有自动判别参数类型的特性. 模板 我们都知道在模板类和模板函数 ...
- 【译】UI设计基础(UI Design Basics)--iOS应用解析(iOS App Anatomy)(三)
2.1 iOS应用解析(iOS App Anatomy) 几乎所有的iOS应用都会用到UIKit框架中的组件.了解这些基础组件的名称,角色,功能可以帮你在应用界面设计时做出更好的决策. UIKit提 ...