2020.10.21備賽

clear_conscience發表於2020-10-22

T1

暫無體面

可撤回貪心


T2

暫無體面

題目的是指上是求一個點到後面的最長不下降子序列加最長不上升子序列的長度和-1。而且這兩個序列不能有交集。時間複雜度為 O ( n   l o g n ) O(n\ log_{n}) O(n logn)

#include<cstdio>
#include<algorithm>
using namespace std;

const int N = 1e5 + 5;
int a[N], q[N], Q[N], f[N], g[N], n, tot, ans = 1, Tot;

int main()
{
	freopen("dequexlis.in", "r", stdin);
    freopen("dequexlis.out", "w", stdout);
	scanf("%d", &n);
	for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
	for(int i = 1; i <= n; i++)
	{
		int j = lower_bound(q + 1, q + tot + 1, a[n - i + 1]) - q, k = lower_bound(Q + 1, Q + Tot + 1, -a[n - i + 1]) - Q;
		q[f[i] = j] = a[n - i + 1], Q[g[i] = k] = -a[n - i + 1], tot = max(tot, j), Tot = max(Tot, k);
	}
	for(int i = 1; i <= n; i++) ans = max(ans, f[i] + g[i] - 1);
	printf("%d", ans), fclose(stdin), fclose(stdout);
	return 0;
}

T3

暫無體面
可以用Catalan數,也可以學學CLY打表找規律(根本看不懂怎麼想出這個規律的 )。
附上BIRD的程式碼

#include<iostream>
#include<cstdio>
#include<algorithm>
#define mod 998244853
#define N 2010
using namespace std;
int n,m;
long long f[N][N],s[N][N];
int main()
{
	freopen("maxpsum.in","r",stdin);
	freopen("maxpsum.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	{
		f[i][0]=1,s[i][0]=i;
		for(int j=1;j<i;j++) 
			f[i][j]=(f[i-1][j]+f[i][j-1])%mod;
		for(int j=1;j<=m;j++)
			s[i][j]=(s[i-1][j]+s[i][j-1]+f[i][j])%mod;
	}
	printf("%lld",s[n][m]);
	return 0;
}

相關文章