BNU 49100超级线段树

超级线段树

Time Limit: 5000ms

Memory Limit: 65536KB

64-bit integer IO format: %lld      Java class name: Main

Prev Submit Status Statistics Discuss Next

Font Size: 
+
 
-

Type:  
None Graph Theory 
    2-SAT     Articulation/Bridge/Biconnected Component
     Cycles/Topological Sorting/Strongly Connected Component
     Shortest Path 
        Bellman Ford         Dijkstra/Floyd Warshall
     Euler Trail/Circuit
     Heavy-Light Decomposition
     Minimum Spanning Tree
     Stable Marriage Problem
     Trees 
    Directed Minimum Spanning Tree 
    Flow/Matching         Graph Matching
             Bipartite Matching
             Hopcroft–Karp Bipartite Matching
             Weighted Bipartite Matching/Hungarian Algorithm
         Flow 
            Max Flow/Min Cut 
            Min Cost Max Flow 
DFS-like     Backtracking with Pruning/Branch and Bound
     Basic Recursion 
    IDA* Search     Parsing/Grammar
     Breadth First Search/Depth First Search
     Advanced Search Techniques
         Binary Search/Bisection
         Ternary Search
 Geometry 
    Basic Geometry     Computational Geometry
     Convex Hull 
    Pick‘s Theorem Game Theory
     Green Hackenbush/Colon Principle/Fusion Principle
     Nim 
    Sprague-Grundy Number 
Matrix     Gaussian Elimination
     Matrix Exponentiation
 Data Structures 
    Basic Data Structures 
    Binary Indexed Tree 
    Binary Search Tree 
    Hashing     Orthogonal Range Search
     Range Minimum Query/Lowest Common Ancestor
     Segment Tree/Interval Tree
     Trie Tree 
    Sorting     Disjoint Set
 String 
    Aho Corasick     Knuth-Morris-Pratt
     Suffix Array/Suffix Tree
 Math 
    Basic Math     Big Integer Arithmetic
     Number Theory 
        Chinese Remainder Theorem 
        Extended Euclid 
        Inclusion/Exclusion 
        Modular Arithmetic 
    Combinatorics         Group Theory/Burnside‘s lemma
         Counting 
    Probability/Expected Value 
Others     Tricky 
    Hardest     Unusual
     Brute Force 
    Implementation     Constructive Algorithms
     Two Pointer 
    Bitmask     Beginner
     Discrete Logarithm/Shank‘s Baby-step Giant-step Algorithm
     Greedy 
    Divide and Conquer 
Dynamic Programming

Tag it!

whalyzh是一个数据结构弱渣,于是他决定恶补一下。众所周知,线段树可以实现对一个[L,R]区间进行一些操作,比如加上一个数或者求最值等等……一天,whalyzh遇到一道题,需要对一个序列进行M次区间操作,由于操作的种类很多,做着做着whalyzh就晕了。现在,他只想知道M次操作后序列中每个数最后一次被执行的操作是什么?

Input

输入数据有多组。

第一行输入一个整数T(T≤10),表示数据组数。

每组数据第一行为两个整数N(N≤10^6)、M(M≤10^6),分别代表序列长度和操作次数。

接下来M行每行三个整数L、R、P(1≤L≤R≤N, 1≤P≤10^6),代表对区间[L,R]执行了操作P。

Output

每组数据输出N行,第i行输出表示序列第i个数最后执行的操作,如果没有执行过操作输出0。

Sample Input

1
3 2
1 2 1
1 1 2

Sample Output

2
1
0

Source

第十三届北京师范大学程序设计竞赛决赛

Author

hwq

#include<stdio.h>
#include<string.h>
const int N = 1000005;
int flag[N*3];
void build(){
   memset(flag,0,sizeof(flag));
}
void pushUp(int k){
    if(flag[k]){
        if(flag[k<<1]==0)
        flag[k<<1]=flag[k];
        if(flag[k<<1|1]==0)
        flag[k<<1|1]=flag[k];
        flag[k]=0;
    }
}
void updata(int l,int r,int k,const int& L, const int& R,const int& op){
    if(flag[k])
        return ;
    if(L<=l&&r<=R){
        flag[k]=op; return ;
    }
    pushUp(k);
    int mid=(l+r)>>1;
    if(L<=mid)
        updata(l,mid,k<<1,L,R,op);
    if(mid<R)
        updata(mid+1,r,k<<1|1,L,R,op);
    if(flag[k<<1]==flag[k<<1|1])
        flag[k]=flag[k<<1];
}
void query(int l,int r,int k){
    if(l==r){
        printf("%d\n",flag[k]); return ;
    }
    pushUp(k);
    int mid=(l+r)>>1;
    query(l,mid,k<<1);
    query(mid+1,r,k<<1|1);
}
struct EDG
{
    int a,b,op;
}edg[N];
int main(){
    int T,n,m,a,b,op;
    scanf("%d",&T);
    while(T--){
        scanf("%d%d",&n,&m);
        build();
        for(int i=1;i<=m;i++){
            scanf("%d%d%d",&edg[i].a,&edg[i].b,&edg[i].op);
        }
        for(int i=m;i>0;i--){
            updata(1,n,1,edg[i].a,edg[i].b,edg[i].op);
        }
        query(1,n,1);
    }
}
时间: 2024-10-14 09:01:35

BNU 49100超级线段树的相关文章

