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

  空间: 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. C# 版本的冒泡排序,包括该死的控制台读取

    期末出成绩了,绩点被数分拉下来太多,虽然我很想不在意,但是还是受不了 学了两天的JAVA了,无爱,还是喜欢C#,喜欢VS 一直学一下控制台读取来着,但是C#控制台读取真的很麻烦 using Syste ...

  2. PHP初步(中)

    一.文件载入 文件载入:将目标文件的代码载入到当前的位置上,有时候也叫流程控制. 文件载入的目的是实现网站的分层设计,因为不同的页面可能有很多相同的区域(相同的代码),这些相同的代码只需要写一次,有需 ...

  3. C++多线程2

    #include "stdafx.h" #include <windows.h> int g_count; ; DWORD __stdcall Func(LPVOID ...

  4. win8设置保护眼睛的颜色

    win8下打开注册表编辑器(win键+R,即运行,输入regedit),依次双击打开HKEY_CURRENT_USER\Control Panel\Colors\,将Window的键值修改为204 2 ...

  5. 搭建java web开发环境、使用eclipse编写第一个java web程序

    开发工具:eclipse-jee-juno-SR2-win32-x86_64(请自行官网下载) 使用服务器:apache-tomcat-7.0.35-windows-x64(请自行官网下载) 打开 e ...

  6. Android锁屏或灭屏状态下,快速按两次音量下键实现抓拍功能(1.2Framework层使用startService形式实现)

        如前一篇博文所分析,我们可以使用广播的形式在快速按下两次音量下键的时候发出广播,以方便客户端进行捕捉.既然有两种方式可以实现该Issue那么哪种方式是首选呢?     我个人推荐使用启动服务的 ...

  7. Unity3D 处理Label的颜色代码

    UILabel m_name = transform.Find("Name").GetComponent<UILabel>(); m_name.text = GetNa ...

  8. 初接触BurpLoader工具

    初接触burp工具 菜鸟一枚,现在在接触一段时间测试,我在测试功能性的时候,想着网站被黑案例那么多,我是不是也应该弄弄安全性测试了,所以就有了下边的第一次接触BurpLoader工具来测试手机的app ...

  9. 实时控制软件设计 第二次作业 myRobot

    #include<iostream> #include <Eigen/Dense> #include <math.h> #include <vector> ...

  10. jQuery.pager无刷新分页

    刚刚学习前端的时候,需要一个无刷新的分页功能,找了一个不错的,大家也有很大分享,在这里写一个自己的部分代码,前后端都有,需要的小伙伴可以参考一下,代码不是完整的. 直接上伪代码<样式代码省略,部 ...