codechef FIBTREE 码农题 线段树 树剖 标记永久化
好烦啊,调了半天
线段树部分标记比较多,手抖打错了一个
剩下的都是取模的问题
我自己瞎jb推的公式里保留了abs,但是在模意义下是gg的,所以必须把正负区分开
调试的时候一定要注意构造各种形状的树,不要只做随机树
随机树深度只有log,很难体现一些链上的性质
我用随机树拍了一下午没出错,一掏出直链就秒秒钟出错
最后找到了那个该死的abs
还是逻辑不够严谨啊
#include <bits/stdc++.h>
#define DEBUG 0
#define mid (l+r>>1)
#define MOD 1000000009
#define Que(rt,x,y) que(rt,1,n,x,y)
#define Len (dep[x]-dep[top[x]]+1)
using namespace std;
struct node
{
int f,s,F,S,sum;
node(long long a,long long b,long long c,long long d,long long e)
{
f=a%MOD;s=b%MOD;F=c%MOD;S=d%MOD;sum=e%MOD;
}
node()
{
}
} tr[];
int ls[],rs[];
int TIME,E,NODE,n,m,p,q,x,y;char ch;bool rev;
int pos[],start[],en[];
int dep[],top[],fa[],root[];
int to[],nex[],fir[],size[];
long long f[];
int son(int x,int y)
{
while(dep[fa[top[y]]]>dep[x]) y=fa[top[y]];
if(fa[top[y]]==x) return top[y];
else return pos[start[x]+];
}
void add(int p,int q)
{
to[++E]=q;nex[E]=fir[p];fir[p]=E;
}
int build(int now,int fat)
{
fa[now]=fat;
dep[now]=dep[fat]+;
size[now]=;
for(int i=fir[now];i;i=nex[i])
if(to[i]!=fat)
size[now]+=build(to[i],now);
return size[now];
}
void pou(int now,int Top)
{
top[now]=Top;start[now]=++TIME;pos[TIME]=now;
int id=;
for(int i=fir[now];i;i=nex[i])
if(to[i]!=fa[now])
if(!id || size[to[i]]>size[id]) id=to[i];
if(id) pou(id,Top);
for(int i=fir[now];i;i=nex[i])
if(to[i]!=fa[now] && to[i]!=id)
pou(to[i],to[i]);
en[now]=TIME;
}
int lca(int x,int y)
{
for(;top[x]!=top[y];x=fa[top[x]])
if(fa[top[x]]<fa[top[y]]) swap(x,y);
return dep[x]>dep[y]?y:x;
}
long long fib(int F,int S,int x)
{
if(x==) return F;
if(x==) return S;
return (f[x-]*F+f[x-]*S)%MOD;
}
long long getsum(int now,int x,int y)
{
if(y==) return (tr[now].f+tr[now].F)%MOD;
if(x== && y==) return ((tr[now].f+tr[now].F)%MOD+(tr[now].s+tr[now].S)%MOD)%MOD;
if(x== && y==) return (tr[now].s+tr[now].S)%MOD;
int F=(((y&?:-)*f[y-]*tr[now].F-(y&?:-)*f[y-]*tr[now].S)%MOD+MOD)%MOD,S=(((y&?-:)*f[y-]*tr[now].F+(y&?:-)*f[y-]*tr[now].S)%MOD+MOD)%MOD;
return (fib(tr[now].f,tr[now].s,y+)-fib(tr[now].f,tr[now].s,x+)+MOD+fib(F,S,y-x+)-S+MOD)%MOD;
}
int que(int now,int l,int r,int x,int y)
{
if(!now) return ;
if(l==x && r==y)
return tr[now].sum;
int ret=getsum(now,x-l+,y-l+);
if(x<=mid) ret=(ret+que(ls[now],l,mid,x,min(y,mid)))%MOD;
if(y>mid) ret=(ret+que(rs[now],mid+,r,max(mid+,x),y))%MOD;
return ret;
}
int add(int acc,int l,int r,int x,int y,int st,bool rev)
{
int now=++NODE;
if(NODE>) while();
tr[now]=tr[acc];
if(l==x && r==y)
{
if(rev) tr[now]=node(tr[acc].f,tr[acc].s,tr[acc].F+f[st],tr[acc].S+f[st-],tr[acc].sum+f[st+]-f[st+l-r+]+MOD);
else tr[now]=node(tr[acc].f+f[st],tr[acc].s+f[st+],tr[acc].F,tr[acc].S,tr[acc].sum+f[st+r-l+]-f[st+]+MOD);
ls[now]=ls[acc];rs[now]=rs[acc];
return now;
}
if(x<=mid && y<=mid)
ls[now]=add(ls[acc],l,mid,x,y,st,rev),rs[now]=rs[acc];
else
if(y>mid && x>mid)
ls[now]=ls[acc],rs[now]=add(rs[acc],mid+,r,x,y,st,rev);
else
{
ls[now]=add(ls[acc],l,mid,x,mid,st,rev);
rs[now]=add(rs[acc],mid+,r,mid+,y,st+(rev?-:)*(mid-x+),rev);
}
tr[now].sum=(tr[ls[now]].sum+tr[rs[now]].sum+getsum(now,,r-l+))%MOD;
return now;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<n;i++)
scanf("%d%d",&p,&q),
add(p,q),add(q,p);
build(,);pou(,);
f[]=;f[]=;
for(int i=;i<=n+;i++)
{
f[i]=f[i-]+f[i-];
if(f[i]>MOD) f[i]-=MOD;
}
root[]=;NODE=;
int lastans=;
for(int i=;i<=m;i++)
{
root[i]=root[i-];
char S[];
scanf("%s",&S);
if(S[]=='A')
{
scanf("%d%d",&x,&y);
if(!DEBUG)
x^=lastans;
if(x>n) while();
bool rev=;int len=,leng=dep[x]+dep[y]-*dep[lca(x,y)]+;
for(;top[x]!=top[y];x=fa[top[x]])
{
if(dep[top[x]]<dep[top[y]]) swap(x,y),rev^=;
if(rev) leng-=Len;else len+=Len;
root[i]=add(root[i],,n,start[top[x]],start[x],rev?leng+:len-,!rev);
}
if(dep[x]>dep[y]) swap(x,y),rev^=;
root[i]=add(root[i],,n,start[x],start[y],rev?leng:len,rev);
}
if(S[]=='R')
{
scanf("%d",&x);
if(!DEBUG)
x^=lastans;
if(x>=i) while();
root[i]=root[x];
}
if(S[]=='Q')
{
scanf("%d%d",&x,&y);
if(!DEBUG)
x^=lastans;
if(x>n) while();
int t=lca(x,y);
if(S[]=='S')
if(x!=y)
if(t==y)
{
int tem=son(y,x);
lastans=(Que(root[i],,n)-Que(root[i],start[tem],en[tem])+MOD)%MOD;
}
else
lastans=Que(root[i],start[y],en[y]);
else
lastans=Que(root[i],,n);
else
{
lastans=;
for(;top[x]!=top[y];x=fa[top[x]])
{
if(dep[top[x]]<dep[top[y]]) swap(x,y);
lastans+=Que(root[i],start[top[x]],start[x]);
lastans%=MOD;
}
if(dep[x]>dep[y]) swap(x,y);
lastans+=Que(root[i],start[x],start[y]);
lastans%=MOD;
}
printf("%d\n",lastans);
}
}
return ;
}
codechef FIBTREE 码农题 线段树 树剖 标记永久化的更多相关文章
- bzoj3159决战 码农题 树剖套splay
最近沉迷码农题无法自拔 首先有一个暴力的想法:对于每个重链维护一个splay,需要翻转的连起来,翻转,接回去 然后发现这样没问题... 一条链只能跨log个重链,也就只有log个splay的子树参与重 ...
- 【BZOJ-2892&1171】强袭作战&大sz的游戏 权值线段树+单调队列+标记永久化+DP
2892: 强袭作战 Time Limit: 50 Sec Memory Limit: 512 MBSubmit: 45 Solved: 30[Submit][Status][Discuss] D ...
- BZOJ 2157 旅行(树链剖分码农题)
写了5KB,1发AC... 题意:给出一颗树,支持5种操作. 1.修改某条边的权值.2.将u到v的经过的边的权值取负.3.求u到v的经过的边的权值总和.4.求u到v的经过的边的权值最大值.5.求u到v ...
- BZOJ 3221: [Codechef FEB13] Obserbing the tree树上询问( 可持久化线段树 + 树链剖分 )
树链剖分+可持久化线段树....这个一眼可以看出来, 因为可持久化所以写了标记永久化(否则就是区间修改的线段树的持久化..不会), 结果就写挂了, T得飞起...和管理员拿数据调后才发现= = 做法: ...
- 「CQOI2006」简单题 线段树
「CQOI2006」简单题 线段树 水.区间修改,单点查询.用线段树维护区间\([L,R]\)内的所有\(1\)的个数,懒标记表示为当前区间是否需要反转(相对于区间当前状态),下方标记时懒标记取反即可 ...
- Codechef FIBTREE 树链剖分 主席树 LCA 二次剩余 快速幂
原文链接https://www.cnblogs.com/zhouzhendong/p/CC-FIBTREE.html 题目传送门 - CC-FIBTREE 题意 给定一个有 $n$ 个节点,初始点权都 ...
- 【BZOJ-4636】蒟蒻的数列 动态开点线段树 ||(离散化) + 标记永久化
4636: 蒟蒻的数列 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 247 Solved: 113[Submit][Status][Discuss ...
- [luogu P3801] 红色的幻想乡 [线段树][树状数组]
题目背景 蕾米莉亚的红雾异变失败后,很不甘心. 题目描述 经过上次失败后,蕾米莉亚决定再次发动红雾异变,但为了防止被灵梦退治,她决定将红雾以奇怪的阵势释放. 我们将幻想乡看做是一个n*m的方格地区,一 ...
- Luogu 45887 全村最好的嘤嘤刀(线段树 树状数组)
https://www.luogu.org/problemnew/show/T45887 题目背景 重阳节到了,我们最好的八重樱拥有全村最好的嘤嘤刀…… 题目描述 在绯玉丸力量的影响下,八重村成了一条 ...
随机推荐
- C/C++连接查询MYSQL
1. [代码][C/C++]代码 #include <mysql/mysql.h>#include <stdio.h>#include <string.h>int ...
- Bootstrap简单介绍
一.一个小知识点 1.截取长屏的操作 2.设置默认格式 3.md,sm, xs 4.空格和没有空格的选择器 二.响应式介绍 - 响应式布局是什么? 同一个网页在不同的终端上呈现不同的布局等 - 响应式 ...
- 分享知识-快乐自己:Hibernate 中的 HQL 语句的实际应用
概要: Hibernate 支持三种查询方式: HQL查询.Criteria查询及原声 SQL (Native SQL)查询. HQL(Hibernate Query Language,Hiberna ...
- u3d 多线程 网络
开启一个线程做网络连接,和接收数据, 用event进行广播 using UnityEngine; using System; using System.Threading; using System. ...
- codewar代码练习1——8级晋升7级
最近发现一个不错的代码练习网站codewar(http://www.codewars.com).注册了一个账号,花了几天的茶余饭后时间做题,把等级从8级升到了7级.本文的目的主要介绍使用感受及相应题目 ...
- L2-028 秀恩爱分得快(25 分)
古人云:秀恩爱,分得快. 互联网上每天都有大量人发布大量照片,我们通过分析这些照片,可以分析人与人之间的亲密度.如果一张照片上出现了 K 个人,这些人两两间的亲密度就被定义为 1/K.任意两个人如果同 ...
- P2060 [HNOI2006]马步距离
P2060 [HNOI2006]马步距离 数据到百万级别,明显爆搜不行,剪枝也没法剪.先打表.发现小数据内步数比较受位置关系影响,但数据一大就不影响了.大概搜了一个20*20的表把赋值语句打出来.判断 ...
- robotium 测试APK<一> 建立测试工程
1.准备Android开发环境 2.准备签名工具http://www.troido.de/re-sign.jar 1.建立测试工程 打开Eclipse,点击File->New一个Android ...
- InformationSecurity:template
ylbtech-InformationSecurity: 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 6.返回顶部 作者:ylbtech出处:ht ...
- python2 + selenium + eclipse 中,配置好runserver 127.0.0.1:9000,运行的时候,报错
python2 + selenium + eclipse 中,配置好runserver 127.0.0.1:9000,运行的时候,报错,如图: 原因: google发现是WSGI appl ...