Description

Solution

题目好长,一看就烦

操作1:1,x,y,z把x到y的点权值加z。
操作2:2,x,y把x到y的点一次放进一个数组a里面,统计答案ans=∑ni=1a[i]∗∑n−ij=1ans=\sum_{i=1}^na[i]*\sum_{j=1}^{n-i}。
操作3:3,x所有点的状态回到第x次修改后的。

码农题啊!!!害人啊!!!

不过知道是码农题,在比赛的最后30分钟,竟然毫不犹豫地对其宣战。
失败告终…………………………………………….TAT

对要求的答案拆分

ans=∑i=1na[i]∗(n−i+1)∗(n−i)2

ans=\sum_{i=1}^na[i]*{{(n-i+1)*(n-i)}\over 2}

ans=∑i=1na[i]∗i2−a[i]∗(2∗n+1)∗i+a[i]∗(n+1)∗n

ans=\sum_{i=1}^na[i]*i^2-a[i]*(2*n+1)*i+a[i]*(n+1)*n

在线维护

明显的可持久化线段树,如果要回到历史版本,经典的以时间为一轴的可持久化线段树。
文绉绉的!其实平常统计颜色的时候,当一个节点颜色不同会动态多开一个点。
这道题,当一个点被改过就多开一个点。

答案拆开后

线段树只用统计4个部分:长度,和,值∗序号,值∗序号2长度,和,值*序号,值 *序号^2
合并有些复杂,慢慢的细推,有利于锻炼思维。实在不懂就看程序。
因为序号的遍历方式可能是顺序也可能是逆序,所以每个区间要存两个遍历方式的值。
我打了个struct套struct,这样方便操作。

树上的

树链剖分就可以了。

注意,一不小心就爆int了

