首页 > 其他分享 > [ARC127E] Priority Queue

[ARC127E] Priority Queue

时间:2022-11-07 12:11:28浏览次数:40  
标签:Queue ch int top ARC127E Priority template inline void

有一种显然的想法:我们要考虑对每段操作中保留下来的数。但是这并不好做。
正难则反:我们只需要关注删除掉的数。
那么我们就需要得知删除每个数时的限制,这等价于求每个删除操作之前保留了多少数
具体地,记 \(f_{i,j}\) 表示删除第 \(i\) 个数,前 \(i\) 个数共删除了 \(j\) 个的方案数。那么我们能在第 \(j\) 次删除 \(i\) 的条件就是第 \(j\) 次删除操作前保留了最多 \(i - j\) 个数。只要满足限制即可转移。

#include<bits/stdc++.h>
#define RG register
#define LL long long
#define U(x, y, z) for(RG int x = y; x <= z; ++x)
#define D(x, y, z) for(RG int x = y; x >= z; --x)
#define update(x, y) (x = x + y >= mod ? x + y - mod : x + y)
using namespace std;
void read(){}
template<typename _Tp, typename... _Tps>
void read(_Tp &x, _Tps &...Ar) {
	x = 0; char ch = getchar(); bool flg = 0;
	for (; !isdigit(ch); ch = getchar()) flg |= (ch == '-');
	for (; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + (ch ^ 48);
	if (flg) x = -x;
	read(Ar...);	
}
inline char Getchar(){ char ch; for (ch = getchar(); !isalpha(ch); ch = getchar()); return ch;}
template <typename T> inline void write(T n){ char ch[60]; bool f = 1; int cnt = 0; if (n < 0) f = 0, n = -n; do{ch[++cnt] = char(n % 10 + 48); n /= 10; }while(n); if (f == 0) putchar('-'); for (; cnt; cnt--) putchar(ch[cnt]);}
template <typename T> inline void writeln(T n){write(n); putchar('\n');}
template <typename T> inline void writesp(T n){write(n); putchar(' ');}
template <typename T> inline void chkmin(T &x, T y){x = x < y ? x : y;}
template <typename T> inline void chkmax(T &x, T y){x = x > y ? x : y;}
template <typename T> inline T Min(T x, T y){return x < y ? x : y;}
template <typename T> inline T Max(T x, T y){return x > y ? x : y;}
inline void readstr(string &s) { s = ""; static char c = getchar(); while (isspace(c)) c = getchar(); while (!isspace(c)) s = s + c, c = getchar();}
inline void FO(string s){freopen((s + ".in").c_str(), "r", stdin); freopen((s + ".out").c_str(), "w", stdout);}

const int N = 5e3 + 10, mod = 998244353;
int n, m, u[N], v[N], top, a[N], f[N][N], s[N][N];

int main(){
	//FO("");
	read(n, m);
	U(i, 1, n + m) {
		int x;
		read(x);
		if (x == 1) u[++top] = 1, v[top] = 0;
		else {
			v[top]++;
			while (u[top] < v[top]) 
				u[top - 1] += u[top], v[top - 1] += v[top], --top;
		}
	}

	m = 0;
	int sz = 0;
	U(i, 1, top) {
		sz += u[i] - v[i];
		U(j, 1, v[i])
			a[++m] = sz;
	}

	f[0][0] = s[0][0] = 1;
	U(i, 1, n) { 
		U(j, 1, i) {
			if (a[j] <= i - j) f[i][j] = s[i - 1][j - 1];
			(s[i][j] = s[i - 1][j] + f[i][j]) %= mod;

		}
		s[i][0] = 1;
	}
	int ans = 0;
	U(i, 0, n) update(ans, f[i][m]);
	writeln(ans);
	return 0;
}

标签:Queue,ch,int,top,ARC127E,Priority,template,inline,void
From: https://www.cnblogs.com/SouthernWay/p/16865502.html

相关文章

  • 232. Implement Queue using Stacks
    push:直接插入辅助栈pop/peak:1.如果数据栈有数据,直接出栈;2.1.否则,如果辅助栈有数据,不停出栈给到数据栈2.2.出栈数据栈中的元素classMyQueue:def__init__(sel......
  • 阻塞队列 - BlockingQueue
     线程通信的一个工具。在任意时刻,不管并发有多高,在单JVM上面,同一时间永远只有一个线程能够对队列进行入队或者出队操作。1.线程安全的队列;2.队列类型:无限队列、有限队......
  • C++——优先级队列(priority_queue)
    其为队列需要包含头文件#include,其与queue的不同之处在于,可以自定义数据的优先级,让优先级高的排在队列的前面,优先出队;优先队列具有队列的所有特性,包括基本操作,只是在此基......
  • JAVA并发容器-ConcurrentLinkedQueue 源码分析
    在并发编程中,有时候需要使用线程安全的队列。如果要实现一个线程安全的队列有两种方式:一种是使用阻塞算法,另一种是使用非阻塞算法。使用阻塞算法的队列可以用一个锁(入队和......
  • 406.queue-reconstruction-by-height 根据身高重建队列
    问题描述406.根据身高重建队列解题思路首先根据身高对数组重新排序,再根据ki进行插入操作。排序时,需要对排序的比较方法重写,参见C++sort排序函数用法。同时,考虑到基于......
  • [单片机框架] [queue] 实现一个简易的消息队列
    使用方法如下:#defineUSB_RECV_Q_ITEM_CNT8#defineUSB_RECV_Q_ITEM_SIZE(64+1)//用于usb消息队列总缓存区......
  • ThreadPoolExecutor BlockingQueue讲解
    有四种常用阻塞队列策略:1.直接拒绝:(DirectHandoffs)一个好的工作队列应该是不缓存任务,而是直接交给线程处理,就如SynchronousQueue一样。一个任务将会入队失败,如果没有......
  • JQueue一个实现Outbox模式的库
       为了提高系统吞吐率,也就是提高生产效率,核心观点如下,系统设计也是如此    在微服务或任何其他基于事件的架构(event-driven-architecture)中,在一些用例中,一个......
  • 手写类似基于基本容器(例如 vector,list)的其他容器(例如queue)
    自己写的代码: 参考老师写法后:  运行结果: ......
  • java-并发集合-阻塞队列 LinkedBlockingQueue 演示
    java-并发集合-阻塞队列LinkedBlockingQueue演示packageme.grass.demo.concuronte;importjava.util.Date;importjava.util.concurrent.CountDow......