【xsy2440】【GDOI2016】疯狂动物城
感受一下这恐怖的题目长度~~~
其实题意很裸,但是作为GDOI的一道防AK题,自然有他优秀的地方。
简化题意:给出一棵树,要求支持三个操作:
1.修改点值
2.询问点$x$到$y$之间的一些东东
3.回到某个版本之前
可持久化,强制在线。
考虑拆一下询问
如果把$x$到$y$路径上的所有点值放到一个数组$a$里,那么询问式子就是:
$\sum\limits_{i=1}^{n}a[i]\times\sum\limits_{j=1}^{n-i}j$
$=\sum\limits_{i=1}^{n}a[i]\times\frac{(n-i+1)\times(n-i)}{2}$
$=\sum\limits_{i=1}^{n}a[i]\times i^{2}-a[i]\times(2n+1)+a[i]\times n\times(n+1)$
发现$a[i]$,$a[i]\times i$,$a[i]\times i^2$都是常系数,于是就可以快乐维护了~
外面的很容易想到,树链剖分+可持久化线段树,单点修改即可。
可以感觉到逐渐膨胀的代码量>_<
注意到有左右方向的区别,要写两遍
代码量起飞了>_<
5000B刷新最长代码记录
注意:记得取模,随时爆int;
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<cmath> 5 #define mod 20160501 6 using namespace std; 7 typedef long long ll; 8 struct edge{ 9 int v,next; 10 }a[500001]; 11 struct data{ 12 ll s,a1,a2,s1,s2,ls,rs,lz,vv; 13 }t[5000001]; 14 ll n,m,u,v,w,ord,tim=0,tot=0,tote=0,ans=0,nrt=0,nowrt=0,last=0,ans1[2],ans2[2],head[1000001],rt[1000001],num[1000001],nmd[1000001],dep[1000001],top[1000001],siz[1000001],dfn[1000001],son[1000001],fa[1000001]; 15 void add(int u,int v){ 16 a[++tote].v=v; 17 a[tote].next=head[u]; 18 head[u]=tote; 19 } 20 void dfs1(int u,int f,int dpt){ 21 fa[u]=f; 22 dep[u]=dpt; 23 siz[u]=1; 24 for(int tmp=head[u];tmp!=-1;tmp=a[tmp].next){ 25 int v=a[tmp].v; 26 if(v==f)continue; 27 dfs1(v,u,dpt+1); 28 siz[u]+=siz[v]; 29 if(son[u]==-1||siz[v]>siz[son[u]])son[u]=v; 30 } 31 } 32 void dfs2(int u,int nowtp){ 33 top[u]=nowtp; 34 dfn[u]=++tim; 35 nmd[tim]=u; 36 if(son[u]==-1)return; 37 dfs2(son[u],nowtp); 38 for(int tmp=head[u];tmp!=-1;tmp=a[tmp].next){ 39 int v=a[tmp].v; 40 if(v==son[u]||v==fa[u])continue; 41 dfs2(v,v); 42 } 43 } 44 void pushup(int u){ 45 t[u].s=(t[t[u].ls].s+t[t[u].rs].s)%mod; 46 t[u].a1=(t[t[u].ls].a1+t[t[u].rs].a1)%mod; 47 t[u].a2=(t[t[u].ls].a2+t[t[u].rs].a2)%mod; 48 t[u].s1=(t[t[u].ls].s1+t[t[u].rs].s1)%mod; 49 t[u].s2=(t[t[u].ls].s2+t[t[u].rs].s2)%mod; 50 } 51 void build(int l,int r,int u){ 52 if(l==r){ 53 t[u].s=num[nmd[l]]; 54 t[u].a1=dep[nmd[l]]; 55 t[u].a2=(t[u].a1*t[u].a1)%mod; 56 t[u].s1=(t[u].s*t[u].a1)%mod; 57 t[u].s2=(t[u].s*t[u].a2)%mod; 58 return; 59 } 60 int mid=(l+r)/2; 61 build(l,mid,t[u].ls=++tot); 62 build(mid+1,r,t[u].rs=++tot); 63 pushup(u); 64 } 65 void updata(int l,int r,int u,int L,int R,int lst,ll v){ 66 if(u==tot)t[u]=t[lst]; 67 if(l==L&&r==R){ 68 t[u].ls=t[lst].ls; 69 t[u].rs=t[lst].rs; 70 t[u].lz=(t[u].lz+v)%mod; 71 t[u].s1=(t[u].s1+t[u].a1*v)%mod; 72 t[u].s2=(t[u].s2+t[u].a2*v)%mod; 73 t[u].s=(t[u].s+v*(r-l+1))%mod; 74 t[u].vv=(t[u].vv+v)%mod; 75 return; 76 } 77 int mid=(l+r)/2; 78 if(R<=mid){ 79 if(t[u].rs<=last)t[u].rs=t[lst].rs; 80 if(t[u].ls<=last)t[u].ls=++tot; 81 updata(l,mid,t[u].ls,L,R,t[lst].ls,v); 82 }else if(mid<L){ 83 if(t[u].ls<=last)t[u].ls=t[lst].ls; 84 if(t[u].rs<=last)t[u].rs=++tot; 85 updata(mid+1,r,t[u].rs,L,R,t[lst].rs,v); 86 }else{ 87 if(t[u].ls<=last)t[u].ls=++tot; 88 updata(l,mid,t[u].ls,L,mid,t[lst].ls,v); 89 if(t[u].rs<=last)t[u].rs=++tot; 90 updata(mid+1,r,t[u].rs,mid+1,R,t[lst].rs,v); 91 } 92 t[u].s1=(t[t[u].ls].s1+t[t[u].rs].s1+t[u].a1*t[u].vv%mod)%mod; 93 t[u].s2=(t[t[u].ls].s2+t[t[u].rs].s2+t[u].a2*t[u].vv%mod)%mod; 94 t[u].s=(t[t[u].ls].s+t[t[u].rs].s+t[u].vv*(r-l+1)%mod)%mod; 95 } 96 void getans(int u,int b,ll lz,ll v){ 97 ans=(ans+t[u].s2+lz*t[u].a2%mod)%mod; 98 ans1[b]=(ans1[b]+t[u].s1+t[u].a1*lz%mod)%mod; 99 ans2[b]=(ans2[b]+t[u].s+v*lz%mod)%mod; 100 } 101 void query(int l,int r,int u,int L,int R,int b,ll lz){ 102 if(!u)return; 103 lz+=t[u].vv; 104 if(l==L&&r==R){ 105 lz-=t[u].lz; 106 getans(u,b,lz,r-l+1); 107 return; 108 } 109 int mid=(l+r)/2; 110 if(R<=mid)query(l,mid,t[u].ls,L,R,b,lz); 111 else if(mid<L)query(mid+1,r,t[u].rs,L,R,b,lz); 112 else{ 113 query(l,mid,t[u].ls,L,mid,b,lz); 114 query(mid+1,r,t[u].rs,mid+1,R,b,lz); 115 } 116 } 117 void work(int t,int t1,int u,int v,ll w){ 118 while(top[u]!=top[v]){ 119 if(dep[top[u]]<dep[top[v]])swap(u,v); 120 updata(1,n,rt[t],dfn[top[u]],dfn[u],rt[t1],w); 121 u=fa[top[u]]; 122 } 123 if(dep[u]>dep[v])swap(u,v); 124 updata(1,n,rt[t],dfn[u],dfn[v],rt[t1],w); 125 } 126 int work1(int t,int u,int v){ 127 while(top[u]!=top[v]){ 128 if(dep[top[u]]>dep[top[v]]){ 129 query(1,n,rt[t],dfn[top[u]],dfn[u],0,0); 130 u=fa[top[u]]; 131 }else{ 132 query(1,n,rt[t],dfn[top[v]],dfn[v],1,0); 133 v=fa[top[v]]; 134 } 135 } 136 if(dep[u]>dep[v]){ 137 query(1,n,rt[t],dfn[v],dfn[u],0,0); 138 return v; 139 }else{ 140 query(1,n,rt[t],dfn[u],dfn[v],1,0); 141 return u; 142 } 143 } 144 int main(){ 145 memset(son,-1,sizeof(son)); 146 memset(head,-1,sizeof(head)); 147 scanf("%lld%lld",&n,&m); 148 for(int i=1;i<n;i++){ 149 scanf("%lld%lld",&u,&v); 150 add(u,v); 151 add(v,u); 152 } 153 for(int i=1;i<=n;i++)scanf("%lld",&num[i]); 154 dfs1(1,0,1); 155 dfs2(1,1); 156 rt[0]=tot=1; 157 build(1,n,rt[0]); 158 for(int i=1;i<=m;i++){ 159 scanf("%lld",&ord); 160 if(ord==1){ 161 scanf("%lld%lld%lld",&u,&v,&w); 162 u^=ans; 163 v^=ans; 164 last=tot; 165 rt[++nrt]=++tot; 166 work(nrt,nowrt,u,v,w); 167 nowrt=nrt; 168 }else if(ord==2){ 169 scanf("%lld%lld",&u,&v); 170 u^=ans; 171 v^=ans; 172 ans=ans1[0]=ans1[1]=ans2[0]=ans2[1]=0; 173 int t=dep[v]-dep[work1(nowrt,u,v)]*2; 174 ans=(ans+ans1[0]*(t*2+1)%mod+ans2[0]*t%mod*(t+1)%mod)%mod; 175 ans=(ans-ans1[1]*(dep[v]*2+1)%mod+ans2[1]*dep[v]%mod*(dep[v]+1)%mod+mod)%mod; 176 ans=(ans*10080251)%(ll)mod; 177 ans=(ans+mod)%mod; 178 printf("%lld\n",ans); 179 }else{ 180 scanf("%lld",&u); 181 u^=ans; 182 nowrt=u; 183 } 184 } 185 return 0; 186 }
转载于:https://www.cnblogs.com/dcdcbigbig/p/9222650.html
【xsy2440】【GDOI2016】疯狂动物城相关推荐
- matlab兔子繁殖问题,斐波那契数列在《疯狂动物城》兔子繁衍中的应用
摘 要: 计算思维的构建有助于帮助学生将实际问题转换为透明易懂的框架算法, 并借助计算机解决.以电影<疯狂动物城>中的兔子繁殖问题为例, 引出斐波那契数列, 引导学生将数学表达式转化 ...
- 疯狂动物城简介第一台通用计算机,疯狂动物城 简介
剧情简介 一个现代化的动物都市,每种动物在这里都有自己的居所,有沙漠气候的撒哈拉广场.常年严寒的冰川镇等等,它就像一座大熔炉,动物们在这里和平相处,无论是大象还是小老鼠,只要努力,都能闯出一番名堂. ...
- 美通社企业新闻汇总 | 2019.1.23 | 上海迪士尼建疯狂动物城园区;戴森运营总部移至新加坡...
要闻 埃森哲:中国员工对企业采集个人数据持更开放态度 戴森运营总部将从英国移至新加坡 上海迪士尼将建疯狂动物城主题园区 默克与腾讯就中国智能数字医疗服务展开合作 中联重科打造的全球最大塔机智能工厂开园 ...
- 浅析疯狂动物城的制作流程
前言 今天拜读了houdini官网发布的疯狂动物城,整篇文章我基本是跪着读完的.这篇文章讲的是 houdini 在疯狂动物城制作流程中的作用,但即使是这样感觉还是太震惊了.就趁着还有印象写点东西记录一 ...
- 探究下疯狂动物城Zootopia为何如此高分的原因
探究下疯狂动物城Zootopia为何如此高分的原因 时隔差不多一年,疯狂动物城这部动画片算是已经取得圆满结果,在豆瓣和IMDb上都取得不错的分数,分别为9.2分(5分制,为了比较乘以2)和8.1分(1 ...
- EDIUS 9带你剪辑萌萌的《疯狂动物城》
电影的原名为zootopia,意思为动物乌托邦,这部电影其实比较适合成人和大小孩看,因为其中夹杂了一些人文关怀,暗讽,偏见,人性,以及向经典致敬 等等深程度的东西.可以说是披了迪斯尼外衣的成人电影.但 ...
- 《疯狂动物城》水彩画
这是学习笔记的第 2246 篇文章 读完需要 2 分钟 速读仅需1分钟 周末孩子给我摆好了水彩笔和纸,刚好露一手,于是画了这个<疯狂动物城>,整个过程大概用了3个小时(早上1个多小时,晚上 ...
- 上海迪士尼将建疯狂动物城主题园区
上海迪士尼度假区宣布全新的主题乐园扩建计划:上海迪士尼乐园将以华特迪士尼公司最受欢迎的动画电影之一 -- "疯狂动物城"中的角色和故事为灵感,打造全新主题园区,让游客身临其境地体验 ...
- 上海迪士尼“疯狂动物城”主题园区启动主要施工
上海迪士尼度假区宣布其主题乐园中最新的主题园区暨其第八大主题园区 -- "疯狂动物城"完成场地准备工作,正式启动主要施工.这一最新进展是该项目的关键里程碑,标志着游客离迈入&quo ...
- 疯狂动物城 zootopia
今天下午出去溜达溜达,看了被大家安利了很久的疯狂动物城. 从技术上说,确实超级厉害啊.完整的呈现了一个动物的世界,而且对每个动物都有精准的刻画,对细节非常之讲究.也看过一些网上的动画技术分析贴,不得不 ...
最新文章
- 无风扇网站服务器,这款服务器采用无风扇设计
- 我在工作中是如何使用Git的
- 前端学习(1408):多人管理28用户信息展示
- 可以用什么代替平面镜
- eslint 规则中文注释
- 《南溪的目标检测学习笔记》的笔记目录
- android mvp框架基类,Android MVP架构模式基类封装
- 国自然标书,600多份成功申请基金的标书 可下载
- IE浏览器假死解决办法
- Orthogonal greedy algorithm降维
- h3c交换机端口加入vlan命令_7.2.2 H3C交换机VLAN接口基本属性配置
- 高薪程序员面试题精讲系列89之MySQL有哪些索引?
- VLDB2021会议论文列表(可下载)
- java隐藏类_java Class类中隐藏和覆盖的区别
- 牛顿下山法(Matlab实现)
- 解决pgAdmin4安装后,启动失败的问题
- jsp导入MySQL包_jsp操作数据库需要导入的包
- java将图片变灰、去噪、反色
- 2021_GDUT_新生专题训练_数论
- Python分类实例之猫狗大战