随笔分类 - 线段树
摘要:题意:有一群小朋友围成一个环,编号1,2,3…N。每个人手上握着一个非0的数字,首先第K个人出列,然后看他手上的数字,假设为m,则从下一个开始第m个人出列,一直如此。并设i为小于等于N的最大反素数,问第i个出列的人得编号,i的约数个数。(设g(i)为i的约数的个数,若任意j#include #include using namespace std;#define maxn 100005int maxsub[maxn>1; build(l, m, rt>1; if (m >= target) update(target, val, l, m, rt<<1); els
阅读全文
摘要:问题描述:给定一个环形序列,进行在线操作,每次修改一个元素,输出环上的最大连续子列的和,但不能是完全序列。算法:把环从一个地方,切断拉成一条直线,用线段树记录当前区间的非空最大子列和当前区间的非空最小子列。动态规划解决过静态的序列最大连续子序列和问题,时间复杂度可以达到 n(环形序列可能复杂度更高)。但是这里涉及到动态更新,更新频度很大,如果计算子序列和复杂度仍然是n,就会非常耗时。如果环上的数都是正整数,答案是:环上数的总和-根结点的非空最小子列;否则,答案是:max{根结点的非空最大子列, 环上数的总和-根结点的非空最小子列}一开始想到,如果将环从一点断开,那么最大和如果包括断点的最后一个
阅读全文
摘要:题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1698大意:先输入一个t代表有t个案例,然后输入个数n代表一共有n个数,值为他们的编号1~n。然后输入q,代表q各更新,再输入a,b,c,代表把a_b的值全部改为c;然后求出所有的和。View Code 1 #include <stdio.h> 2 #define maxn 100007*4 3 struct node 4 { 5 int sum; 6 int lazy; 7 }tr[maxn]; 8 void pushup(int rt) 9 {10 tr[rt].sum...
阅读全文
摘要:题目连接:http://poj.org/problem?id=3468题目大意:输入N,和Q,代表n个数字和q个操作,然后输入n个数字,然后再输入q个操作,Q代表求询问a,b编号之间的和(包含),C代表把a,b,之间的数都加上c。代码:View Code 1 #include <stdio.h> 2 #include <string.h> 3 #define maxn 100000*4+50 4 struct node 5 { 6 __int64 num; 7 __int64 lazy;//lazy标记 8 }tr[maxn]; 9 __int64 count;10 v
阅读全文
摘要:链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166代码View Code 1 #include <stdio.h> 2 #include <string.h> 3 #define maxn 50000*4+5 4 struct node { 5 int l,r,val; 6 }tr[maxn]; 7 void pushup(int rt) 8 { 9 tr[rt].val = tr[rt*2].val+tr[rt*2+1].val;10 return;11 }12 void build(int l,int r,int r.
阅读全文
摘要:链接:http://acm.hdu.edu.cn/showproblem.php?pid=4217题意:就是让你输入一个N代表有1`n几个数,然后输入Q代表几次询问,每次询问输入一个K ,代表吧第K大的数删除。最后计算删除的数的大小~代码#include <stdio.h>#include <string.h>#define maxn 262145*4+5//一般开到最大的四倍大小就无压力~__int64 count,sub;struct node{ __int64 sum,count;}tr[maxn];void pushup(__int64 rt){ tr[rt].
阅读全文
摘要:作者:Dong|可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明网址:http://dongxicheng.org/structure/segment-tree/1、概述线段树,也叫区间树,是一个完全二叉树,它在各个节点保存一条线段(即“子数组”),因而常用于解决数列维护问题,它基本能保证每个操作的复杂度为O(lgN)。2、线段树基本操作线段树的基本操作主要包括构造线段树,区间查询和区间修改。(1) 线段树构造首先介绍构造线段树的方法:让根节点表示区间[0,N-1],即所有N个数所组成的一个区间,然后,把区间分成两半,分别由左右子树表示。不难证明,这样的线段树的节点数只有2N
阅读全文

浙公网安备 33010602011771号