感受一下这恐怖的题目长度~~~

其实题意很裸,但是作为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】疯狂动物城相关推荐

  1. matlab兔子繁殖问题,斐波那契数列在《疯狂动物城》兔子繁衍中的应用

    摘    要: 计算思维的构建有助于帮助学生将实际问题转换为透明易懂的框架算法, 并借助计算机解决.以电影<疯狂动物城>中的兔子繁殖问题为例, 引出斐波那契数列, 引导学生将数学表达式转化 ...

  2. 疯狂动物城简介第一台通用计算机,疯狂动物城 简介

    剧情简介 一个现代化的动物都市,每种动物在这里都有自己的居所,有沙漠气候的撒哈拉广场.常年严寒的冰川镇等等,它就像一座大熔炉,动物们在这里和平相处,无论是大象还是小老鼠,只要努力,都能闯出一番名堂. ...

  3. 美通社企业新闻汇总 | 2019.1.23 | 上海迪士尼建疯狂动物城园区;戴森运营总部移至新加坡...

    要闻 埃森哲:中国员工对企业采集个人数据持更开放态度 戴森运营总部将从英国移至新加坡 上海迪士尼将建疯狂动物城主题园区 默克与腾讯就中国智能数字医疗服务展开合作 中联重科打造的全球最大塔机智能工厂开园 ...

  4. 浅析疯狂动物城的制作流程

    前言 今天拜读了houdini官网发布的疯狂动物城,整篇文章我基本是跪着读完的.这篇文章讲的是 houdini 在疯狂动物城制作流程中的作用,但即使是这样感觉还是太震惊了.就趁着还有印象写点东西记录一 ...

  5. 探究下疯狂动物城Zootopia为何如此高分的原因

    探究下疯狂动物城Zootopia为何如此高分的原因 时隔差不多一年,疯狂动物城这部动画片算是已经取得圆满结果,在豆瓣和IMDb上都取得不错的分数,分别为9.2分(5分制,为了比较乘以2)和8.1分(1 ...

  6. EDIUS 9带你剪辑萌萌的《疯狂动物城》

    电影的原名为zootopia,意思为动物乌托邦,这部电影其实比较适合成人和大小孩看,因为其中夹杂了一些人文关怀,暗讽,偏见,人性,以及向经典致敬 等等深程度的东西.可以说是披了迪斯尼外衣的成人电影.但 ...

  7. 《疯狂动物城》水彩画

    这是学习笔记的第 2246 篇文章 读完需要 2 分钟 速读仅需1分钟 周末孩子给我摆好了水彩笔和纸,刚好露一手,于是画了这个<疯狂动物城>,整个过程大概用了3个小时(早上1个多小时,晚上 ...

  8. 上海迪士尼将建疯狂动物城主题园区

    上海迪士尼度假区宣布全新的主题乐园扩建计划:上海迪士尼乐园将以华特迪士尼公司最受欢迎的动画电影之一 -- "疯狂动物城"中的角色和故事为灵感,打造全新主题园区,让游客身临其境地体验 ...

  9. 上海迪士尼“疯狂动物城”主题园区启动主要施工

    上海迪士尼度假区宣布其主题乐园中最新的主题园区暨其第八大主题园区 -- "疯狂动物城"完成场地准备工作,正式启动主要施工.这一最新进展是该项目的关键里程碑,标志着游客离迈入&quo ...

  10. 疯狂动物城 zootopia

    今天下午出去溜达溜达,看了被大家安利了很久的疯狂动物城. 从技术上说,确实超级厉害啊.完整的呈现了一个动物的世界,而且对每个动物都有精准的刻画,对细节非常之讲究.也看过一些网上的动画技术分析贴,不得不 ...

最新文章

  1. 无风扇网站服务器,这款服务器采用无风扇设计
  2. 我在工作中是如何使用Git的
  3. 前端学习(1408):多人管理28用户信息展示
  4. 可以用什么代替平面镜
  5. eslint 规则中文注释
  6. 《南溪的目标检测学习笔记》的笔记目录
  7. android mvp框架基类,Android MVP架构模式基类封装
  8. 国自然标书,600多份成功申请基金的标书 可下载
  9. IE浏览器假死解决办法
  10. Orthogonal greedy algorithm降维
  11. h3c交换机端口加入vlan命令_7.2.2 H3C交换机VLAN接口基本属性配置
  12. 高薪程序员面试题精讲系列89之MySQL有哪些索引?
  13. VLDB2021会议论文列表(可下载)
  14. java隐藏类_java Class类中隐藏和覆盖的区别
  15. 牛顿下山法(Matlab实现)
  16. 解决pgAdmin4安装后,启动失败的问题
  17. jsp导入MySQL包_jsp操作数据库需要导入的包
  18. java将图片变灰、去噪、反色
  19. 2021_GDUT_新生专题训练_数论
  20. Python分类实例之猫狗大战

热门文章

  1. Qt鼠标拖曳以后松开停留在悬停颜色BUG
  2. Android下雪动画的实现
  3. 5分钟使用ssl证书免费配置任意域名的 https
  4. 【智力题】:毒酒问题
  5. 《CSS世界》笔记二:盒模型四大家族
  6. From COM to COM 侯捷
  7. Crypto 学习第二天
  8. Oracle安装 卸载干净文档
  9. PyG搭建GAT实现节点分类
  10. mac的rubywoo怎么读_迪奥999和mac ruby woo哪个更好看_有什么区别