3531: [Sdoi2014]旅行
Time Limit: 20 Sec Memory Limit: 512 MB
Submit: 942 Solved: 467
Description
S国有N个城市,编号从1到N。城市间用N-1条双向道路连接,满足
从一个城市出发可以到达其它所有城市。每个城市信仰不同的宗教,如飞天面条神教、隐形独角兽教、绝地教都是常见的信仰。为了方便,我们用不同的正整数代表各种宗教, S国的居民常常旅行。旅行时他们总会走最短路,并且为了避免麻烦,只在信仰和他们相同的城市留宿。当然旅程的终点也是信仰与他相同的城市。S国政府为每个城市标定了不同的旅行评级,旅行者们常会记下途中(包括起点和终点)留宿过的城市的评级总和或最大值。
在S国的历史上常会发生以下几种事件:
”CC x c”:城市x的居民全体改信了c教;
”CW x w”:城市x的评级调整为w;
”QS x y”:一位旅行者从城市x出发,到城市y,并记下了途中留宿过的城市的评级总和;
”QM x y”:一位旅行者从城市x出发,到城市y,并记下了途中留宿过
的城市的评级最大值。
由于年代久远,旅行者记下的数字已经遗失了,但记录开始之前每座城市的信仰与评级,还有事件记录本身是完好的。请根据这些信息,还原旅行者记下的数字。 为了方便,我们认为事件之间的间隔足够长,以致在任意一次旅行中,所有城市的评级和信仰保持不变。
Input
输入的第一行包含整数N,Q依次表示城市数和事件数。
接下来N行,第i+l行两个整数Wi,Ci依次表示记录开始之前,城市i的评级和信仰。
接下来N-1行每行两个整数x,y表示一条双向道路。
接下来Q行,每行一个操作,格式如上所述。
Output
对每个QS和QM事件,输出一行,表示旅行者记下的数字。
Sample Input
5 6
3 1
2 3
1 2
3 3
5 1
1 2
1 3
3 4
3 5
QS 1 5
CC 3 1
QS 1 5
CW 3 3
QS 1 5
QM 2 4
Sample Output
8
9
11
3
HINT
N,Q < =10^5,C < =10^5
数据保证对所有QS和QM事件,起点和终点城市的信仰相同;在任意时刻,城市的评级总是不大于10^4的正整数,且宗教值不大C。
Source
Round 1 Day 1
代码地址:
http://paste.ubuntu.com/15320492/
建树方式很神奇,%了一下黄学长的姿势。。
由于查询的东西十分鬼畜,所以对于每个宗教我们建一棵线段树。。
于是就有了sum,mx,ls,rs四个数组。。
因为我们每次要新增logn个点。。
又要进行n+m次操作。。
所以数组大小应该开nlogn的。。
算是省内存的一种方法。。
附上本蒟蒻的代码:

