首页 > 其他分享 >P7690 [CEOI2002] A decorative fence 题解

P7690 [CEOI2002] A decorative fence 题解

时间:2024-07-04 09:02:53浏览次数:15  
标签:decorative 25 题解 long vis CEOI2002 ans define rk

题目传送门

前置知识

计数 DP

解法

方案数统计同luogu P2467 [SDOI2010] 地精部落,但部分写得不太好看的状态转移方程在本题中并不适用,但仍可借鉴其“离散化”思想。

考虑试填。

设 \(f_{i,j,0/1}\) 表示用 \(i\) 块不同的木板构成栅栏,其中最左边的木板的长度从小到大排在第 \(j\) 位(仅是相对大小关系),处于低位/高位的方案数,状态转移方程为 \(\begin{cases} f_{i,j,0}=\sum\limits_{k=j}^{i-1}f_{i-1,k,1} \\ f_{i,j,1}=\sum\limits_{k=1}^{j-1}f_{i-1,k,0} \end {cases}\),边界为 \(f_{1,1,0/1}=1\)。

特别处理第 \(1\) 块木板的长度和低/高位情况 \(k\)。接着枚举每位的实际长度 \(j\) 和排名 \(rk\) 使其符合排名即可。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long 
#define ull unsigned long long
#define sort stable_sort 
#define endl '\n'
ll f[25][25][2],vis[25];
int main()
{
	ll t,n,c,ans,rk,i,j,k,h;
	cin>>t;
	f[1][1][0]=f[1][1][1]=1;
	for(i=2;i<=20;i++)
	{
		for(j=1;j<=i;j++)
		{
			for(k=j;k<=i-1;k++)
			{
				f[i][j][0]+=f[i-1][k][1];
			}
			for(k=1;k<=j-1;k++)
			{
				f[i][j][1]+=f[i-1][k][0];
			}
		}
	}
	for(h=1;h<=t;h++)
	{
		cin>>n>>c;
		k=ans=-1;
		memset(vis,0,sizeof(vis));
		for(i=1;i<=n;i++)
		{
			if(f[n][i][1]>=c)
			{
				ans=i;
				k=1;
				break;
			}
			else
			{
				c-=f[n][i][1]; 
			}
			if(f[n][i][0]>=c)
			{
				ans=i;
				k=0;
				break;
			}
			else
			{
				c-=f[n][i][0];
			}
		}
		vis[ans]=1;
		cout<<ans<<" ";
		for(i=2;i<=n;i++)
		{
			k^=1;
			rk=0;
			for(j=1;j<=n;j++)
			{
				if(vis[j]==0)
				{
					rk++;
					if((k==0&&j<ans)||(k==1&&j>ans))
					{
						if(f[n-i+1][rk][k]>=c)
						{
							ans=j;
							break;
						}
						else
						{
							c-=f[n-i+1][rk][k];
						}
					}
				}
			}
			vis[ans]=1;
			cout<<ans<<" ";
		}
		cout<<endl;
	}
	return 0;
}

标签:decorative,25,题解,long,vis,CEOI2002,ans,define,rk
From: https://www.cnblogs.com/The-Shadow-Dragon/p/18282868

相关文章

  • [JLU] 数据结构与算法上机题解思路分享-课程设计第一次与第二次上机
    前言首先,请务必自己尽全力尝试实现题目,直接看成品代码,思维就被拘束了,也很容易被查重。这里只是思路解析的博客,代码仓库在JLU_Data_Structures_Record希望你能在这里找到你想要的:)第一次上机A网络布线分数50作者朱允刚单位吉林大学2024年亚洲杯足球赛刚刚落下帷幕,......
  • 考试题解
    20240703DSroundT1考虑区间子区间问题直接扫描线加历史版本和,考虑修改。现在扫到\(r\),线段树每个位置\(i\)维护的是\(i\)到\(r\)的区间\(lca\),这些\(lca\)的深度具有单调性,考虑直接二分一下位置,然后\(r\)扫到\(r+1\)时,深度大于\(lca(r,r+1)\)的\(......
  • AT_dp_y Grid 2 题解
    题目传送门前置知识计数DP|排列组合解法正难则反,考虑求出总方案数和至少经过一个黑色格子的方案数,二者作差即为所求。强制增加一个黑色格子\((h,w)\),使得存在一条至少经过一个黑色格子的路径。如果没有“不能移动到黑色格子中”的限制,那么就是一个简单的格路计数问题,方......
  • 7.1 lxl DS Day1 题解
    7.1lxlDSDay1题解P7124[Ynoi2008]stcm性质1:考虑轻儿子的子树和为\(O(nlogn)\)。证明:考虑每个结点会对多少个轻祖先做贡献,也就是重链个数,考虑每个节点到根节点重链条数为\(O(nlogn)\),所以子树和为\(O(nlogn)\)。所以对于一条重链,如果我们已经插入了链头的补集,......
  • MySQL在本机环境安装过程及问题解决
    最近在我的Windows10电脑上搭建MySQL数据库环境,没想到居然遇到了不少问题,特记录下来,希望给大家帮助,少走弯路。下载MySQLCommunityServer https://dev.mysql.com/downloads/mysql/ MySQLCommunityServeristheworld'smostpopularopensourcedatabase.这个社区......
  • P10218 [省选联考 2024] 魔法手杖 题解
    题目描述:给定序列\(a_1,\cdots,a_n\)和\(b_1,\cdots,b_n\),满足\(a_i\in[0,2^k-1],b_i\ge0\),你需要给出\(S\subseteq\{1,\cdots,n\}\)和\(x\in[0,2^k-1]\)满足:\(\sum\limits_{i\inS}b_i\lem\)。最大化\(val(S,x)=\min\big(\min\limits_{i\inS......
  • 蓝桥 第 3 场 算法季度赛 前5题题解,剩下的后续发上去补上
    第1题全国科普行动日【算法赛】题目传送门直接输出就行,没多大操作可言:#include<iostream>usingnamespacestd;intmain(){cout<<"6.29";return0;}第2题 A%B【算法赛】题目传送门题目有点小坑,因为也可能是负数,所以需要特判一下,上代码就可以看懂了:#include......
  • 流固耦合可能遇到的问题解决办法
    (纯私人经验)双向流固耦合中出现的一些问题及解决方法:1.出现负网格,可以加密网格,可以去提升网格质量,六面体网格尽量用icemcfd画,四面体就用自带的完全可以,可以增加刚度降低变形量从而消除负网格,可以调整弹簧光顺参数,一般经验取值一个0.6一个0.5,可以缩小时间步长,还可以在fluent......
  • 洛谷 P5723 【深基4.例13】质数口袋 题解
    题面传送门观察题目,我们可以看到这是一道朴素的,判断质数的一道题目。何为质数?质数就是除了111和这个本身,没有其他因数的数。特别的,......
  • AT_arc180_a [ARC180A] ABA and BAB 题解
    思路首先一个浅显易得的结论,当\(A\)或\(B\)连续出现时,我们可以将它们分成两段,每段都可以看作一个独立事件,结果数只和每个独立事件的样本点有关。我们设独立事件共有\(tot\)个,每个独立事件的样本点为\(w_i\),则显然有\(ans=\prod_{i=1}^{tot}w_i\)。接下来该找\(w_i\)......