bzoj 3531 旅行
动态开点线段树+树链剖分 对于每一种宗教信仰都开一颗线段树
空间: QlogN 即每一次修改都只会改变logN 个点
时间 O(QlogN) naive题 边没有开两倍 QAQ
#include <bits/stdc++.h>
using namespace std; inline int read()
{
int x=,f=;
char ch=getchar();
while(ch<''||ch>'')
{
if(ch=='-')f=-;
ch=getchar();
}
while(ch>=''&&ch<='')
{
x=x*+ch-'';
ch=getchar();
}
return x*f;
}
int ee=,st[],fa[],top[],son[],lastadd;
int n,q,belif[],weight[],size[],dep[],cnt,pl[];
struct edge
{
int v,next;
} vs[];
inline void addedge(int u,int v)
{
vs[++ee].v=v;
vs[ee].next=st[u];
st[u]=ee;
}
struct treenode
{
int l,r,mx,sum;
} tree[];
treenode operator+(treenode a,treenode b)
{
treenode tmp;
tmp.sum=a.sum+b.sum;
tmp.mx=max(a.mx,b.mx);
return tmp;
}
void modify(int q,int x,int l,int r,int rt)
{
if(l==r)
{
tree[rt].mx=x;
tree[rt].sum=x;
return ;
}
int mid=(l+r)>>;
if(mid>=q)
{
if(!tree[rt].l) tree[rt].l=++cnt;
modify(q,x,l,mid,tree[rt].l);
}
if(mid<q)
{
if(!tree[rt].r) tree[rt].r=++cnt;
modify(q,x,mid+,r,tree[rt].r);
}
tree[rt].sum=tree[tree[rt].l].sum+tree[tree[rt].r].sum;
tree[rt].mx=max(tree[tree[rt].l].mx,tree[tree[rt].r].mx);
}
treenode query(int L,int R,int l,int r,int rt)
{
if(L<=l&&r<=R) return tree[rt];
int mid=(l+r)>>;
if(mid>=R) return query(L,R,l,mid,tree[rt].l);
if(mid<L) return query(L,R,mid+,r,tree[rt].r);
return query(L,R,l,mid,tree[rt].l)+query(L,R,mid+,r,tree[rt].r);
}
void dfs1(int rt)
{
size[rt]=;
for(int i=st[rt]; i; i=vs[i].next)
{
if(fa[rt]==vs[i].v) continue;
fa[vs[i].v]=rt;
dep[vs[i].v]=dep[rt]+;
dfs1(vs[i].v);
size[rt]+=size[vs[i].v];
if(size[son[rt]]<size[vs[i].v])
son[rt]=vs[i].v;
}
}
void dfs2(int rt)
{
pl[rt]=++lastadd;
if(son[rt])
{
top[son[rt]]=top[rt];
dfs2(son[rt]);
}
for(int i=st[rt]; i; i=vs[i].next)
{
if(vs[i].v==fa[rt]||son[rt]==vs[i].v) continue;
dfs2(vs[i].v);
}
}
void op(int &a,treenode b,int tp)
{
if(tp==) a=max(a,b.mx);
else a+=b.sum;
}
void calans(int x,int y,int tp)
{
int f1=top[x],f2=top[y];
if(dep[f1]>dep[f2])
swap(x,y),swap(f1,f2);
int ans=,rt=belif[x];
while(f1!=f2)
{
treenode tt=query(pl[f2],pl[y],,n,rt);
op(ans,tt,tp);
y=fa[f2];
f2=top[y];
if(dep[f1]>dep[f2]) swap(f1,f2),swap(x,y);
}
if(dep[x]>dep[y]) swap(x,y);
treenode tt=query(pl[x],pl[y],,n,rt);
op(ans,tt,tp);
printf("%d\n",ans);
}
void cgbelif(int x,int y)
{
modify(pl[x],,,n,belif[x]);
belif[x]=y;
modify(pl[x],weight[x],,n,belif[x]);
}
void cgwight(int x,int y)
{
modify(pl[x],weight[x]=y,,n,belif[x]);
}
int main()
{
cnt=;
n=read();
q=read();
for(int i=; i<=n; i++)
top[i]=i;
for(int i=; i<=n; i++)
{
weight[i]=read();
belif[i]=read();
}
for(int i=; i<n; i++)
{
int a=read(),b=read();
addedge(a,b);
addedge(b,a);
}
dfs1();
dfs2();
for(int i=; i<=n; i++)
modify(pl[i],weight[i],,n,belif[i]);
for(int i=; i<=q; i++)
{
char sd[];
scanf("%s",sd);
int x=read(),y=read();
if(sd[]=='Q')
{
if(sd[]=='M') calans(x,y,);
else calans(x,y,);
}
else if(sd[]=='C')
{
if(sd[]=='C') cgbelif(x,y);
else cgwight(x,y);
}
}
return ;
}
蛤鸡附上 dmk
#include <bits/stdc++.h>
#define N 30010
#define Q 30010
#define C 1000
using namespace std; int bf[N+],wt[N+],sign[N+];
vector <int> xx[N+];
char ch[][]= {{'Q','S','\0'},{'Q','S','\0'},{'C','C','\0'},{'C','W','\0'}};
int main()
{
srand(time());
freopen("read.in","w",stdout);
printf("%d %d\n",N,Q);
for(int i=; i<=N; i++)
{
bf[i]=rand()%C+;
xx[bf[i]].push_back(i);
wt[i]=rand()%;
}
for(int i=; i<=N; i++)
printf("%d %d\n",wt[i],bf[i]);
sign[]=;
sign[]=;
printf("%d %d\n",,);
for(int i=; i<N-; i++)
{
int x=rand()%N+,y=rand()%N+;
while(!sign[x]) x=rand()%N+;
while(sign[y]) y=rand()%N+;
printf("%d %d\n",x,y);
sign[y]=;
}
for(int i=; i<=Q; i++)
{
int ty=rand()%;
puts(ch[ty]);
if(ty==||ty==)
{
int x=rand()%N+,y=rand()%C+;
printf("%d %d\n",x,y);
if(ty==)
{
for(int j=; j<=(int)xx[bf[x]].size(); j++)
if(xx[bf[x]][j]==x)
xx[bf[x]].erase(xx[bf[x]].begin()+j);
bf[x]=y;
} }
if(ty==||ty==)
{
int x=rand()%N+;
while(xx[bf[x]].size()==)
x=rand()%N+;
printf("%d %d\n",x,xx[bf[x]][rand()%xx[bf[x]].size()]);
}
}
return ;
}
bzoj 3531 旅行的更多相关文章
- BZOJ.3531.旅行(树链剖分 动态开点)
题目链接 无优化版本(170行): /* 首先树剖可以维护树上的链Sum.Max 可以对每个宗教建一棵线段树,那这题就很好做了 不过10^5需要动态开点 (不明白为什么nlogn不需要回收就可以 不是 ...
- [BZOJ 3531] [Sdoi2014] 旅行 【离线+LCT】
题目链接:BZOJ - 3531 题目分析 题目询问一条路径上的信息时,每次询问有某种特定的文化的点. 每个点的文化就相当于一种颜色,每次询问一条路径上某种颜色的点的信息. 可以使用离线算法, 类似于 ...
- BZOJ 3531(树链剖分+线段树)
Problem 旅行 (BZOJ 3531) 题目大意 给定一颗树,树上的每个点有两个权值(x,y). 要求维护4种操作: 操作1:更改某个点的权值x. 操作2:更改某个点的权值y. 操作3:求a-- ...
- BZOJ 3531: [Sdoi2014]旅行 [树链剖分]
3531: [Sdoi2014]旅行 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1685 Solved: 751[Submit][Status] ...
- bzoj 3531 [Sdoi2014]旅行(树链剖分,线段树)
3531: [Sdoi2014]旅行 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 876 Solved: 446[Submit][Status][ ...
- bzoj 3531 [Sdoi2014]旅行 (树剖+线段树 动态开点)
3531: [Sdoi2014]旅行 Time Limit: 40 Sec Memory Limit: 512 MBSubmit: 2984 Solved: 1312[Submit][Status ...
- BZOJ 3531 [Sdoi2014]旅行 树链剖分+动态开点线段树
题意 S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰. 为了方便,我们用 ...
- [bzoj 3531][SDOI2014]旅行(树链剖分+动态开点线段树)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3531 分析: 对于每个颜色(颜色<=10^5)都建立一颗线段树 什么!那么不是M ...
- bzoj 3531: [Sdoi2014]旅行
Description S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰. ...
随机推荐
- EasyUI ComboGrid的绑定,上下键和回车事件,输入条件查询
首先我们先看一下前台的绑定事件 1.先定义标签 <input id="cmbXm" type="text" style="width: 100p ...
- DB2获取有效工作时长函数(排除节假日、排除午休时间)
CREATE OR REPLACE FUNCTION DIFFHOURTIME_WITHOUTHOLIDAY_FUN ( STARTTIME ), ENDTIME ) ) RETURNS DOUBLE ...
- Graphics2D字符串根据文本框缩小字体自动换行
/** * *描述: 长字符串缩小字体自动换行 *@param g *@param text 字符串 *@param lineWidth 单元格宽度 *@param cellHeight 单元格高度 ...
- Chinese economic influence in North Korea
Where this new investment is being targeted is also interesting雄性禿 . "If you look at the econom ...
- Java 图片压缩
package com.wuyu.util; import java.awt.Graphics2D; import java.awt.Image; import java.awt.image.Buff ...
- WKWebView
按错了...,原帖地址http://blog.csdn.net/cyforce/article/details/37657009 webkit使用WKWebView来代替IOS的UIWebView和O ...
- iOS 短视频开发总结二 AVCaptureSession
开始录制短视频 录制完成 根据项目需求,对视频URL进行处理 基本原理和方法已经完成,具体细节根据项目实际需求再处理
- esxi 6 添加硬盘、网卡
添加硬盘 esxi系统装完之后,直接再接上一块硬盘,然后再使用管理工具添加硬盘 打开VMware vSphere Client,登录esxi服务器, 打开配置-存储器-选择添加存储器 选择磁盘 这里能 ...
- python27(32位)安装RTree
一开始用pip install -r requirements.txt 报错:OSError: could not find or load spatialindex_c.dll 1)从以下链接下载编 ...
- CSS的重要性
自己很喜欢查看设计出彩的网页,在CSS Zen Garden选择了一个颜色搭配亮眼.结构错落的网页,照着原页面自己写了一个出来.之前做页面的时候总是会把原页面和自己做的放到PS里一个像素一个像素对比查 ...