首页 > 其他分享 >QOJ 7943 LIS on Grid

QOJ 7943 LIS on Grid

时间:2023-12-22 11:35:53浏览次数:33  
标签:typedef int mid long Grid LIS 条链 QOJ define

QOJ 传送门

好题。

首先可以视为每一列 \(1\) 的个数 \(\ge a_i\),超出的最后再无视即可。

首先先不考虑构造。考虑二分 \(k\),考虑 Dilworth 定理,即询问是否有 \(k\) 条链覆盖所有的黑格。

可以调整使得第 \(i\) 条链的起点为 \((n - k + i, 1)\),终点为 \((i, m)\)。

那么一条链往上走的次数都为 \(n - k\)。

因为一条链必定至少经过一遍每一列,所以不妨令 \(b_i = \max(0, a_i - k)\)。

那么也就是第 \(i\) 列需要往上走至少 \(b_i\) 次。

一个显然的必要条件是 \(\sum\limits_{i = 1}^m b_i \le k (n - k)\)。后面我们通过构造方案证明这是充要的。

贪心按链从前往后构造。对于第 \(i\) 条链,贪心地使它满足最前面的若干个上升。

容易发现此时若两条链重合就相当于 \(b_i > n - k\),与题目条件矛盾。

所以上述条件是充要的。直接这样构造即可。

时间复杂度 \(O(nm)\)。

code
#include <bits/stdc++.h>
#define pb emplace_back
#define fst first
#define scd second
#define mkp make_pair
#define mems(a, x) memset((a), (x), sizeof(a))

using namespace std;
typedef long long ll;
typedef double db;
typedef unsigned long long ull;
typedef long double ldb;
typedef pair<ll, ll> pii;

const int maxn = 200100;

int n, m, a[maxn], b[maxn];

inline bool check(int x) {
	int s = 0;
	for (int i = 1; i <= m; ++i) {
		s += max(0, a[i] - x);
	}
	return s <= x * (n - x);
}

void solve() {
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= m; ++i) {
		scanf("%d", &a[i]);
		b[i] = a[i];
	}
	int l = 0, r = min(n, m), k = -1;
	while (l <= r) {
		int mid = (l + r) >> 1;
		if (check(mid)) {
			k = mid;
			r = mid - 1;
		} else {
			l = mid + 1;
		}
	}
	printf("%d\n", k);
	vector< vector<int> > ans(n + 2, vector<int>(m + 2, 0));
	for (int i = n - k + 1; i <= n; ++i) {
		int x = i;
		for (int j = 1; j <= m; ++j) {
			ans[x][j] = 1;
			while (x > i - n + k && a[j] > k) {
				--a[j];
				ans[--x][j] = 1;
			}
		}
	}
	for (int i = 1; i <= n; ++i) {
		for (int j = 1; j <= m; ++j) {
			if (b[j] && ans[i][j]) {
				putchar('#');
				--b[j];
			} else {
				putchar('.');
			}
		}
		putchar('\n');
	}
}

int main() {
	int T = 1;
	scanf("%d", &T);
	while (T--) {
		solve();
	}
	return 0;
}

标签:typedef,int,mid,long,Grid,LIS,条链,QOJ,define
From: https://www.cnblogs.com/zltzlt-blog/p/17921246.html

相关文章

  • 【c# winform】devexpress treeList右键菜单添加按钮
    本文提供俩种不需要手动添加编辑控件方法。方法一:创建新的右键菜单添加“执行选择”按钮,且抑制TreeList自带菜单结果展示: 代码: privatevoidForm1_Load(objectsender,EventArgse){CreateBarButtonItem();}privatevoidCreateBarButtonItem(){//创建右键......
  • DevExpress中使用BandGridView实现复合(多行)表头、设置多行表头背景颜色、表格边框颜色
    一、实现效果二、实现方法2.1、创建复合表头①将创建的GridControl下的GirdView1转化为BandGridView类型;②创建需要展示的列(指定列的名称【Name】、描述【caption】、数据字段名称【FieldName】)③绑定列实现复合表头。注意:如果复合表头有多行,则需要设置新增Band的RowCoun......
  • [CF17E] Palisection 题解
    [CF17E]Palisection题解思路直接统计相交的字符串很难数,考虑正难则反。用总共的回文串对数减去相离的回文串个数。设总共有\(tot\)个回文串,用manacher跑出来每个位置的最大回文半径后,使用差分的技巧保存两个数组:\(f_i\)表示以\(i\)为开头的回文串个数,\(g_i\)表示以......
  • Flutter AnimatedList 实现动态列表
    import'dart:async';import'package:flutter/material.dart';finalGlobalKey_globalKey=GlobalKey();classMyAnimatedListextendsStatelessWidget{constMyAnimatedList({super.key});@overrideWidgetbuild(BuildContextcont......
  • Arrays.asList的坑
    2023年12月21日下午16.46分,咪宝马上下班去上海过圣诞节去了,一个人孤单 CTO:谁在项目中使用Arrays.asList、ArrayList.subList,就立马滚蛋! 1.asList用来把数组转成ArrayList,方便。但问题是这个方法生成的ArrayList是Arrays的内部类,这个内部类没有实现抽象类AbstractList的......
  • 带逗号的字符串组装成List集合
    privateList<FileUrlDto>buildFileUrlMethod(StringfileUrl,StringfileName){List<String>files=newArrayList<>();List<String>fileNames=newArrayList<>();List<FileUrlDto>fileUrlDtoList=newArrayList&l......
  • C++ Qt开发:StringListModel字符串列表映射组件
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍QStringListModel字符串映射组件的常用方法及灵活运用。QStringListModel是Qt中用于处理字符......
  • 242-InetAddress.getLocalHost().getHostName() took 20021 milliseconds to respond
    一台windows服务器,要部署jar,启动成功,却无法正常请求。会报错:InetAddress.getLocalHost().getHostName()took20021millisecondstorespond.Pleaseverifyyournetworkconfiguration.经查,该服务器启动了一个其他服务,该服务占用了所有的网络请求带宽,导致网络不通。找到服......
  • WPF ListView GridView表头Header修改外观的方式
    <Window.Resources><DataTemplatex:Key="BlueHeader"><StackPanelOrientation="Horizontal"Margin="-5,-5,-5,-5"Width="120"><StackPanel.Background><LinearGradi......
  • rabbitmq listener注解@RabbitListener里的queues是个数组,你用了吗?
    靠谱的程序员具有注重实效的偏执,对于重复多行的代码,总会想办法消除重复。我们zhongtai-channel里在调用服务商接口发起签约前,使用了mq进行异步处理。即:zhongtai-channel签约RPCAPI接收到上游的请求后,先同步持久化保存签约请求流水,然后将签约数据放入rabbitmq消息队列,等待程序里......