首页 > 其他分享 >CF1730F Almost Sorted

CF1730F Almost Sorted

时间:2024-06-07 10:12:51浏览次数:12  
标签:std Almost pos long int 逆序 Sorted CF1730F define

CF1730F Almost Sorted

状压 dp

题目的描述有点奇怪,实际上就是将 \(p\) 在满足要求的情况下重排列,求下标的逆序对最小值。

根据条件,我们猜测前面的数都不会很大,于是考虑从左到右插入值,若当前插入的值为 \(a_i\),那么由限制条件可知,前面放的数都 \(\le a_i+k\),同时 \(\le a_i\) 的部分一定已经放完了(否则放后面不满足条件)。所以在任何时刻,若当前最右端的值为 \(a_i\),那么一定使用了 \([1,a_i]\),可能使用过 \([a_i+1,a_i+k+1]\)。

考虑 dp。\([1,a_i]\) 的部分作为阶段,状压 \([a_i+1,a_i+k+1]\) 的部分,所以设 \(f_{i,s}\) 表示当前已经放完了 \([1,a_i]\),\([a_i+1,a_i+k+1]\) 的使用情况为 \(s\),下标的最小逆序对数。

转移考虑枚举下一个要放的数,并处理出对应增加的逆序对数,\([1,a_i]\) 的部分可以转移的时候预处理,状态 \(s\) 的部分直接暴力枚举累加即可。

复杂度 \(O(n^2+n2^kk^2)\)。

PS:可以用 BIT 将 \(n^2\) 优化成 \(n\log n\)。

#include <bits/stdc++.h>
#define pii std::pair<int, int>
#define fi first
#define se second
#define pb push_back

using i64 = long long;
using ull = unsigned long long;
const i64 iinf = 0x3f3f3f3f, linf = 0x3f3f3f3f3f3f3f3f;
const int N = 5e3 + 10, K = 9;
int n, k, lim;
int pos[N], sum[N];
int f[N][1 << K];
int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    
	std::cin >> n >> k;
	k++;
	for(int i = 1; i <= n; i++) {
		int p;
		std::cin >> p;
		pos[p] = i;
	}
	lim = (1 << k) - 1;
	memset(f, 0x3f, sizeof(f));
	f[0][0] = 0;
	for(int i = 0; i <= n; i++) {
		if(i) {
			for(int j = 1; j < pos[i]; j++) sum[j]++;
		}
		for(int s = 0; s <= lim; s++) {
			if(f[i][s] == iinf) continue;
			for(int j = 1; j <= k && i + j <= n; j++) {
				if(!(s >> (j - 1) & 1)) {
					int p = i, t = s | (1 << (j - 1)), val = sum[pos[i + j]];
					while(t & 1) {
						p++;
						t >>= 1;
					}
					for(int x = 1; x <= k && i + x <= n; x++) if((s >> (x - 1) & 1) && pos[i + x] > pos[i + j]) val++;
					f[p][t] = std::min(f[p][t], f[i][s] + val);  
				}
			}
		}
	}
	std::cout << f[n][0] << "\n";
	return 0;
}

标签:std,Almost,pos,long,int,逆序,Sorted,CF1730F,define
From: https://www.cnblogs.com/FireRaku/p/18236620

相关文章

  • python内置函数——sorted
    对List、Dict进行排序,Python提供了两个方法对给定的ListL进行排序,方法1.用List的成员函数sort进行排序,在本地进行排序,不返回副本方法2.用built-in函数sorted进行排序(从2.4开始),返回副本,原始输入不变--------------------------------sorted----------------------------------......
  • Python3 笔记:sort() 和 sorted() 的区别
    1、sort()可以对列表中的元素进行排序,会改变原列表,之前的顺序不复存在。list.sort(key,reverse=None) key:默认值是None,可指定项目进行排序,此参数可省略。 reverse:默认值是None指做升序排序,“reverse=True”则做降序排序。无论列表中的元素是数值还是字符串都能排序,但......
  • PWN系列-Unsorted Bin Attack
    PWN系列-UnsortedBinAttack概述UnsortedBinAttack,顾名思义,该攻击与Glibc堆管理中的的UnsortedBin的机制紧密相关。UnsortedBinAttack被利用的前提是控制UnsortedBinChunk的bk指针。UnsortedBinAttack可以达到的效果是实现修改任意地址值为一个较大的数值......
  • redis数据结构:RedisObject,SkipList,SortedSet
    1.RedisObject对象redis中任何KV都会被封装为RedisObject对象,也叫做Redis对象 2.SkipList跳表元素按照升序排列存储,是有序的双向链表节点可以有多个指针,并且跨度不同。指针个数根据节点数自动生成,1~32性能和红黑树;二分查找差不多。实现简单,但是空间复杂度高样例:1——2......
  • LeetCode 1287. Element Appearing More Than 25% In Sorted Array
    原题链接在这里:https://leetcode.com/problems/element-appearing-more-than-25-in-sorted-array/description/题目:Givenanintegerarray sorted innon-decreasingorder,thereisexactlyoneintegerinthearraythatoccursmorethan25%ofthetime,returnthat......
  • 【Redis】Redis的操作命令(五)——Redis 有序集合(sorted set)
    有序集合添加元素ZADDrunoobkey1redis有序集合移除元素ZRANGErunoobkey010WITHSCORES有序集合命令命令说明例子ZADDkeyscore1member1[score2member2]向有序集合添加一个或多个成员,或者更新已存在成员的分数 ZCARDkey获取有序集合的成员数 ......
  • Java stream sorted使用 Comparator 进行多字段排序
    摘要:介绍使用JavaStream流排序器Comparator对List集合进行多字段排序的方法,包括复杂实体对象多字段升降序混合排序方法。综述​ Java8的Stream使用了函数式编程模式,人如其名,它可以被用来对集合或数组进行链状流式的排序、过滤和统计等操作,从而让我们更方便的对集合或数组......
  • CF1817A Almost Increasing Subsequence 题解
    题面。2023.5.18修正关于前缀和数组的说法,与代码适配的思路。题意给定长度为\(n\)一个序列\(a\)以及\(q\)次询问,每次询问给出\(l\)和\(r\),要求找出序列\(a\)在\([l,r]\)内最长的几乎递增子序列。对于几乎递增的定义:如果一个序列中不存在连续的三个数\(x\),\(y\)......
  • 布隆过滤器 及 Redis Sorted sets 使用注意事项
    布隆过滤器基本概念布隆过滤器(英语:BloomFilter)是1970年由伯顿·霍华德·布隆(BurtonHowardBloom)提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有......
  • sort和sorted的区别使用
    l=list(map(int,input().split()))b=sorted(l,reverse=False)#reverse=True是降序,False是降序print(b)#sorted()函数是将一个排好序的列表赋给另一变量a.sort(reverse=False)#用法和sorted一样#只不过sort函数直接将列表进行排序不能赋给其他列表在代码里我们可以在注释里......