Code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define fo(i,a,b) for(i=a;i<=b;i++)
#define fod(i,a,b) for(i=a;i>=b;i--)
#define rep(i,a) for(i=first[a];i;i=next[i])
using namespace std;
typedef long long ll;
const ll maxn=200007,mo=20160501,ni=10080251;
int i,j,k,l,n,m;
int first[maxn*2],next[maxn*2],last[maxn*2],a[maxn],num,tot,u,v;
int deep[maxn],f[maxn][21],size[maxn],son[maxn],top[maxn],w[maxn],fw[maxn],tmp,ceng;
int root[maxn],now;
ll ans;
ll chu3(ll x,ll y) {if (x%3)return y/3%mo*x%mo;return x/3%mo*y%mo;
}
struct sx{ll len,sqr,sum,ji;void kong(){len=sqr=sum=ji=0;}friend sx operator +(sx x,sx y){sx z;z.len=x.len+y.len;z.sum=(x.sum+y.sum)%mo;z.ji=(x.ji+y.ji+x.len*y.sum%mo)%mo;z.sqr=(x.sqr+y.sqr+x.len*x.len%mo*y.sum%mo+2*y.ji%mo*x.len%mo)%mo;return z;}void add(ll z){sum=(sum+z*len%mo)%mo; ji=(ji+len*(len+1)%mo*ni%mo*z%mo)%mo;sqr=(chu3(2*len+1,len*(len+1)/2)*z%mo+sqr)%mo;}
}ans1,ans2;
struct node{sx up,down;int l,r,biao,shu;
}t[maxn*25],op;
void add(int x,int y){last[++num]=y;next[num]=first[x];first[x]=num;
}
void dfs1(int x,int y){int i,k=0;deep[x]=deep[y]+1;f[x][0]=y;size[x]=1;rep(i,x){if(last[i]!=y){dfs1(last[i],x);size[x]+=size[last[i]];if(size[last[i]]>k)k=size[last[i]],son[x]=last[i];}}
}
void dfs2(int x,int y){int i;w[x]=++tot,fw[tot]=x,top[x]=y;if(!son[x])return;dfs2(son[x],y);rep(i,x){if(last[i]!=f[x][0]&&last[i]!=son[x])dfs2(last[i],last[i]);}
}
int lca(int x,int y){int i;if(deep[x]<deep[y])swap(x,y);fod(i,20,0)if(deep[f[x][i]]>deep[y])x=f[x][i];if(deep[x]>deep[y])x=f[x][0];fod(i,20,0)if(f[x][i]!=f[y][i])x=f[x][i],y=f[y][i];if(x!=y)return f[x][0];return x;
}
node merge(node x,node y){node z;z.down=x.down+y.down;z.up=y.up+x.up;return z;
}
void build(int &x,int l,int r){x=++tmp;if(l==r){t[x].up.len=t[x].down.len=1;t[x].up.sum=t[x].down.sum=t[x].up.ji=t[x].down.ji=t[x].up.sqr=t[x].down.sqr=a[fw[l]];return;}int mid=(l+r)/2;build(t[x].l,l,mid);build(t[x].r,mid+1,r);t[x].down=t[t[x].l].down+t[t[x].r].down;t[x].up=t[t[x].r].up+t[t[x].l].up;
}
void back(int &x,int y,ll z){if(!x)return;t[++tmp]=t[x];x=tmp;t[x].shu=y;t[x].biao+=z;t[x].up.add(z);t[x].down.add(z);
}
void down(int x){if(t[x].biao){back(t[x].l,t[x].shu,t[x].biao);back(t[x].r,t[x].shu,t[x].biao);t[x].biao=0;}
}
void change(int &x,int l,int r,int y,int z,ll o){if(!x)return;down(x);if(l==y&&r==z){back(x,ceng,o);return;}   int mid=(l+r)/2;if(t[x].shu!=ceng){t[++tmp]=t[x];x=tmp;t[x].shu=ceng;}if(z<=mid)change(t[x].l,l,mid,y,z,o);else if(y>mid)change(t[x].r,mid+1,r,y,z,o);else change(t[x].l,l,mid,y,mid,o),change(t[x].r,mid+1,r,mid+1,z,o);t[x].down=t[t[x].l].down+t[t[x].r].down;t[x].up=t[t[x].r].up+t[t[x].l].up;
}
void gai(int x,int y,ll z){int f1=top[x],f2=top[y];root[++ceng]=root[now];while(f1!=f2){if(deep[f1]<deep[f2])swap(x,y),swap(f1,f2);change(root[ceng],1,n,w[f1],w[x],z);x=f[f1][0],f1=top[x];}if(deep[x]<deep[y])swap(x,y);change(root[ceng],1,n,w[y],w[x],z);now=ceng;
}
int chang(int x,int y){int o=lca(x,y);return deep[x]+deep[y]-2*deep[o]+1;
}
node find(int x,int l,int r,int y,int z){if(!x)return op;down(x);if(l==y&&r==z)return t[x];int mid=(l+r)/2;if(z<=mid)return find(t[x].l,l,mid,y,z);else if(y>mid)return find(t[x].r,mid+1,r,y,z);else return merge(find(t[x].l,l,mid,y,mid),find(t[x].r,mid+1,r,mid+1,z));
}
void zhao(int x,int y){ans1.kong(),ans2.kong();int o=lca(x,y),ff=top[x];while(deep[ff]>deep[o]){ans1=ans1+find(root[now],1,n,w[ff],w[x]).up;x=f[ff][0],ff=top[x];}ff=top[y];while(deep[ff]>deep[o]){ans2=find(root[now],1,n,w[ff],w[y]).down+ans2;y=f[ff][0],ff=top[y];}if(deep[x]<deep[y])ans1=ans1+find(root[now],1,n,w[x],w[y]).down;else ans2=find(root[now],1,n,w[y],w[x]).up+ans2;ans1=ans1+ans2;
}
int main(){freopen("zootopia.in","r",stdin);freopen("zootopia.out","w",stdout);
//  freopen("fan.in","r",stdin);
//  freopen("fan.out","w",stdout);scanf("%d%d",&n,&m);fo(i,1,n-1){scanf("%d%d",&k,&l);add(k,l);add(l,k);}dfs1(1,0);dfs2(1,1);fo(j,1,20){fo(i,1,n){f[i][j]=f[f[i][j-1]][j-1];}}fo(i,1,n)scanf("%d",&a[i]);build(root[0],1,n);for(;m;m--){scanf("%d%d",&k,&u);u^=ans;if(k==1){scanf("%d%d",&v,&l);v^=ans;gai(u,v,l);}else if(k==2){scanf("%d",&v);v^=ans;ll q=chang(u,v);zhao(u,v);// ans=ni;// ans=ans*((-(2*q+1)*ans1.ji%mo+(q+1)*q%mo*ans1.sum%mo+ans1.sqr)%mo+mo)%mo;ans=(q*(q+1)%mo*ans1.sum%mo-(2*q+1)*ans1.ji%mo+ans1.sqr+mo)%mo;ans=(ans*ni)%mo;printf("%lld\n",ans);}else{now=u;}}
}

