动态开点线段树+树链剖分  对于每一种宗教信仰都开一颗线段树

  空间: QlogN 即每一次修改都只会改变logN 个点

  时间 O(QlogN)  naive题  边没有开两倍  QAQ

bzoj 3531
 #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

dmk_GG  好像有点问题QWQ
 #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 旅行的更多相关文章

  1. BZOJ.3531.旅行(树链剖分 动态开点)

    题目链接 无优化版本(170行): /* 首先树剖可以维护树上的链Sum.Max 可以对每个宗教建一棵线段树,那这题就很好做了 不过10^5需要动态开点 (不明白为什么nlogn不需要回收就可以 不是 ...

  2. [BZOJ 3531] [Sdoi2014] 旅行 【离线+LCT】

    题目链接:BZOJ - 3531 题目分析 题目询问一条路径上的信息时,每次询问有某种特定的文化的点. 每个点的文化就相当于一种颜色,每次询问一条路径上某种颜色的点的信息. 可以使用离线算法, 类似于 ...

  3. BZOJ 3531(树链剖分+线段树)

    Problem 旅行 (BZOJ 3531) 题目大意 给定一颗树,树上的每个点有两个权值(x,y). 要求维护4种操作: 操作1:更改某个点的权值x. 操作2:更改某个点的权值y. 操作3:求a-- ...

  4. BZOJ 3531: [Sdoi2014]旅行 [树链剖分]

    3531: [Sdoi2014]旅行 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1685  Solved: 751[Submit][Status] ...

  5. bzoj 3531 [Sdoi2014]旅行(树链剖分,线段树)

    3531: [Sdoi2014]旅行 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 876  Solved: 446[Submit][Status][ ...

  6. bzoj 3531 [Sdoi2014]旅行 (树剖+线段树 动态开点)

    3531: [Sdoi2014]旅行 Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 2984  Solved: 1312[Submit][Status ...

  7. BZOJ 3531 [Sdoi2014]旅行 树链剖分+动态开点线段树

    题意 S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰. 为了方便,我们用 ...

  8. [bzoj 3531][SDOI2014]旅行(树链剖分+动态开点线段树)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3531 分析: 对于每个颜色(颜色<=10^5)都建立一颗线段树 什么!那么不是M ...

  9. bzoj 3531: [Sdoi2014]旅行

    Description S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰. ...

随机推荐

  1. sql返回两个日期之间的日期_函数实现

    -- Description:返回两段日期之间的所有日期    <Description,,>-- ============================================ ...

  2. SpellTime

    如果你的应用程序允许用户输入文本,或者它结合了任何基于文本的处理,那么我们有一款你一直寻找的产品.Spell Time 允许你把个拼写检查器整合到你的产品中.该产品携带了完整的源码.Spell Tim ...

  3. readelf与动态库

    使用arm-linux-gcc编译的可执行文件可能会无法在开发板上执行,并提示:-/bin/sh xxx not found 解决办法: 在主机上使用readelf -d xxx 来查看该程序所需要的 ...

  4. jQuery原生框架-----------------dom操作

    // 扩展DOM操作方法jQuery.fn.extend({ // 设置或者获取元素的内容 html: function( html ) { /* * 实现思路: * 1.不传参,返回第一个元素的内容 ...

  5. SparkMLlib之 logistic regression源码分析

    最近在研究机器学习,使用的工具是spark,本文是针对spar最新的源码Spark1.6.0的MLlib中的logistic regression, linear regression进行源码分析,其 ...

  6. android densityDpi 的由来

    ---恢复内容开始--- 今天做屏幕适配的时候,发现一个奇怪的现象: HTC D820u/ 红米Note/HONOR H30-L02 /Coolpad 8297-T01 4款手机的分辨率均为 1280 ...

  7. 预装win8的系统换win7需要做的bios设置

    https://zhidao.baidu.com/question/873669708066476212.html (一)联想G50-70由于预装的是WIN8位系统,哪么改装WIN7 64位的方法如下 ...

  8. Struts2版本升级到struts2 2.3.15.1操作说明

    Struts2的官网公布了一个远程命令执行漏洞,官方强烈建议升级到2.3.15.1或者以上版本,该版本包含校正过的struts2核心库. 我们之前开发项目主要采用的Struts2版本是2.2.1,本文 ...

  9. C# Winform中无焦点状态下获取键盘输入或者USB扫描枪数据

    类文件: C#类文件 using System; using System.Collections.Generic; using System.Text; using System.Runtime.I ...

  10. 开源一个silverlight上的文本编辑器:SlEditor

    控件设置三个状态:编辑.设计.查看. 控件的内容可以打包保存为zip格式,内容可以包含图片等元素(解决了silverlight RichTextBox控件xaml属性无法获取InlineUIConta ...