题目链接:https://www.luogu.org/problemnew/show/P1637 BIT + 离散化. 读题得数据规模需离散化.BIT开不到longint这么大的数组. 对于题目所求的三元上升子序列,我们可以通过枚举1~n作为中间数,记录左边比他小的个数L[i],右边比他大的个数R[i],那么对于第i个中间数就有L[i]*R[i]个子序列. L,R可以通过树状数组求得. #include <cstdio> #include <cstring> #include &l…
题目传送门 emmm..不开结构体的线段树真香! 首先我们知道"三元上升子序列"的个数就是对于序列中的每个数,**它左边比他小的数*它右边比他大的数**.但是如何快速求出这两个数? 我们用到权值线段树来维护.一般我们的线段树都是以下标延伸的,但是这里我们用的是权值,一般需要离散化,效果相当于一个桶. 这部分讲解请移步绝世好文 第一次我们从\(1\)~\(n\)循环是为了找它左边的,而找比他小的值是在线段树的\(1\)~\(seq[i]-1\)中找.第二次我们从\(n\)~\(1\)循环…
P1637 三元上升子序列 48通过 225提交 题目提供者该用户不存在 标签云端 难度提高+/省选- 时空限制1s / 128MB 提交  讨论  题解 最新讨论更多讨论 为什么超时啊 a的数据比较大啊,真的能用… 题目描述 Erwin最近对一种叫"thair"的东西巨感兴趣... 在含有n个整数的序列a1,a2......an中, 三个数被称作"thair"当且仅当i<j<k且ai<aj<ak 求一个序列中"thair"…
thair 好,这个naive的东西因为只有三元,很好求解.只要把每个数之前小的L[i]与之后大的R[i]求一下即可. 求两次逆序对即可.那么答案便是∑(L[i]*R[i]); 对于更高元的,胡雨菲写的是要用DP 那么先放水的一批的代码 (就这还洛谷蓝题,我直接给的黄题) #include <cstdio> #include <algorithm> #define lowbit(a) (a&(-a)) using namespace std; ; int x[N],tree…
题目描述 Erwin最近对一种叫"thair"的东西巨感兴趣... 在含有n个整数的序列a1,a2......an中, 三个数被称作"thair"当且仅当i<j<k且ai<aj<ak 求一个序列中"thair"的个数. 输入输出格式 输入格式: 开始一个正整数n, 以后n个数a1~an. 输出格式: "thair"的个数 输入输出样例 输入样例#1: 4 50 18 3 4 6 8 14 15 16 1…
luogu P1126 机器人搬重物 题解 题目描述 机器人移动学会(\(RMI\))现在正尝试用机器人搬运物品.机器人的形状是一个直径\(1.6\)米的球.在试验阶段,机器人被用于在一个储藏室中搬运货物.储藏室是一个\(N×M\)的网格,有些格子为不可移动的障碍.机器人的中心总是在格点上,当然,机器人必须在最短的时间内把物品搬运到指定的地方.机器人接受的指令有:向前移动\(1\)步(\(Creep\)):向前移动\(2\)步(\(Walk\)):向前移动\(3\)步(\(Run\)):向左转(…
对于每个数$a_i$,易得它对答案的贡献为 它左边比它小的数的个数$\times$它右边比它大的数的个数. 可以离散化后再处理也可以使用动态开点的线段树. 我使用了动态开点的线段树,只有需要用到这个节点的时候才新建这个节点,这里我是在进行修改的时候新建的. 时间复杂度$O(n\log \rm MAX\_INT)$,空间复杂度$O(n\log \rm MAX\_INT)$(常数真的很大) 以下是代码,不清楚的地方已标出. #include <bits/stdc++.h> using namesp…
题目大意:给定一个长度为 N 的序列,求有多少个三元组满足 \(i<j<k,a_i<a_j<a_k\). 题解:这是一类二维偏序问题,与逆序对问题类似. 对于序列中每个点来说,用树状数组统计左边有多少个值比他小,右边有多少个值比他大,最后扫一遍数组计算答案贡献即可. 代码如下 #include <bits/stdc++.h> #define fi first #define se second #define pb push_back #define mp make_p…
https://www.lydsy.com/JudgeOnline/problem.php?id=5157 https://www.luogu.org/problemnew/show/P3970 给定一个只包含整数的序列(序列元素的绝对值大小不超过10^9),你需要计算上升子序列的个数,满足如下条件的称之为一个上升子序列: 是原序列的一个子序列 长度至少为2 所有元素都严格递增 如果两个上升子序列相同,那么只需要计算一次.例如:序列{1,2,3,3}有4个上升子序列,分别为{1,2}{1,3},…
题目链接:https://www.luogu.org/problemnew/show/P2491 题外话: OI一共只有三种题--会的题,不会的题,二分题. 题解: step 1 求树的直径,把树的直径上的路径边权都置为0,这样了再求一次其他点最短路. step 2 在树的直径上二分,具体方法是把树的直径长度用类似前缀和的思想处理后,二分左右端点舍去的距离. #include <queue> #include <cstdio> #include <cstring> #i…