HDU 5273 Dylans loves sequence(线段树求逆序数对+离散化)
来源:互联网 发布:剑桥倚天屠龙史 知乎 编辑:程序博客网 时间:2024/05/23 23:27
题意:
给定一组数,q次查询(每次区间l~r),输出从a[l] 到a[r] 存在多少对逆序数。
解析:
dp[l][r]表示从l~r的逆序数对数。首先算好
dp[1][1..n] ,
然后2~n 枚举,每次计算从i开始的逆序对。dp[i][j] 比dp[i−1][j] 少了a[i−1] 这个数的贡献。
设一个累加器cnt 。计算枚举i~N,若a[i-1]和a[j]构成逆序数,则cnt++,也可以用线段树来求这部分的区间,的逆序对的个数。
最后dp[i][j]=dp[i][j−1]+cnt 。
#include <cstdio>#include <cstring>#include <algorithm>#define ls (o<<1)#define rs (o<<1|1)using namespace std;typedef long long ll;const int N = 10005;struct Node { int val, id;}node[N];int sumv[N<<2];int order[N], n, q;int dp[N][N], cnt[N];bool cmp(Node a, Node b) { return a.val < b.val;}void discrete() { sort(node+1, node+n+1, cmp); order[node[1].id] = 1; for(int i = 2; i <= n; i++) { if(node[i].val != node[i-1].val) { order[node[i].id] = i; }else { order[node[i].id] = order[node[i-1].id]; } }}void pushUp(int o) { sumv[o] = sumv[ls] + sumv[rs];}void build(int o, int L, int R) { if(L == R) { sumv[o] = 0; return ; } int M = (L+R)/2; build(ls, L, M); build(rs, M+1, R); pushUp(o);}int pos;void modify(int o, int L, int R) { if(L == R && L == pos) { sumv[o]++; return ; } int M = (L+R)/2; if(M >= pos) modify(ls, L, M); else modify(rs, M+1, R); pushUp(o);}int ql, qr;int query(int o, int L, int R) { if(ql <= L && R <= qr) { return sumv[o]; } int M = (L+R)/2; int ret = 0; if(ql <= M) ret += query(ls, L, M); if(qr > M) ret += query(rs, M+1, R); return ret;}int main() { //freopen("in.txt", "r", stdin); while(scanf("%d%d", &n, &q) != EOF) { for(int i = 1; i <= n; i++) { scanf("%d", &node[i].val); node[i].id = i; } discrete(); for(int i = 1; i <= n; i++) { build(1, 0, n); for(int j = i; j <= n; j++) { ql = order[j]+1, qr = n; cnt[j] = query(1, 0, n); pos = order[j]; modify(1, 0, n); } for(int j = i; j <= n; j++) { dp[i][j] = dp[i][j-1] + cnt[j]; } } while(q--) { scanf("%d%d", &ql, &qr); printf("%d\n", dp[ql][qr]); } } return 0;}
0 0
- HDU 5273 Dylans loves sequence(线段树求逆序数对+离散化)
- HDU5273.Dylans loves sequence(逆序数对)
- hdu 5273 Dylans loves sequence 逆序数 区间dp
- hdu 5273 Dylans loves sequence
- HDU 5273Dylans loves sequence
- hdu 5273 Dylans loves sequence
- HDU 5273 Dylans loves sequence
- HDU 5273 Dylans loves sequence
- 线段树求逆序数(离散化)POJ 2299
- NYOJ 117 求逆序数(离散化+线段树)
- HDU 5273 Dylans loves sequence(区间DP)
- HDU ACM 5273 Dylans loves sequence->DP
- HDU 5273 Dylans loves sequence 区间DP
- poj2299Ultra-QuickSort【线段树求逆序数】离散化
- 【线段树+离散化】求逆序对数目
- 线段树 --- 单点更新、求逆序对、离散化
- poj 2299 Ultra-QuickSort 线段树求逆序数+离散化||归并排序求逆序数
- hdu 4911 Inversion (多校第5场,求逆序数对,离散化)
- python笔记01
- awk 处理 nginx 日志
- [NOI2014]随机数生成器(模拟+贪心)
- ASP.Net 获取当前时间,包含各种时间格式
- LeetCode OJ 之 Lowest Common Ancestor of a Binary Tree
- HDU 5273 Dylans loves sequence(线段树求逆序数对+离散化)
- 《Spring技术内幕》学习笔记5——IoC容器的依赖注入
- C#减少图片文件大小和尺寸(转)
- IOS日期转为今天昨天形式
- 在unity3d中编写你的第一个着色器
- ViewHolder基类,带声音的SoundToast
- QTabWidget
- IOS-使用blend改变图片颜色
- Spring源码解析 依赖注入