19-10-19-I
中午考试困够呛。
T1
我想打矩阵快速幂,然后我咕了
T2
打T1了所以又咕了。
T3
每一个黑点更新答案只有两种方式:
- 更新子树。
- 更新父链上的兄弟,叔伯,……
于是:
把树拍在$DFS$序上。
更新子树,区间修改。
更新父链,就需要用$DFS$序的拆分,修改两个部分。
#include <iostream>
#include <cstring>
#include <cstdio>
#define N 111111
#define lc(k) (k<<1)
#define rc(k) (k<<1|1)
using namespace std;
struct SR{
int next,t;
}rs[N*2];
int fl[N],cnt=0;
struct XDS{
int l,r;
int dat,lz;
}rt[4*N];
int fir[N],las[N],wi[N];
int dfsxu[2*N];
int dfcnt=0;
int fa[N],pn,qn;
bool is_v[N];
void add(int f,int t){
rs[cnt].t=t;
rs[cnt].next=fl[f];
fl[f]=cnt++;
}
void build(int k,int l,int r){
// cout<<k<<" "<<l<<" "<<r<<endl;
rt[k].l=l,rt[k].r=r;
rt[k].dat=0;
if(l==r)return ;
int mid=(l+r)/2;
build(lc(k),l ,mid);
build(rc(k),mid+1,r );
}
void downlz(int k){
if(rt[k].l!=rt[k].r && rt[k].lz!=0){
int val=rt[k].lz;
rt[lc(k)].lz=max(rt[lc(k)].lz,val);
rt[rc(k)].lz=max(rt[rc(k)].lz,val);
rt[lc(k)].dat=max(rt[lc(k)].dat,val);
rt[rc(k)].dat=max(rt[rc(k)].dat,val);
rt[k].lz=0;
}
}
void change(int k,int l,int r,int v){
if(l>r)return ;
downlz(k);
if(l<=rt[k].l && rt[k].r<=r){
rt[k].lz=v;
rt[k].dat=max(rt[k].dat,v);
return ;
}
int mid=(rt[k].l+rt[k].r)/2;
if(mid>=l)
change(lc(k),l,r,v);
if(mid<r)
change(rc(k),l,r,v);
rt[k].dat=max(rt[lc(k)].dat,rt[rc(k)].dat);
}
int query(int k,int l,int r){
if(l>r)return 0;
int ans=0;
downlz(k);
if(l<=rt[k].l && rt[k].r<=r)
return rt[k].dat;
int mid=(rt[k].l+rt[k].r)/2;
if(mid>=l)
ans=max(ans,query(lc(k),l,r));
if(mid<r)
ans=max(ans,query(rc(k),l,r));
return ans;
}
void dfs(int k,int pre){
dfcnt++;
dfsxu[dfcnt]=k;
fir[k]=dfcnt;
for(int i=fl[k];i!=-1;i=rs[i].next){
int t=rs[i].t;
if(t!=pre){
fa[t]=k;
dfs(t,k);
}
}
dfcnt++;
dfsxu[dfcnt]=k;
las[k]=dfcnt;
}
int main(){
// freopen("lca3.in","r",stdin);\
freopen("1.out","w",stdout);
int a,b;
char st[10];
memset(fl,-1,sizeof fl);
scanf("%d%d",&pn,&qn);
for(int i=1;i<=pn;i++)
scanf("%d",wi+i);
for(int i=1;i<pn;i++){
scanf("%d%d",&a,&b);
add(a,b);
add(b,a);
}
dfs(1,0);
// for(int i=1;i<=pn*2;i++)\
cout<<dfsxu[i]<<" ";\
cout<<endl;
build(1,1,pn*2);
for(int i=1;i<=qn;i++){
scanf("%s%d",st,&a);
if(st[0]=='M'){
change(1,fir[a],las[a],wi[a]);
// cout<<fir[a]<<"="<<las[a]<<endl;
while(fa[a]!=0){
// cout<<"A:"<<a<<" FAA:"<<fa[a]<<" wi:"<<wi[fa[a]]<<endl;
change(1,fir[fa[a]],fir[a]-1,wi[fa[a]]);
// cout<<fir[fa[a]]<<" "<<fir[a]-1<<endl;
change(1,las[a]+1,las[fa[a]],wi[fa[a]]);
// cout<<las[a]+1<<" "<<las[fa[a]]-1<<endl;
if(is_v[a])break;
is_v[a]=1;
a=fa[a];
}
}
else {
int ans=query(1,fir[a],fir[a]);
printf("%d\n",ans==0?-1:ans);
}
}
}
19-10-19-I的更多相关文章
- 背水一战 Windows 10 (19) - 绑定: TemplateBinding 绑定, 与 RelativeSource 绑定, 与 StaticResource 绑定
[源码下载] 背水一战 Windows 10 (19) - 绑定: TemplateBinding 绑定, 与 RelativeSource 绑定, 与 StaticResource 绑定 作者:we ...
- Scrum会议10.19
Scrum会议 组名称:好好学习 项目名称:记账本 参会成员:林莉(Master)胡丽娜 宫丽君 汪东涵 时间:2016.10.19 已完成内容: 1.完成新项目的查找,查找学姐的代码和项目. 2.理 ...
- IDC Digital Transition Annual Festival(2018.10.19)
时间:2018.10.19地点:北京万达文化酒店
- 2018.10.19浪在ACM 集训队第一次测试赛
2018.10.19浪在ACM 集训队第一次测试赛 待参考资料: [1]:https://blog.csdn.net/XLno_name/article/details/78559973?utm_so ...
- 20172319 2018.10.19《Java程序设计教程》第7周课堂实践(补写博客)
20172319 2018.10.19 <Java程序设计教程>第7周课堂实践 课程:<程序设计与数据结构> 班级:1723 学生:唐才铭 学号:20172319 指导老师:王 ...
- Ubuntu 19.10 发布 | 云原生生态周报 Vol. 24
作者 | 木苏.进超.冬岛.元毅.心水.衷源 业界要闻 1.云原生编程语言 Pulumi 1.0 pulumi ,一款中立的开源云开发平台,Pulumi 支持多语言.混合云环境.完全可扩展.初期支持 ...
- [Linux] 在 Ubuntu 19.10 上开启 SSH 服务并允许远程登录
在 Ubuntu 19.10 上安装 SSH,并开启服务 0.检查并确认系统当前是否已安装SSH: sudo ps -e | grep ssh 如果只有 ssh-agent 说明 ssh-server ...
- [Linux] 树莓派 4B 安装 Ubuntu 19.10 (Eoan Ermine) IOT 版
硬件:Raspberry Pi 4B系统:Ubuntu 19.10 (Eoan Ermine) for IOT官网:https://ubuntu.com/download/iot/raspberry- ...
- Ubuntu 19.10 安装 jupyter
安装pip3 ubuntu 19.10 已经没有python了,取代的是python3. 执行sudo apt install python3-pip安装pip3 安装jupyter 执行sudo p ...
- Ubuntu 19.10将使用GCC 9作为默认编译器
作为我们这一周期一直期待的变化,Ubuntu 19.10升级到GCC 9作为GCC 8的默认系统编译器. Ubuntu 19.10(和Ubuntu 20.04 LTS)将使用GCC 9 stable作 ...
随机推荐
- 安装和设置kubectl命令
Linux [root@cx-- ~]# curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.13.5/bin/ ...
- Delphi 查找标题已知的窗口句柄,遍历窗口控件句柄
有了回调函数的概念及上面的例子,我们可以继续了.其实想要找到一个标题已知的窗口句柄,用一个API函数就可以了:FindWindow.其函数原形是:function FindWindow(lpClass ...
- Unable to find explicit activity class报错问题解决方法
转:http://hi.baidu.com/mz_mz/item/f5672ad814e1ce30e2108f69 1.首先查看是否在已经在AndroidMainfest.xml中添加了你的Activ ...
- MongoDB后台运行
文章目录 命令方式(推荐) 命令行和配置文件方式 命令行: 配置文件: 命令方式(推荐) 如果想在后台运行,启动时只需添加 --fork函数即可. fork: 以守护进程的方式运行MongoDB. 指 ...
- idea2017.2普通web工程将lib包导入到artifact中的问题。
这个问题找了解决了好久. 刚开始我以为是c3p0包错误,就把所有jar包都删了. 把依赖里的,library的,artfact->avaliable elements里的都删了. 重新复制粘贴到 ...
- 第十三篇:一点一滴学ibatis(二)映射文件
首先给出一个常见的映射文件局部模板 <?xml version="1.0" encoding="utf-8" ?><!DOCTYPE s ...
- 16.ajax_case08
# 抓取简书博客总阅读量 # https://www.jianshu.com/u/130f76596b02 import requests import json import re from lxm ...
- 17-7-es6作用域
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- js 删除数组中指定值
var arr = ['1','2'];delete('1'); function delete(i){ var index = arr.indexOf(i); arr.splice(index, 1 ...
- JS数组 团里添加新成员(向数组增加一个新元素)只需使用下一个未用的索引,任何时刻可以不断向数组增加新元素。myarray[5]=88;
团里添加新成员(向数组增加一个新元素) 上一节中,我们使用myarray变量存储了5个人的成绩,现在多出一个人的成绩,如何存储呢? 只需使用下一个未用的索引,任何时刻可以不断向数组增加新元素. my ...