【GDOI 2016】第四题 疯狂动物城相关推荐

  1. 【GDOI 2016 Day1】第四题 疯狂动物城

    Description 抽象题意:求可持久化树链剖分 solution 一道巨型码农题! 对于每个数,我们要求aj∗i∗(i+1)/2a_j*i*(i+1)/2, 拆一下:aj∗(i+q)∗(i+1+ ...

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

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

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

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

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

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

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

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

  6. 美通企业日报 | 上海迪士尼疯狂动物城主题园区启动施工;爱茉莉携天猫成立创新工厂...

    今日看点 上海迪士尼"疯狂动物城"主题园区启动主要施工.这一最新进展是该项目的关键里程碑,标志着游客离迈入"疯狂动物城"的故事近了一步.开幕后,该园区将成为全球 ...

  7. 上海迪士尼度假区扩建项目 将增“疯狂动物城”主题园区

    "疯狂动物城"主题园区概念图 供图 摄 "疯狂动物城"主题园区概念图 供图 摄 上海迪士尼度假区宣布全新扩建项目 将新增"疯狂动物城"主题园 ...

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

    少了兔子朱迪和狐狸尼克,动物城还会疯狂吗?当然会!至少我面前的这些大家伙们,一个个疯狂起来,让人直想喊救命! --铁丝人 疯狂动物城 要素:六爪 疯狂物种:章鱼机器人 如果有一天,你见到一个长着6条腿 ...

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

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

最新文章

  1. 超越EfficientNet!MutualNet:一种自适应相互学习网络宽度和分辨率的网络
  2. jQuery学习笔记(Ajax)
  3. RabbitMQ Node.js 示例
  4. CDN服务技术架构图
  5. LSMW批处理使用方法(07)_步骤6、7
  6. maple 假设_Maple常用计算命令..
  7. 关于WCF、WebAPI、WCFREST、WebService之间的区别总结
  8. apache camel_Apache Camel中的短重试与长重试
  9. 学python需要记笔记吗_开始学python,一些笔记
  10. 对别人的一百个羡慕 不如自己的一次努力
  11. 怎样验证软件是否可信?是否被篡改?
  12. win7系统修改启动项
  13. html怎么将背景图片旋转,css怎么旋转图片?
  14. CUDA-NPP图像和视频处理
  15. 反射机制,类的加载机制,和注解的配置参数的结合使用详解
  16. idea 调节背景护眼_IDEA 护眼色设置 背景行颜色取消等设置
  17. 计算机键盘中英文,苹果电脑键盘上的【⌘】键用英文怎么表达?和露营地又有什么关系...
  18. html表格序号自动增加
  19. java时间转换为标准时间
  20. 求职简历中一些常见的问题

热门文章

  1. 速卖通教你如何提升店铺转化率——测评补单
  2. Android Jetpack Compose 最全上手指南 | 开发者说·DTalk
  3. 只需一步,永久白嫖!请低调使用!
  4. git操作提示please tell me who you are问题
  5. java如何计算吞吐量_如何计算进程调度算法的吞吐量(How to calculate throughput of a process scheduling algorithm)...
  6. ArcGIS空间分析实验教程-部分实验案例(ArcPy实现)
  7. 2022年第十四届全国大学生数学竞赛
  8. 未来计算机作文英语,未来的机器人英语作文(精选5篇)
  9. 重新排序(排序不等式+差分)蓝桥
  10. TCP的连接状态标识 (SYN, FIN, ACK, PSH, RST, URG)