#include<cstdio>
#include<iostream>
using namespace std;
#define MAXN 10000001
int tot,root[100001],n,m,cnt,sz,b[100001],a[100001],father[100001][17],h[100001],deep[100001],size[100001],pos[100001],belong[100001];
bool vis[100001];
int sum[MAXN],ls[MAXN],rs[MAXN],mx[MAXN];
struct data
{int to,next;
};
data edge[200001];int read()
{int w=0,c=1;char ch=getchar();while (ch<'0' || ch>'9'){if (ch=='-')c=-1;ch=getchar();}while (ch>='0' && ch<='9'){w=w*10+ch-'0';ch=getchar();}return w*c;
}void add(int u,int v)
{cnt++,edge[cnt].next=h[u],h[u]=cnt,edge[cnt].to=v;cnt++,edge[cnt].next=h[v],h[v]=cnt,edge[cnt].to=u;
}void dfs1(int x)
{int i;size[x]=1;vis[x]=true;for (i=1;i<=16;i++){if (deep[x]<(1<<i))break;father[x][i]=father[father[x][i-1]][i-1];}for (i=h[x];i;i=edge[i].next){if (vis[edge[i].to])continue;deep[edge[i].to]=deep[x]+1;father[edge[i].to][0]=x;dfs1(edge[i].to);size[x]+=size[edge[i].to];}
}void dfs2(int x,int chain)
{int k=0,i;sz++;pos[x]=sz;belong[x]=chain;for (i=h[x];i;i=edge[i].next)if (deep[edge[i].to]>deep[x] && size[edge[i].to]>size[k])k=edge[i].to;if (k==0)return;dfs2(k,chain);for (i=h[x];i;i=edge[i].next)if (deep[edge[i].to]>deep[x] && k!=edge[i].to)dfs2(edge[i].to,edge[i].to);
}void update(int s)
{sum[s]=sum[ls[s]]+sum[rs[s]];mx[s]=max(mx[ls[s]],mx[rs[s]]);
}void build(int &s,int l,int r,int x,int y)
{int mid=(l+r)/2;if (!s)tot++,s=tot;if (l==r){mx[s]=sum[s]=y;return;}if (x<=mid)build(ls[s],l,mid,x,y);elsebuild(rs[s],mid+1,r,x,y);update(s);
}int querysum(int s,int l,int r,int x,int y)
{int mid=(l+r)/2;if (!s)return 0;if (l==x && y==r)return sum[s];if (y<=mid)return querysum(ls[s],l,mid,x,y);elseif (x>mid)return querysum(rs[s],mid+1,r,x,y);elsereturn querysum(ls[s],l,mid,x,mid)+querysum(rs[s],mid+1,r,mid+1,y);
}int querymax(int s,int l,int r,int x,int y)
{int mid=(l+r)/2;if (!s)return 0;if (l==x && y==r)return mx[s];if (y<=mid)return querymax(ls[s],l,mid,x,y);elseif (x>mid)return querymax(rs[s],mid+1,r,x,y);elsereturn max(querymax(ls[s],l,mid,x,mid),querymax(rs[s],mid+1,r,mid+1,y));
}int solvesum(int c,int x,int f)
{int ans=0;while (belong[x]!=belong[f]){ans+=querysum(root[c],1,n,pos[belong[x]],pos[x]);x=father[belong[x]][0];}ans+=querysum(root[c],1,n,pos[f],pos[x]);return ans;
}int solvemax(int c,int x,int f)
{int ans=0;while (belong[x]!=belong[f]){ans=max(ans,querymax(root[c],1,n,pos[belong[x]],pos[x]));x=father[belong[x]][0];}ans=max(ans,querymax(root[c],1,n,pos[f],pos[x]));return ans;
}int lca(int x,int y)
{int i,t;if (deep[x]<deep[y])swap(x,y);t=deep[x]-deep[y];for (i=16;i>=0;i--)if (t&(1<<i))x=father[x][i];for (i=16;i>=0;i--)if (father[x][i]!=father[y][i]){x=father[x][i];y=father[y][i];}if (x==y)return x;elsereturn father[x][0];
}int main()
{int i,u,v,x,y,t,ans;char s[10];n=read(),m=read();for (i=1;i<=n;i++)a[i]=read(),b[i]=read();for (i=1;i<=n-1;i++)u=read(),v=read(),add(u,v);dfs1(1);dfs2(1,1);for (i=1;i<=n;i++)build(root[b[i]],1,n,pos[i],a[i]);for (i=1;i<=m;i++){scanf("%s",&s);x=read(),y=read();if (s[0]=='C'){if (s[1]=='C'){build(root[b[x]],1,n,pos[x],0);b[x]=y;build(root[b[x]],1,n,pos[x],a[x]);}if (s[1]=='W'){build(root[b[x]],1,n,pos[x],y);a[x]=y;}}if (s[0]=='Q'){t=lca(x,y);if (s[1]=='S'){ans=solvesum(b[x],x,t)+solvesum(b[x],y,t);if (b[x]==b[t])ans-=a[t];printf("%d\n",ans);}if (s[1]=='M')printf("%d\n",max(solvemax(b[x],x,t),solvemax(b[x],y,t)));}}return 0;
}

