树分块

  老早(大约一个月以前?)就听说这道神题了……orz rausen

  一直拖到现在才做……发现还是不会呢= = 只好也去Orz了Hzwer和zky

  http://hzwer.com/5250.html
  http://blog.csdn.net/iamzky/article/details/42125999
 

  这个树上莫队真的蛮神奇的……

  1.对于每个查询,记录它是在第几次修改之后的;

  2.以左端点所在块为第一关键字、右端点所在块为第二关键字、时间(第几次修改之后的查询)为第三关键字进行排序;

  3.对于每个查询,先进行时间上的移动(这个只需对变化了的点进行单点修改即可,有点小Z的袜子中 +1-1的感觉)再进行查询序列的移动(用之前讲的vfk的方法……)至于第二步就跟普通的树分块一样了么……

注意:由于时间移动既有向前也有向后的,所以除了要记录是把哪个点变成了什么糖果,还要记录变化前的原来的状态(时光回溯时用)(用“时光回溯”这个名字是不是十分高大上~~)

错误:1.所有数据点的答案范围都是long long!!

   2.读入单点修改糖果种类的时候,pre[x]=y; 写成了 pre[c2]=y;  QAQ唉细节啊细节!!!pre数组是对点进行“时光回溯”保存的,不是对修改序号进行保存!!!理解不到位啊……(白问大视野要数据了……)

 /**************************************************************
Problem: 3052
User: Tunix
Language: C++
Result: Accepted
Time:117744 ms
Memory:25256 kb
****************************************************************/ //BZOJ 3052
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
using namespace std; int getint(){
int v=,sign=; char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') sign=-; ch=getchar();}
while(isdigit(ch)) {v=v*+ch-''; ch=getchar();}
return v*=sign;
}
typedef long long LL;
/******************tamplate*********************/
const int N=;
LL w[N],v[N];
int n,m,Q;
int head[N],next[N<<],to[N<<],cnt;
void add(int x,int y){
to[++cnt]=y; next[cnt]=head[x]; head[x]=cnt;
to[++cnt]=x; next[cnt]=head[y]; head[y]=cnt;
}
/*******************edge************************/
int B;
int st[N],top,deep[N],belong[N],tot;
int fa[N][],bin[];
void dfs(int x){
int bottom=top;
F(i,,)
if(deep[x]>=bin[i])
fa[x][i]=fa[fa[x][i-]][i-];
else break;
for(int i=head[x];i;i=next[i])
if (to[i]!=fa[x][]){
fa[to[i]][]=x;
deep[to[i]]=deep[x]+;
dfs(to[i]);
if(top-bottom>=B){
++tot;
while(top!=bottom)
belong[st[top--]]=tot;
}
}
st[++top]=x;
}
int LCA(int x,int y){
if(deep[x]<deep[y]) swap(x,y);
int t=deep[x]-deep[y];
for(int i=;bin[i]<=t;i++)
if(t&bin[i]) x=fa[x][i];
D(i,,)
if(fa[x][i]!=fa[y][i])
x=fa[x][i],y=fa[y][i];
if(x==y) return x;
return fa[x][];
}
/*********************dfs&&LCA******************/
struct ques{
int x,y,ti,num;
bool operator < (const ques&now)const{
if(belong[x]==belong[now.x]){
if(belong[y]==belong[now.y]) return ti<now.ti;
else return belong[y]<belong[now.y];
}
else return belong[x]<belong[now.x];
}
}q[N];
struct Time{
int x,y,pre;
}change[N];
int pre[N]; LL ans=,answer[N];
int c[N],num[N],now;
bool used[N];
/*****************分块变量声明******************/
void work(int x){
if (used[x]){
ans-=v[c[x]]*w[num[c[x]]]; num[c[x]]--; used[x]=;
}
else{
num[c[x]]++; ans+=v[c[x]]*w[num[c[x]]]; used[x]=;
}
}
void Xor(int x,int y){
while(x!=y)
if(deep[x]>deep[y]) {work(x);x=fa[x][];}
else {work(y); y=fa[y][];}
}
void Change(int x,int y){//将点x的糖果改为第y种 (权值改为y)
if(used[x]){work(x); c[x]=y; work(x);}
else c[x]=y;
}
void TimeMachine(int tarti){
for(int i=now+;i<=tarti;i++) Change(change[i].x,change[i].y);
for(int i=now;i>tarti;i--) Change(change[i].x,change[i].pre);
now=tarti;
}
/*****************分块函数声明******************/
int main(){
bin[]=; F(i,,) bin[i]=bin[i-]<<; n=getint(); m=getint(); Q=getint();
B=pow(n,2.0/3.0);
int x,y;
F(i,,m) v[i]=getint();//美味指数
F(i,,n) w[i]=getint();//新奇指数
F(i,,n){
x=getint(); y=getint();
add(x,y);
} dfs();
tot++;
while(top) belong[st[top--]]=tot;
F(i,,n) pre[i]=c[i]=getint();//每个节点的糖果种类 int cmd,c1=,c2=;
F(i,,Q){
cmd=getint(); x=getint(); y=getint();
if (cmd){
c2++;
if(belong[x]>belong[y]) swap(x,y);
q[c2]=(ques){x,y,c1,c2};//记录是第几次修改之后的查询
}
else{
c1++;
change[c1]=(Time){x,y,pre[x]};
pre[x]=y;
//有点前向星的感觉,pre[i]保存第i个节点当前是什么种类的糖果
}
}
sort(q+,q+c2+);
//读入&&初始化 end int lca=LCA(q[].x,q[].y);
TimeMachine(q[].ti);
Xor(q[].x,q[].y);
work(lca);
answer[q[].num]=ans;
work(lca);
F(i,,c2){
TimeMachine(q[i].ti);
Xor(q[i-].x,q[i].x);
Xor(q[i-].y,q[i].y);
lca=LCA(q[i].x,q[i].y);
work(lca);
answer[q[i].num]=ans;
work(lca);
}
F(i,,c2) printf("%lld\n",answer[i]);
return ;
}

