hdu1540 区间操作,合并,模板题】的更多相关文章

During the War of Resistance Against Japan, tunnel warfare was carried out extensively in the vast areas of north China Plain. Generally speaking, villages connected by tunnels lay in a line. Except the two at the ends, every village was directly con…
#include <iostream> #include <stdio.h> #include <string.h> #define lson rt<<1,L,mid #define rson rt<<1|1,mid+1,R using namespace std; ; int n,q; long long num[maxn]; struct Node{ long long sum,add; bool lazy; }tree[maxn<&l…
#include<stdio.h> #include<string.h> #define N 100000 struct st{  int x,y;  __int64 yanchi,sum; }a[N*4]; __int64 b[N]; void build(int t,int x,int y) {  a[t].x=x;  a[t].y=y;  a[t].yanchi=0;  if(x==y) {   a[t].sum=b[x];   return ;  }  int temp=t…
题意:给你一些区间操作,让你输出最后得出的区间. 解法:区间操作的经典题,借鉴了网上的倍增算法,每次将区间乘以2,然后根据区间开闭情况做微调,这样可以有效处理开闭区间问题. 线段树维护两个值: cov 和 rev  ,一个是覆盖标记,0表示此区间被0覆盖,1表示被1覆盖,-1表示未被覆盖, rev为反转标记,rev = 1表示反转,0表示不翻转 所以集合操作可以化为如下区间操作: U l r:   把区间[l,r]覆盖成1I  l r:   把[0,l)(r,MAX]覆盖成0 D l r:  …
题目链接:https://vjudge.net/contest/182746#problem/E 题目大意: 一段线段由n条小线段组成,每次操作把一个区间的小线段变成金银铜之一(金的价值为3,银为2,铜为1),最初可当做全为铜:最后求这条线段的总价值. 解题分析: 此题为线段树区间修改的一道模板题,区间修改的重点就是懒惰标记,即线面代码中的 lazy[]数组,因为我们主要想求的是某一区间的总和,而对该区间内每一个离散点的具体值没有兴趣,所以,当我们进行区间修改的时候,只需要修改该区间所对应节点的…
学习博客:https://blog.csdn.net/noiau/article/details/72514812 看了好久,这里整理一下证明 方程形式:dp(i,j)=min(dp(i,k)+dp(k+1,j))+cost(i,j)  O(n^3) 四边形不等式:将其优化为O(n^2) 1.四边形不等式 a<b<=c<d f(a,c)+f(b,d)<=f(b,c)+f(a,d)交叉小于包含 则对于i<i+1<=j<j+1 f(i,j)+f(i+1,j+1)<…
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 6881  Solved: 4213[Submit][Status][Discuss] Description   您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 Input 第一行为n,m n表示初始序列有n个数,这个序列…
这是线段树的一个模板题,给出一串数字,然后询问区间的最大最小值. 这个其实很好办,只需把线段树的节点给出两个权值,一个是区间的最小值,一个是区间的最大值,初始化为负无穷和正无穷,然后通过不断地输入节点,不断维护,最好每次询问维护一个询问区间的最大值和最小值,最后相减即可.其实就相当于,线段树找区间的最大值和最小值. #include<iostream> #include<stdio.h> #include<algorithm> #include<string.h&…
<题目链接> 题目大意: 现在有n堆石子,第i堆有ai个石子.现在要把这些石子合并成一堆,每次只能合并相邻两个,每次合并的代价是两堆石子的总石子数.求合并所有石子的最小代价. Input 第一行包含一个整数$ T(T<=50)$,表示数据组数.每组数据第一行包含一个整数$ n(2<=n<=100)$,表示石子的堆数.第二行包含n个正整数$ ai(ai<=100)$,表示每堆石子的石子数. Output 每组数据仅一行,表示最小合并代价. Sample Input 2 4…
原题大意:原题链接 给定元素无重复数组,查询给定区间内元素是否连续 解体思路:由于无重复元素,所以如果区间内元素连续,则该区间内的最大值和最小值之差应该等于区间长度(r-l) 解法一:线段树(模板题) #include<cstdio> #include<algorithm> #define inf 0x3f3f3f3f using namespace std; ; int va,curmi,curma; *maxn],ma[*maxn]; void Build(int p,int…