BZOJ3531旅行相关推荐

  1. Noip前的大抱佛脚----赛前任务

    赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...

  2. [bzoj3531][Sdoi2014]旅行

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

  3. 【BZOJ3531】旅行,树链剖分+开点线段树

    传送门 写在前面:为自己和并肩作战的两个队友默哀 思路:感觉做的链剖题越来越厉害了,这道题让我接触到了线段树的一种新姿势--原来写线段树,对于某个节点i,左右儿子是直接当成i∗2i*2和i∗2+1i* ...

  4. 【Bzoj3531】旅行

    题意:有n个城市,每个城市有权值和颜色,支持的操作有单点修改权值,单点修改颜色,查询区间同颜色之和,查询区间同颜色最大值. 思路:对于每种颜色,放入不同的线段树,但其实整个加起来还是还是n个结点,值得 ...

  5. 2022-2028年中国在线旅行预订市场投资分析及前景预测报告

    [报告类型]产业研究 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了在线旅行行业相关概述.中国在线旅行行业运行环境.分析了中国在线旅行行 ...

  6. LeetCode简单题之旅行终点站

    题目 给你一份旅游线路图,该线路图中的旅行线路用数组 paths 表示,其中 paths[i] = [cityAi, cityBi] 表示该线路将会从 cityAi 直接前往 cityBi .请你找出 ...

  7. usaco Cow Tours 牛的旅行

    Cow Tours 牛的旅行 农民 John 的农场里有很多牧区.有的路径连接一些特定的牧区.一片所有连通的牧区称为一个牧场. 但是就目前而言,你能看到至少有两个牧区不连通.这样,农民 John 就有 ...

  8. gatsby_如何使用Gatsby和Leaflet创建夏季公路旅行地图绘制应用程序

    gatsby Get ready for the summer by building your own road trip mapping app with this step-by-step gu ...

  9. 汉印标签打印机app_旅行一族福音 汉印CP4000L便携照片打印机体验

    最近一段时间,有个问题经常在我脑海中出现:"我们为什么需要打印照片?" 不过没想到,让我瞬间解除这个疑惑的,却是近期刚刚上市的一款便携照片打印机-汉印CP4000L.自从知晓这款产 ...

最新文章

  1. 500线电机光电码盘
  2. hibernate基本映射文件
  3. iOS 设置Label中特定的文字大小和颜色
  4. hadoop搭建_hadoop分布式搭建之虚拟机克隆
  5. 为什么C4C UI上看不到新建按钮
  6. Firefox下去掉密码自动填充
  7. 敏捷个人A1组第二次讨论纪要 你在事业上打算何去何从?
  8. PHP版本VC6与VC9、Thread Safe与None-Thread Safe等的区别
  9. 「PMP答题卡」真实模拟PMP考试
  10. 微信模板消息html,微信推送模板消息,偶发出现报错errcode
  11. 《零秒工作》的一些总结
  12. MYSQL的随机函数
  13. 线性回归--特征缩放
  14. 面部刮痧:别样的美丽疗法
  15. 1024程序员节:最能讨好程序员的12件礼物
  16. c语言课程设计目的及要求,C语言课程设计目及要求.doc
  17. 在贷款行业中,运营商大数据精准获客,是否真实有效呢
  18. 序列化解决方案,就是采用二进制通信协议(数据报文格式)
  19. HTML中的 a标签
  20. Python实战技巧系列

热门文章

  1. Vue3引入彩色阿里巴巴Iconfont图标
  2. python处理Excel实现自动化办公教学(含实战)【一】
  3. Kubernetes笔记(5) - Pod控制器
  4. 阿里云ecs Windows条带化方法及优缺点
  5. Eclipse卸载android开发环境(ADT)
  6. CRect类用法介绍
  7. HTML的电子邮件链接标签mailto用法详解
  8. 路由器WAN口和LAN口的区别
  9. FastDDS的xml配置文件配置项,查询用
  10. 这可能是简易的机器学习入门(小白必读)