【BZOJ】【3052】【WC2013】糖果公园的更多相关文章

  1. bzoj 3052: [wc2013]糖果公园 带修改莫队

    3052: [wc2013]糖果公园 Time Limit: 250 Sec  Memory Limit: 512 MBSubmit: 506  Solved: 189[Submit][Status] ...

  2. [BZOJ 3052] [wc2013] 糖果公园 【树上莫队】

    题目链接:BZOJ - 3052 题目分析 这道题就是非常经典的树上莫队了,并且是带修改的莫队. 带修改的莫队:将询问按照 左端点所在的块编号为第一关键字,右端点所在的块为第二关键字,位于第几次修改之 ...

  3. BZOJ.3052.[WC2013]糖果公园(树上莫队 带修改莫队)

    题目链接 BZOJ 当然哪都能交(都比在BZOJ交好),比如UOJ #58 //67376kb 27280ms //树上莫队+带修改莫队 模板题 #include <cmath> #inc ...

  4. BZOJ 3052: [wc2013]糖果公园 | 树上莫队

    题目: UOJ也能评测 题解 请看代码 #include<cstdio> #include<algorithm> #include<cstring> #includ ...

  5. bzoj 3052: [wc2013]糖果公园【树上带修改莫队】

    参考:http://blog.csdn.net/lych_cys/article/details/50845832 把树变成dfs括号序的形式,注意这个是不包含lca的(除非lca是两点中的一个) 然 ...

  6. 【BZOJ】3052: [wc2013]糖果公园 树分块+带修改莫队算法

    [题目]#58. [WC2013]糖果公园 [题意]给定n个点的树,m种糖果,每个点有糖果ci.给定n个数wi和m个数vi,第i颗糖果第j次品尝的价值是v(i)*w(j).q次询问一条链上每个点价值的 ...

  7. 【BZOJ】3052: [wc2013]糖果公园

    http://www.lydsy.com/JudgeOnline/problem.php?id=3052 题意:n个带颜色的点(m种),q次询问,每次询问x到y的路径上sum{w[次数]*v[颜色]} ...

  8. 洛谷 P4074 [WC2013]糖果公园 解题报告

    P4074 [WC2013]糖果公园 糖果公园 树上待修莫队 注意一个思想,dfn序处理链的方法,必须可以根据类似异或的东西,然后根据lca分两种情况讨论 注意细节 Code: #include &l ...

  9. AC日记——[WC2013]糖果公园 cogs 1817

    [WC2013]糖果公园 思路: 带修改树上莫队(模板): 来,上代码: #include <cmath> #include <cstdio> #include <cst ...

  10. COGS1817. [WC2013]糖果公园

    1817. [WC2013]糖果公园 ★★★☆   输入文件:park.in   输出文件:park.out   简单对比时间限制:8 s   内存限制:512 MB [题目描述] Candyland ...

