中午考试困够呛。

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的更多相关文章

  1. 背水一战 Windows 10 (19) - 绑定: TemplateBinding 绑定, 与 RelativeSource 绑定, 与 StaticResource 绑定

    [源码下载] 背水一战 Windows 10 (19) - 绑定: TemplateBinding 绑定, 与 RelativeSource 绑定, 与 StaticResource 绑定 作者:we ...

  2. Scrum会议10.19

    Scrum会议 组名称:好好学习 项目名称:记账本 参会成员:林莉(Master)胡丽娜 宫丽君 汪东涵 时间:2016.10.19 已完成内容: 1.完成新项目的查找,查找学姐的代码和项目. 2.理 ...

  3. IDC Digital Transition Annual Festival(2018.10.19)

    时间:2018.10.19地点:北京万达文化酒店

  4. 2018.10.19浪在ACM 集训队第一次测试赛

    2018.10.19浪在ACM 集训队第一次测试赛 待参考资料: [1]:https://blog.csdn.net/XLno_name/article/details/78559973?utm_so ...

  5. 20172319 2018.10.19《Java程序设计教程》第7周课堂实践(补写博客)

    20172319 2018.10.19 <Java程序设计教程>第7周课堂实践 课程:<程序设计与数据结构> 班级:1723 学生:唐才铭 学号:20172319 指导老师:王 ...

  6. Ubuntu 19.10 发布 | 云原生生态周报 Vol. 24

    作者 | 木苏.进超.冬岛.元毅.心水.衷源 业界要闻 1.云原生编程语言 Pulumi 1.0 pulumi ,一款中立的开源云开发平台,Pulumi 支持多语言.混合云环境.完全可扩展.初期支持 ...

  7. [Linux] 在 Ubuntu 19.10 上开启 SSH 服务并允许远程登录

    在 Ubuntu 19.10 上安装 SSH,并开启服务 0.检查并确认系统当前是否已安装SSH: sudo ps -e | grep ssh 如果只有 ssh-agent 说明 ssh-server ...

  8. [Linux] 树莓派 4B 安装 Ubuntu 19.10 (Eoan Ermine) IOT 版

    硬件:Raspberry Pi 4B系统:Ubuntu 19.10 (Eoan Ermine) for IOT官网:https://ubuntu.com/download/iot/raspberry- ...

  9. Ubuntu 19.10 安装 jupyter

    安装pip3 ubuntu 19.10 已经没有python了,取代的是python3. 执行sudo apt install python3-pip安装pip3 安装jupyter 执行sudo p ...

  10. Ubuntu 19.10将使用GCC 9作为默认编译器

    作为我们这一周期一直期待的变化,Ubuntu 19.10升级到GCC 9作为GCC 8的默认系统编译器. Ubuntu 19.10(和Ubuntu 20.04 LTS)将使用GCC 9 stable作 ...

随机推荐

  1. 树形dp——cf1010D

    一个点的改变如果对根节点的值不会造成任何影响,那么这个点的所有子节点的改变也不会对根节点造成影响 因为每次只改一个叶子节点,也就是一条到根的路径,可以先预处理出初始情况下的每个结点的值 分别讨论根节点 ...

  2. SQLite3与C++的结合应用

    SQLite并没有一次性做到位,只有下载这些东西是不能放在vs2010中并马上使用的,下载下来的文件中有sqlite3.c/h/dll/def,还是不够用的.我们需要的sqlite3.lib文件并不在 ...

  3. hibernate_02_hibernate的入门

    1.什么是Hibernate框架? Hibernate是一种ORM框架,全称为 Object_Relative DateBase-Mapping,在Java对象与关系数据库之间建立某种映射,以实现直接 ...

  4. CentOS7的mysql5.7-rpm.bundle方式安装

    下载地址 https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.19-1.el6.x86_64.rpm-bundle.tar 查询mariad ...

  5. 第一个servlet小程序

    第一个servlet小程序 com.fry.servlet.HelloServlet package com.fry.servlet; import javax.servlet.ServletExce ...

  6. 安装Docker 服务

    curl -fsSL https://get.docker.com/ | sh 执行到这一部分出错: The program 'curl' is currently not installed. Yo ...

  7. Maven父子工程配置文件详解

    项目骨架搭建成功之后. 因为父工程管理子工程.子工程相当于继承于子工程,所以子工程可以调用父工程里面的东西.那么就可以将jar包对应的配置文件书写到父工程的pom.xml文件中,注意:父工程的打包方式 ...

  8. 17.splash_case02

    # 抓取<我不是药神>的豆瓣评论 import csv import time import requests from lxml import etree fw = open('doub ...

  9. java_IO流(输入流)

    * 字节输入流(InputStream):所有字节输入流的父类 * 所有子类共性方法: * int read():从输入流中读取数据的下一个字节 * int read(byte[] b):从输入流中拂 ...

  10. 使用Image作为BackgroundColor 使用

    https://www.hackingwithswift.com/example-code/uicolor/how-to-use-an-image-for-your-background-color- ...