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条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰. ...
随机推荐
- ASP.NET4.5从零开始(1)
使用Web窗体 引言 前段时间客户A突然提出,B项目希望可以做成BS形式的,之前是CS的,因为我之前也没学过ASP.NET,于是一边百度,一边Coding,马马虎虎的把功能流程给调通,然后就交差了,想 ...
- ArcEngine拓扑
空间拓扑描述的是自然界地理对象的空间位置关系-相邻,重合,连通等,是地理对象空间属性的一部分.目前ESRI提供的数据存储方式中,Coverage和GeoDatabase能够建立拓扑,Shape格式的数 ...
- 针对不同浏览器,CSS如何写
我们在开发DIV+CSS页面时候常常会遇到开发出的网页的一些地方在各大浏览器比如微软IE6.微软IE7.微软IE8.火狐浏览器.谷歌浏览器有一些不同,如宽度.高度等地方有相差误.IE6比较老的版本浏览 ...
- 黑马程序员——C语言基础 函数
Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)函数的定义 1> 任何一个C语言程序都是由一个或者多个程序段( ...
- DateTimePicker如何与Delphi自带Style同步
Delphi 的 DateTimePicker 组件有一个CalColors属性,可以设置 DropDown 打开的日历节目的风格.但如果不使用 Delphi 自带的 Style,在这里设置属性看不到 ...
- 【转】sql to_char 日期转换字符串
1.转换函数 与date操作关系最大的就是两个转换函数:to_date(),to_char() to_date() 作用将字符类型按一定格式转化为日期类型: 具体用法:to_date('2004-11 ...
- 移动测试主要使用的测试框架,基于python
1.uiautomator google自己的测试框架,可以跨应用测试, 语言支持java,python也可以在GitHub上找到封装的包,去调用uiautomator. 2.Robotium jav ...
- 错误笔记:Caused by: java.lang.StackOverflowError
今天在将一个map转化成json出现堆栈异常,排查原因如下:出现循环递归( rootMap.put("rootMap", rootMap);),栈内存肯定耗光 代码: /** * ...
- 回头再看N层架构(图解)
不知不觉来博客园已经快两半了,时间过的真快. 这次的目标是再回顾一下传统的N层架构并且分析一下在DDD中的N层架构. 一.先来看一看传统的N层架构 N-层架构的出现,主要是由于观注点的分离而产生,这三 ...
- 【Windows】为节省系统资源,停掉不必要的服务
1.windows服务名称(注册表名称)和显示名称对照表如下: < 显示名称 状态 服务名称 Application Management demand AppMgmt ASP.NET Stat ...