李超树学习记录

还没更完

引子

本文是按照李超老师的线段树ppt学习的学习记录以及一些心得

cf145E

题意

两个操作:
1.翻转\([l,r]\)中的0和1
2.求\([l,r]\)的最长不下降子序列长度

思路

线段树维护00,01,10,11的长度,翻转就是交换(00,11)和(01,10)
答案就是max(00-00,00-01,00-11,01-11,11-11)

代码

Code

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

#define fst first
#define sc second
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a))
#define lson l,mid,root PI;
typedef pair PLL;

const db eps = 1e-6;
const int mod = 1e9+7;
const int maxn = 1e6+100;
const int maxm = 2e6+100;
const int inf = 0x3f3f3f3f;
const db pi = acos(-1.0);

int len00[maxn>1;
    len00[root]=len00[lc]+len00[rc];
    len01[root]=max(len00[lc]+max(len01[rc],len11[rc]),len01[lc]+len11[rc]);
    len10[root]=max(len11[lc]+max(len10[rc],len00[rc]),len10[lc]+len00[rc]);
    len11[root]=len11[lc]+len11[rc];
    return;
}
void build(int l, int r, int root){
    int mid = (l+r)>>1;
    if(l==r){
        if(a[l])len11[root]=1;
        else len00[root]=1;
        return;
    }
    build(lson);build(rson);
    pushup(l,r,root);
    return;
}
void pushdown(int l, int r, int root){
    int mid = (l+r)>>1;
    if(flg[root]){
        flg[lc]^=1;flg[rc]^=1;
        flg[root]^=1;
        swap(len00[lc],len11[lc]);swap(len00[rc],len11[rc]);
        swap(len01[lc],len10[lc]);swap(len01[rc],len10[rc]);
    }
}
void update(int x, int y, int l, int r, int root){
    int mid = (l+r)>>1;
    if(x>1;
    if(l==r)return;
    pushdown(l,r,root);
    gao(lson);gao(rson);
    return;
}
int main() {
    scanf("%d %d", &n, &m);
    for(int i = 1; i 

BZOJ1103

题意

一棵树,初始每条边都是1,两个操作:
1.将某个边改为0
2.问一个点到根的边权和

思路

法一

线段树维护dfs序,操作1为区间修改,操作2为单点查询
这题10s时限,加了快读跑了9s。。

代码

Code

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

#define fst first
#define sc second
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a))
#define lson l,mid,root PI;
typedef pair PLL;

const db eps = 1e-6;
const int mod = 1e9+7;
const int maxn = 3e5+100;
const int maxm = 2e6+100;
const int inf = 0x3f3f3f3f;
const db pi = acos(-1.0);

inline int read(){
    int num;
    char ch;
    while((ch=getchar())‘9‘);
    num=ch-‘0‘;
    while((ch=getchar())>=‘0‘ && chv[maxn];
int n,q;
int S[maxn];
int bg[maxn],ed[maxn];
int tot;
int a[maxn];
void dfs(int x, int fa, int cnt){
    S[++tot]=x;
    bg[x]=tot;
    a[tot]=cnt;
    for(int i = 0; i >1;
    if(l==r){
        sum[root]=a[l];
        return;
    }
    build(lson);build(rson);
    sum[root]=sum[lc]+sum[rc];
    return;
}
void pushdown(int l, int r, int root){
    int mid = (l+r)>>1;
    if(addv[root]!=0){
        addv[lc]+=addv[root];
        addv[rc]+=addv[root];
        sum[lc]+=(mid-l+1)*addv[root];
        sum[rc]+=(r-mid)*addv[root];
        addv[root]=0;
    }
}
void update(int x, int y, int add, int l, int r, int root){
    int mid = (l+r)>>1;
    if(xmid)update(x,y,add,rson);
    sum[root]=sum[lc]+sum[rc];
    return;
}
int ask(int l, int r, int root, int x){
    int mid = (l+r)>>1;
    if(l==r)return sum[root];
    pushdown(l,r,root);
    if(xy)swap(x,y);
            update(bg[y],ed[y],-1,1,n,1);
        }
    }
    return 0;
}

法二

建欧拉序,进入的权值为1,退出的权值为-1
操作1为修改进入和退出的权值为0
操作2为查询前缀和
树状数组即可
跑了5s

代码

Code

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

#define fst first
#define sc second
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a))
#define lson l,mid,root PI;
typedef pair PLL;

const db eps = 1e-6;
const int mod = 1e9+7;
const int maxn = 8e5+100;
const int maxm = 2e6+100;
const int inf = 0x3f3f3f3f;
const db pi = acos(-1.0);

inline int read(){
    int num;
    char ch;
    while((ch=getchar())‘9‘);
    num=ch-‘0‘;
    while((ch=getchar())>=‘0‘ && chv[maxn];
int S[maxn];
int bg[maxn],ed[maxn];
int a[maxn];
void dfs(int x, int fa, int cnt){
    S[++tot]=x;
    bg[x]=tot;
    a[tot]=1;
    for(int i = 0; i y)swap(x,y);
            add(bg[y],-1);add(ed[y],1);
        }
    }
    return 0;
}
Code


