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条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰. ...
随机推荐
- 存到cookie里能提高性能吗?
今天刚刚看了篇微信,大体意思是说g哥之类的网站把很多存session的东西都放cookie里了,可减少服务器的负担种种.然后我就发现我对request到application的记忆有些模糊了,哪些是在 ...
- Windows 10 RTM 官方正式版
Windows 10 各版本区别: Windows 10 家庭版:供家庭用户使用Windows 10 专业版:供小型企业使用 在家庭版基础上增加了域账号加入.bitlocker.企业商店等功能Wind ...
- Google Authentication 机制原理
Google Authenticator,谷歌身份认证器,Google公司推出的一款动态口令工具,旨在解决大家Google账户遭到恶意攻击的问题.该工具主要基于TOTP(Time-Based One- ...
- php 目录函数和日期函数
continue . break . exit目录函数opendir(); 打开一个文件夹is_file 只判断文件是否存在: file_exists 判断文件是否存在或者是目录是否存在: is_di ...
- ObjC宏定义-预编译小功能
以前看来#号,好像只是预编译,原来它还可以有跟Swift中"\( )"的拼接功能 例如: #define string(x) #x 意思就是 string(x) = "x ...
- utf8转gbk,libcurl中文乱码处理
这两个转码在网页客户端处理用很常见,所使用的平台为VS2010,字符集采用多字节字符集 utf8转gbk string UTF8ToGBK(const std::string& strUTF8 ...
- (spring-第20回【AOP基础篇】)Spring与事务
要想了解Spring的事务,首先要了解数据库事务的基本知识,数据库并发会产生很多问题,Spring使用ThreadLocal技术来处理这些问题,那么我们必须了解Java的ThreadLocal技术.下 ...
- Ubuntu 使用Cisco VPN、AnyConnect、OpenConnect的方法。
自己建的廉价Shadowsocks服务器总是不稳定,众所周知,PPTP在中国大陆已经废了.为了连接外网,所以购买了BlueCloud的VPN.但是他们家的VPN是使用Cisco VPN,可以使用Any ...
- CRYPTO-MD5
这是昨天WHUCTF比赛的一道题目,本属于crypto,其实和crypto没多大关系, 比赛时其实差不多有这种思路了,但不相信自己,就没这样做下去,回来之后,照做了,果然是这样 链接:http://p ...
- mov和ldr/str的区别
ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,也就是ldr/str指令.比如想把数据从内存中某处读取到寄存器中,只能使用ldr比如:ldr r0, 0x12345678就 ...