http://acm.csu.edu.cn/csuoj/problemset/problem?pid=2151 Input 第一行三个数n,m,v0 表示有n名萌新和m次调整,初始时全部萌新的集训难度都为v0 第2~m+1行 每行三个数或四个数 0 x y v 表示把 [x,y]区间内的萌新的集训难度都增加v 1 x y v 表示把 [x,y]区间内的萌新的集训难度都变为v 2 x y表示询问[x,y]区间内萌新的集训难度之和 0<n,m<=10^5, |v|<=10^5 Output…
小L正在组织acm暑假集训,但众所周知,暑假集训的萌新中有OI神犇,也有暑假才开始学算法的萌新,如果统一集训的难度,无法很好地让萌新们得到训练,所以小L想了一个办法,根据每次测试的情况,改变萌新们的集训难度.现在将萌新们编号为1到n,最初萌新们的集训难度为v0,测试后有两种操作,第一种是某一区间的萌新的集训难度同时提高,另一种是将某一段区间的萌新的集训难度变为同一个数,同时,Wells希望在某次调整难度之后,知道某一段区间的萌新的集训难度之和,由于小L比较鶸,他并不知道如何快速解决这个问题,你能…
Relief grain Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5029 Description The soil is cracking up because of the drought and the rabbit kingdom is facing a serious famine. The RRC(Rabbit Red Cross) organizes…
Count Color Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 53639   Accepted: 16153 Description Chosen Problem Solving and Program design as an optional course, you are required to solve all kinds of problems. Here, we get a new problem.…
题目链接:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1551 题意: 给出一段序列, 删除其中一段连续的子序列(或者不删), 使得剩下的序列的最长上升连续子序列最大. 题解: 1.对于要删除的的子序列而言,要么夹在答案序列中间,要么在外面(删与不删对答案都没影响).所以总体而言,答案序列被分成左右两半. 2.用SL[i]记录从左边起以a[i]为结尾的最长上升连续子序列的长度, SR记录从右边起以a[i]为开始的最长上升连续子序列的长度.…
注意到操作有结合律,容易想到用一个矩形表示第i次操作对第j个位置的数的影响.那么修改是单行内的区间修改,而查询是单列内的区间查询.这样二维线段树上以列为外层行为内层直接打标记就可以维护.然后就喜闻乐见的被卡常了.当年的标算似乎就是树套树,然而都是可持久化AVL树之类难懂的话. #include<bits/stdc++.h> using namespace std; #define ll long long #define N 100010 #define mp(x,y) make_pair((…
题目链接 首先Bi之间的大小关系没用,先对它排序,假设从小到大排 那么每个Ai所能匹配的Bi就是一个B[]的后缀 把一个B[]后缀的匹配看做一条边的覆盖,设Xi为Bi被覆盖的次数 容易想到 对于每个i∈[1,m]都要满足 Xi-i >= 0,即min{Xi-i}>=0 (Hall定理) 用线段树维护即可 感觉不需要霍尔定理也能看出来(因为就是显然吧..) //583ms 4140KiB #include <cstdio> #include <cctype> #inclu…
题目大意:给你$n$个点,第$i$个点有点权$v_i$.你需要将这$n$个点排成一排,第$i$个点的点权能被累加当且仅当这个点前面存在编号在$[l_i,r_i]$中的点,问你这些点应该如何排列,点权和才能最大. 数据范围:$n≤10^5$,$1≤v_i≤10^4$. 这题状压居然给了70分,场上压根没想正解. 我们不难发现,对于点i,我们连接$l_i→i$,$(l_i+1)→i$,....,$r_i→i$的边,然后跑一个tarjan,缩点后我们得到了一棵树. 对于每棵树,我们显然只需要减去这棵树…
UOJ 思路 模拟赛出了这题,结果我没学过二进制分组--一波主席树然后空间就爆炸了-- 用线段树维护时间序列,每个节点维护\(a_i\to x_i\times a_i+b_i,i\in [1,n]\)的信息.由于每次加入一个操作只会加入两个断点,所以维护数列上每个线段的二元组\((a,b)\). 当一个时间块被填满之后就把两边的二元组归并上来,复杂度是\(O(断点个数)\). 由于一个操作只会加2个断点,一个断点只会被往上合并\(O(\log n)\)次,所以复杂度非常正确. 询问的时候在线段树…
题意: \(n\)个草,第\(0\)天种下,高度都为\(0\),每个草每天长高\(a_i\).现给出\(q\)询问,每次给出第\(b_i\)天,然后把高于\(d_i\)的全削成\(d_i\),每次问你此次削下来的高度是多少,\(b_{i-1}<b_i\). 思路: 能看出草的顺序和答案无关,那么按\(a_i\)排序,后面的草永远都比前面的高.然后线段树维护区间加,区间重置,区间询问. 代码: #include<set> #include<map> #include<cm…