原文地址:https://www.cnblogs.com/wrjlinkkkkkk/p/11515350.html

时间: 2024-08-29 23:05:06

李超树学习记录的相关文章

C#学习记录4——结构体,接口

1.结构体 对于C++语言来说,其实结构体和类几乎没有什么太大的区别.类能够实现的功能,使用结构体大部分也可以. 不过,在C#里面,我们把结构体看作是一种轻量的类的替代品.它和类一样有构造方法,属性,成员属性/数据,甚至是操作符.注意struct构造方法必须有传入参数. 当然struct也不是完全支持类的所有功能的. 首先,结构体无法进行继承.也就是说,结构体不想类那样灵活,代码也无法复用. 其次,也是非常重要的一点:结构体是一种值类型,而类是引用类型.这两种类型的区别,可以查看C#学习记录3上

程序员面试笔试宝典学习记录(三)(数据库相关知识)

关系数据库系统与文件数据库系统的区别如下: (a)关系数据库系统的主要特征是数据的结构化,而文件数据库系统是数据的非结构化. (b)关系数据库系统中,用户看到的逻辑结构是二维表,而文件数据库系统中,基本元素是文件. (c)文件数据库系统可以实现多媒体文件管理,支持C/S工作模式. acid,指数据库事务正确执行的四个基本要素的缩写.包含:原子性(atomicity),一致性(consistency),隔离性(isolation),持久性(durability). 数据查询:select sele

算法学习记录-查找——平衡二叉树(AVL)

排序二叉树对于我们寻找无序序列中的元素的效率有了大大的提高.查找的最差情况是树的高度.这里就有问题了,将无序数列转化为 二叉排序树的时候,树的结构是非常依赖无序序列的顺序,这样会出现极端的情况. [如图1]: 这样的一颗二叉排序树就是一颗比较极端的情况.我们在查找时候,效率依赖树的高度,所以不希望这样极端情况出现,而是希望元素比较均匀 的分布在根节点两端. 技术参考:fun4257.com/ 问题提出: 能不能有一种方法,使得我们的二叉排序树不依赖无序序列的顺序,也能使得我们得到的二叉排序树是比

支配树学习日志

支配树 学习日志 给定一张有向图 $G=(V, E)$,其中 $\lvert V \rvert=n, \lvert E \rvert=m$,以及根 $r \in V$. 我们称顶点 $x\ (x \ne r)$ 可达,当且仅当存在一条从 $r$ 到 $x$ 的路径. 对于 $x \ne r$ 且可达的 $x$,如果 $y \ne x$,且删去 $y$ 后 $x$ 不可达,那么就说 $y$ 支配 $x$.特别地,$r$ 一定支配 $x$. 不可达的点的支配点没有定义,因此我们不妨设 $G$ 的所有

Python学习记录-2016-12-17

今日学习记录 模块: import os#导入os模块 import sys#导入sys模块 os.system("df -h")#执行df -h命令 cmd_res = os.popen("df -h").read()#将命令的返回结果赋值给cmd_res,如果不加入.read()会显示命令的返回加过在内存的位置 print(sys.path)#显示系统变量路径,一般个人模块位于site-packages下,系统模块位于lib下 print(sys.argu[2]

Objc基础学习记录5

NSMutableString类继承的NSString类. NSMutableString是动态的字符串. 1.appendingString 方式: 向字符串尾部添加一个字符串. 2.appendingFormat:可以添加多个类型的字符串. int,chat float,double等 3.stringWithString 创建字符串, 4.rangeOfString 返回str1在另一个字符串中的位置. 5.NSMakeRange(0,3) 字符串0位到3位. 6.deleteCharac

Trie树学习2

数组实现的Trie树 字符容量有限,可以使用链表实现更为大容量的Trie #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <vector> #include <map> #include <set> #include <algorithm> #include <cstdlib> #

Windows API 编程学习记录&lt;二&gt;

恩,开始写Windows API编程第二节吧. 上次介绍了几个关于Windows API编程最基本的概念,但是如果只是看这些概念,估计还是对Windows API不是很了解.这节我们就使用Windows API 让大家来了解下Windows API的用法. 第一个介绍的Windows API 当然是最经典的MessageBox,这个API 的作用就是在电脑上显示一个对话框,我们先来看看这个API的定义吧: int WINAPI MessageBox(HWND hWnd, LPCTSTR lpTe

Windows API 编程学习记录&lt;三&gt;

恩,开始写API编程的第三节,其实马上要考试了,但是不把这节写完,心里总感觉不舒服啊.写完赶紧去复习啊       在前两节中,我们介绍了Windows API 编程的一些基本概念和一个最基本API函数 MessageBox的使用,在这节中,我们就来正式编写一个Windows的窗口程序. 在具体编写代码之前,我们必须先要了解一下API 编写窗口程序具体的三个基本步骤:             1. 注册窗口类:             2.创建窗口:             3.显示窗口: 恩,