【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

时间: 2024-10-12 23:49:36

【xsy2440】【GDOI2016】疯狂动物城的相关文章

疯狂动物城 zootopia

今天下午出去溜达溜达,看了被大家安利了很久的疯狂动物城. 从技术上说,确实超级厉害啊.完整的呈现了一个动物的世界,而且对每个动物都有精准的刻画,对细节非常之讲究.也看过一些网上的动画技术分析贴,不得不感慨迪士尼强大的动画技术. 从动画的剧情来说,这部电影带给人的更多呀,作为一个将要步入工作岗位的女生,在女主角朱迪的身上多多少少看到了自己的影子,出身小城,要去一个大城市打拼,从事的行业带有偏见等等.抛开电影中表现的其他内容,对于我来说这个电影更像一碗心灵鸡汤,朱迪也像是我们这些正在奋斗的女生的一个

疯狂动物城台词:

疯狂动物城 1.Fear, treachery, blood lust. 恐惧,背叛,还有血腥 treachery: lust: 2.Thousands of years ago, these were the forces that ruled our world. 很早很早以前,这是主宰我们世界的主要力量 3.A world where prey were scared of predators. 那是一个弱肉强食的世界 predators: 4.And predators had an u

《疯狂动物城》观影感受

过了三个月才开始观看这部电影,这是一部制作精良的作品,让我愉快的度过了周末的夜晚. 该片讲述的是在一个动物和平共处的城市Zootopia,兔子朱迪通过自己不懈努力,实现自己童年梦想,成为一名动物城警察的故事. 有几个细节印象深刻. 第一就是去车管所查询车牌归属的情节,搞笑幽默有创意. 第二就是狐狸倾诉童年阴影的情节,造就了他的冷静. One,I was never gonna let anyone see that they got to me. Two,If the world's only

[GDOI2016] 疯狂动物园 [树链剖分+可持久化线段树]

题面 太长了,而且解释的不清楚,我来给个简化版的题意: 给定一棵$n$个点的数,每个点有点权,你需要实现以下$m$个操作 操作1,把$x$到$y$的路径上的所有点的权值都加上$delta$,并且更新一个版本 操作2,对于有向路径$(x,y)$上的点$a_i$,求下面的和值: $\sum_{i=1}^{len} a_i \sum_{j=1}^{len-i} j$ 操作3,回到第$i$个版本(但是下一次更新以后还是到总版本号+1的那个版本) 思路 这个题显然一眼就是树剖+可持久化数据结构啊 那么核心

python读取外部文件

1 >>> pd.read_excel('c://111.xlsx') 2 年度排名 历史排名 电影名称 总票房 总人次 总场次 上映年份 操作 3 0 1 1 美人鱼 NaN -- -- 2016 数据纠错 4 1 2 9 疯狂动物城 NaN -- -- 2016 数据纠错 5 2 3 10 魔兽 NaN -- -- 2016 数据纠错 6 3 4 17 美国队长3:英雄内战 NaN -- -- 2016 数据纠错 7 4 5 18 西游记之孙悟空三打白骨精 NaN -- -- 201

THUSC 2016游记

又去北京转了一圈,拿到了很不错的协议,非常的开森 day -1 6.2 上午去pku的同学就走了QAQ 然后波哥说下午要考试,考联考题 我一脸无奈的表示我已经提前要到题目而且看了题了 然后波哥就决定给我单独换一套题,于是就发生了悲惨的故事 他给我换了一套Nescafe的题目! 结果下午被两道FFT和一道数论题拍了一脸懵逼 晚上一直在颓颓颓,搞定了BZOJ的一道数据结构题 一脸不情愿的去改Nescafe的题目(结果第二题貌似压位大法+O2就A掉了) 然后就很不想去改第二题(感觉每天暴力写写一副滚粗

表单验证的设计

不说废话,直接留干货.实现的效果:多条表单提交的时候,如果某个表单的输入不和格式要求,则提示对应的错误信息,所有表单的内容合适,则提交到后台.显示代码(这里的dom的结构不唯一,我只是在我实际的项目中,遇到的解决方案) dom: css: js: 显示的效果: 全部格式不对: 部分不对: 验证为空后继续验证是否符合电话格式(这里只做了这个具体的验证,也可以做邮箱的验证,就要单独写正则验证邮箱) 总结:这样做的好处就是,在提交表单的时候,如果某条表单格式不对,可以立马显示出对应表单,不用一条一条的

程序员超浓鸡汤,知乎上赞同数最高的999个回答

原文出处 http://lanbing510.info/2016/04/14/ZhiHu-Good-Answers.html#title0 最近发现这个文章,真的是非常适合程序员看的鸡汤文列表,超强浓缩版的!!! 1哪些素质很重要,却是读书学不来的?101501肥肥猫 2有哪些很重要又被忽视的炒菜技巧?85658庄力 3想要充实自己,有哪 10 本书和 10 部电影值得推荐?77738Jee Xin 4要怎样努力,才能成为很厉害的人?76144朱炫 5如何看待「医生拒绝给艾滋病人做手术」?748

自己看过的电影

1两小无猜    真挚的永恒的爱情2暖春         人性的回归真情3雾都孤儿     人性回归   4东邪西毒     不懂5七宗罪       人性的缺点6外星人ET      童心7伊豆舞女     舞女与书生 8加勒比海盗123  魔幻大作9机器人总动员   爱情最好最简单的诠释10夏洛特的网    友情11七磅          救赎12剪刀手爱德华   人类中的不容易被人接纳类人13一公升眼泪     坚强乐观向上14雏菊           真爱15少女杀手阿莫    不懂主题