BNU 2418 Ultra-QuickSort (线段树求逆序对)

题目链接:http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=2418 解题报告:就是给你n个数,然后让你求这个数列的逆序对是多少?题目中n的范围是n < 500000,所以,暴力是不行的.还是第一次学会用线段树求逆序数,这种方法的时间复杂度是n * log n,是不是很快呢,利用了线段树查询速度快的优势.具体的方法如下: 这里先说一下,如果输入的n个数不是连续的,也就是说把这n个数按从小到大的顺序排列起来不是连续的话,还要先离散化一下,其实也就是把

吊打线段树的超级树状数组

你是否讨厌线段树那冗长的代码?你是否还在因为线段树的难调试而满头♂dark汗?那么,请不要错过!超级树状数组特价!只要998,只要998! ##¥……#……¥%……&%¥……ER#%$#$#^T%$^$% 超级树状数组,其实是一种能够支持区间修改和区间查询的树状数组,和线段树相比,它的常数极小,不需要太多空间,代码量也少了很多(简直吊打线段树) 1.树状数组 既然是超级树状数组,那么就需要一个树状数组作为基础了.但是在真正实现时,只用到了lowbit()函数(所以说lowbit是树状数组的核心啊

HDU 4417 Super Mario ( 超级马里奥 + 主席树 + 线段树/树状数组离线处理 + 划分树 )

HDU 4417 - Super Mario ( 主席树 + 线段树/树状数组离线处理 + 划分树 ) 这道题有很多种做法,我先学习的是主席树.后面陆续补上线段树离线和划分树 题目大意就是给定一个区间给定一个数列,每次要求你查询区间[L,R]内不超过K的数的数量 主席树做法: 最基本的是静态第k大,这里是求静态的 <= K,差不多,在Query操作里面需要修改修改 先建立size棵主席树,然后询问的时候统计的是 第R棵主席树中[1,K]的数量 - 第L-1棵主席树中[1,K]的数量 注意这里下标

BNU 51636 Squared Permutation 线段树

Squared Permutation 最近,无聊的过河船同学在玩一种奇怪的名为“小Q的恶作剧”的纸牌游戏. 现在过河船同学手有张牌,分别写着,打乱顺序之后排成一行,位置从左往右按照标号. 接下来小Q同学会给出个操作,分为以下两种: 1.给定,交换从左往右数的第和第张牌, 2.给定,对从左往右数的第张牌,记下位置是这张牌上的数字的牌的数字,询问所有记下的数字加起来的结果. 虽然无聊的过河船同学精通四则运算,但是要完成这么大的计算量还是太辛苦了,希望你能帮他处理这些操作. Input 第一行是一个

BNU 28887——A Simple Tree Problem——————【将多子树转化成线段树+区间更新】

A Simple Tree Problem Time Limit: 3000ms Memory Limit: 65536KB This problem will be judged on ZJU. Original ID: 368664-bit integer IO format: %lld      Java class name: Main Prev Submit Status Statistics Discuss Next Type: None None Graph Theory 2-SA

线段树(成段更新) HDU 1698 Just a Hook

题目传送门 1 /* 2 线段树-成段更新:第一题!只要更新区间,输出总长度就行了 3 虽然是超级裸题,但是用自己的风格写出来,还是很开心的:) 4 */ 5 #include <cstdio> 6 #include <algorithm> 7 #include <cmath> 8 #include <cstring> 9 #include <string> 10 #include <iostream> 11 using namesp

bzoj2006 [ NOI2010 ] &amp;&amp; bzoj3784 --点分治+线段树+堆

bzoj2006: 定义一个四元组{x,l,r,w},表示左端点在x,右端点在[l,r]的超级和弦的最大美妙度在将w作为右端点时取到,w可以用前缀和+线段树/ST表求出. 对于每个i,我们将{i,i+L-1,i+R-1,w}放入一个大根堆中,每次取出美妙度最大的一个加到答案中,并将{i,l,w-1,x},{i,w+1,r,x}放入堆中. 这样就相当于将左端点在i.右端点在w的超级和弦去掉.做k次就可以了. 代码: 1 #include<iostream> 2 #include<cstdi

初学线段树(poj3264)

线段树是用来对一堆数据处理的树结构,它的核心思想是二分(一般都用递归实现). 树里需要存的是编号,和区间的左右,还有就是看题目需要了 二叉树特性:1:左子树编号是父树的2倍,右子树是父树的2倍加一 .              2:左子树l是父树的l,左子树的r是父树的(l+r)/2:右子树的l是父树的(l+r)/2 +1,右子树的r是父树的r 如图: 图是偷来的,推荐那个大佬的博客吧:http://www.cnblogs.com/TheRoadToTheGold/p/6254255.html

线段树例题及做题误区

学会了一系列的线段树之后发现 除了扫描线还不是很熟之外一些操作基本上是得心应手了. 但是仍是很菜,在此再次深有感悟 以后做题再看题解 直接剁手 我就不信不看题解自己的思路出现错误 每次都当我 有了正确的思路之时 却被一些 很迷的思路 误导去看题解,看完题解之后才恍然大悟 .这点需要注意!!!我想我都窥出正解了为什么不能再多想想呢? 真的是超级没有成就感 感觉是非常难受的 好题被自己一时看了题解毁了这是我作为一个正在学习的人所极不想看见的. . 这道题还不错 对线段树是一个考察 如果能仔细思考的话