随机推荐

  1. MySQL中DATE_FORMATE函数内置字符集解析

    今天帮同事处理一个SQL(简化过后的)执行报错: 代码如下 复制代码 mysql> select date_format('2013-11-19','Y-m-d') > timediff( ...

  2. 关于servlet是在什么时候初始化的个人总结

    今天无意中看到一个博主的总结,总结的是servlet是在什么时候初始化的,并且附上了实例.但是由于那位博主的实例有问题,所以总结的也有误.这里我把我的体会写下来,分享给大家. java代码: @Ove ...

  3. 【iOS基础学习随笔-1】-基于对象的程序设计

    一.对象: 1.在基于对象的程序设计中,一个程序分解成若干个不同的对象,每个对象都有自己独有的能力. 2.一个生产线上的一个工位只负责做好一件事.如果生产出的汽车的车门没有漆好,那问题很可能出在负责上 ...

  4. 导航栏 UITabBarController等颜色的区别

    //tint color是设置你选中的那个tabBar的颜色,默认是蓝色,点击是设置的红色    vc.tabBar.tintColor = [UIColor redColor];        // ...

  5. 20150216—winform中的DataGridView

    DataGridView的主要作用是用来按列表来显示信息,其信息的数据源可以是SQL数据库,也可以是一个列表式的集合. DataGridView的位置:工具箱--数据--DataGridView.如下 ...

  6. AMQ学习笔记 - 17. 事务的测试

    概述 对事务机制进行测试. 测试实例 测试实例 结果预测 发送正常 3条消息入队 发送异常 0条消息入队 接收正常 3条消息出队 接收异常 0条消息出队 demo设计 设计图 测试分工 测试类 测试方 ...

  7. MYSQL序言

    我写MYSQL的文章主要的原因:我发现网上关于MYSQL的文章比较少,而且很多都是参差不齐,几乎找不到可以比较全面的介绍:例如一篇文章介绍如何增删改查,却没有介绍批量新增:于是下次工作中用到的时候又要 ...

  8. 16款最佳HTML5超酷动画演示及源码

    1.HTML5/CSS3图片选择动画 可选择多张图片 之前我们已经分享过几款很酷的HTML5图片特效,像HTML5 3D图片折叠特效.HTML5 3D旋转图片相册等应用.今天我们来分享一款既炫酷又实用 ...

  9. SharedSDK微信分享不成功,分享之后没有反应

    对于一般来说,使用SharedSDK的时候,分享不成功不外乎下面几个原因: 1.测试没有打包2.打包的keystore跟微信开放平台上面的不一致, 导致MD5码不一致3.分享参数错误4.应用没有审核通 ...

  10. IOS做一个简单计算器

    //声明非原创 步骤: 1.打开Xcode,单机Creat a new Xcode project 2.左边选择ios下Application,右边选择single view Application ...