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 & ...
随机推荐
- jQuery 效果- 动画
jQuery animate() 方法允许您创建自定义的动画. jQuery 动画实例 jQuery jQuery 动画 - animate() 方法 jQuery animate() 方法用于创建自 ...
- Jmeter软件测试2--http接口测试
上次利用Jmeter进行了webservice接口的测试,本次利用Jmeter进行http接口的测试 1.新建线程组 2.新建配置文件 3.新建http请求 4.配置动态请求 4.查看测试结果
- 【转】《我的WCF之旅》博文系列汇总
转自:http://www.cnblogs.com/artech/archive/2007/09/15/893838.html WCF是构建和运行互联系统的一系列技术的总称,它是建立在Web Serv ...
- SGU 112.a^b - b^a
题意: 如标题. 方法: 简单高精度... 代码(继续JAVA 水过) import java.util.*; import java.math.*; public class Solution { ...
- SGU 150.Mr. Beetle II
非常烦人的题,思路比较简单,十分容易出错,细节非常重要. 从四个不同的行走方向讨论经过的每一个格子. code: #include <iostream> #include <util ...
- How far away ?
#include<iostream> #include <algorithm> using namespace std; const int M=40010; int dis[ ...
- 利用正则表达式,给Json字段加引号
{ scheme: [ { query: [ [{ id: 'stdNumber', title: "标准号", compareType: 2 }], [{ id: 'CnName ...
- Android 常用网站
Android Design : http://www.sunjw.us/adchs/index.html Android Developers : http://developer.android. ...
- 在Linux下写一个线程池以及线程池的一些用法和注意点
-->线程池介绍(大部分来自网络) 在这个部分,详细的介绍一下线程池的作用以及它的技术背景以及他提供的一些服务等.大部分内容来自我日常生活中在网络中学习到的一些概念性的东西. -->代码 ...
- 串行CPU设计
一.概述 串行CPU工作流程 串行CPU的时序流程如下图所示:取指.译码.执行.回写. 其中,取指.回写是与存储器打交道:而译码与执行则是CPU内部自个儿的操作. 我们究竟想要CPU干什么? ...