#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #define lson rt<<1,L,mid #define rson rt<<1|1,mid+1,R /* 题意:给出原始序列a[1],a[2],...a[n] 给出m个操作方式 l r d,把a[l],...a[r]都加上d 然后给出k个操作 x y 执行第x到第y个操…
题意:一共有n名员工, n-1条关系, 每次给一个人分配任务的时候,(如果他有)给他的所有下属也分配这个任务, 下属的下属也算自己的下属, 每次查询的时候都输出这个人最新的任务(如果他有), 没有就输出-1. 题解:需要用DFS建树来确立关系, 然后用线段树进行区间覆盖. DFS建树: 从Boss 开始dfs,通过dfs递归时编号出现的先后顺序来确定某个员工对应的起点与终点. 样例的关系图是这样的 当dfs建树跑完了之后各个节点对应的位置是这样的 其中Start表示这个节点本身的新编号和这个节点…
HUD.2795 Billboard ( 线段树 区间最值 单点更新 单点查询 建树技巧) 题意分析 题目大意:一个h*w的公告牌,要在其上贴公告. 输入的是1*wi的w值,这些是公告的尺寸. 贴公告要满足的条件: 1. 尽量往上,同一高度尽量靠左. 2. 求第n个广告所在的行数. 3. 没有合适的位置贴了则输出-1. 建树技巧 首先看了一下数据范围h和w都在1e9,按照高度建树不太现实的.但是发现询问只有2e5,.仔细想一下如果h < 2e5, 我们用h建树,否则用n建树.原因是,每个高度只放…
线段树的区间更新与区间求和...一颗这样的线段树用两次... 先扫描1~k...用线段树统计出每个操作执行的次数... 那么每个操作就变成了 op. l  , op.r , op.c= times* op.c 清空线段树..将初始的a1,a2~~an放入..用每个操作来更新值~~ Program: #include<iostream> #include<stdio.h> #include<string.h> #include<set> #include &l…
传送门 A. Greg and Array time limit per test 1.5 seconds memory limit per test 256 megabytes input standard input output standard output Greg has an array a = a1, a2, ..., an and m operations. Each operation looks as: li, ri, di, (1 ≤ li ≤ ri ≤ n). To a…
Description You are given circular array a0, a1, ..., an - 1. There are two types of operations with it: inc(lf, rg, v) - this operation increases each element on the segment [lf, rg] (inclusively) by v; rmq(lf, rg) - this operation returns minimal v…
题目链接 Interesting Array 区间更新.然后对于每一个约数重新求一遍区间的&值,不符合就跳出. #include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i) #define lson i << 1, L, mid #define rson i << 1 | 1, mid + 1, R ; struct node…
题目链接:http://codeforces.com/problemset/problem/295/A 我的做法,两次线段树 #include <cstdio> #include <cstring> const int N = 100005; long long sumv[N * 3]; long long add[N * 3]; long long a[N]; struct opera { int l, r; long long d; } op[N]; void pushdown…
题意: 有数列a[ ]; 操作op[ ] = { l, r, d }; 询问q[ ] = { x, y }; 操作表示对a的[ l, r ] 区间上每个数增加d; 询问表示执行[ x, y ]之间的op. 打印最终数列. 思路: 用两次差分数列, 先处理出对于每个op调用了几次, 再对数列执行操作. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const i…
题目:codeforces 482B. Interesting Array 题意:给你一个值n和m中操作,每种操作就是三个数 l ,r,val. 就是区间l---r上的与的值为val,最后问你原来的数组是多少?假设不存在输出no 分析:分析发现要满足全部的区间,而一个点上假如有多个区间的话,这个点的值就是全部区间或的值.由于仅仅有这样才干满足全部区间的.把全部位上的1都保存下来了.那么能够发现用线段树来维护,可是那么怎么推断满不满足条件呢?能够也用线段树,更新了之后在整个维护一遍看看满不满足题意…