首页 > 其他分享 >10.7

10.7

时间:2024-10-07 17:02:15浏览次数:1  
标签:tmp ch ve 10.7 int else define

A.构造

构造出一个不超过 \(40\times40\)的矩阵,每个位置填 \(r,y,x\) 三者之一,使得连续的三个格子按顺序构成字符串 \(ryx\) 恰好有 \(n\) 个。
这里连续的是指同一行、同一列或者同一 \(45°\) 斜线,方向任意。

唐唐的构造。
最优的情况一定是 \(ryxyryx\) 这种情况,算一下发现最多能有 \(19\times117=2223\) 个 \(ryx\) ,然后随便构造一下就好了。
感觉有必要放一下赛时的略显抽象的码。

点击查看代码
#include <bits/stdc++.h>
#define fr first
#define se second
#define U unsigned
#define LL long long
#define pb push_back
#define pii pair<int,int>
#define pLi pair<LL,int>
#define pLL pair<LL,LL>
#define __ __int128
#define ld long double
#define VE vector<LL>
#define db double

using namespace std;

inline int read()
{
	int x = 0,f = 1;char ch = getchar();
	while(!isdigit(ch)) (ch == '-') && (f = -1),ch = getchar();
	while(isdigit(ch)) x = x*10+ch-48,ch = getchar();
	return x*f;
}

int n,a[45][45];

void D(int x,bool fl)
{
	if (!n) return ;
	if (x == 40)
	{ 
		a[x][1] = 1,a[x][2] = 2,a[x][3] = 3;fl = 1;n--;
		for (int y = 4;y < 40 && n;y += 2)
		{
			if (fl) a[x][y] = 2,a[x][y+1] = 1,n--;
			else a[x][y] = 2,a[x][y+1] = 3,n--;
			fl ^= 1;
		}
		return ;
	}
	int nw = 1;
	for (int y = 1;y <= 40 && n;y++)
	{
		if (y > 1) nw = 3;
		if (y == 2 || y == 40) nw = 2;
		if (n < nw)
		{
			if (n == 1 || y == 40)
			{
				if (fl)
				{
					if (y < 40) a[x][y] = 2,a[x+1][y] = 3;
					else a[x][y] = 3,a[x+1][y] = 1;
				}
				else
				{
					if (y < 40) a[x][y] = 2,a[x+1][y] = 1;
					else a[x][y] = 3,a[x+1][y] = 3;
				}
			}
			else
			{
				if (y == 39)
				{
					if (fl) a[x][y] = 2,a[x+1][y] = 3,a[x][y+1] = 3,a[x+1][y+1] = 1;
					else a[x][y] = 2,a[x+1][y] = 1,a[x][y+1] = 1,a[x+1][y+1] = 3;
				}
				else
				{
					if (fl) a[x][y] = 3,a[x+1][y] = 1,a[x][y+1] = 2,a[x+1][y+1] = 3;
					else a[x][y] = 1,a[x+1][y] = 3,a[x][y+1] = 2,a[x+1][y+1] = 1;
				}
				y++;
			}
			n = 0;
		}
		else
		{
			if (fl) a[x][y] = 2,a[x+1][y] = 1;
			else a[x][y] = 2,a[x+1][y] = 3;
			n -= nw;
		}
		if (!n)
		{
			while (++y <= 40)
			{
				if (fl) a[x][y] = 3,a[x+1][y] = 3;
				else a[x][y] = 1,a[x+1][y] = 1;
			}
		}
	}
	D(x+2,!fl);
}

int main()
{
	freopen("ryx.in","r",stdin);
	freopen("ryx.out","w",stdout);
	n = read();int tmp = n;
	int nw = 1;
	for (int i = 1;i <= 40 && n;i++)
	{
		if (i > 2) nw = 3;
		if (n < nw)
		{
			if (n == 1) a[1][i] = 1,a[2][i] = 2,a[3][i] = 2;
			else a[1][i] = 1,a[2][i] = 3,a[3][i] = 3;
			n = 0;
		}
		else a[1][i] = 1,a[2][i] = 2,a[3][i] = 3,n -= nw;
	}
	D(4,1);
	cout << 40 << " " << 40 << '\n';
	for (int i = 1;i <= 40;i++)
	{
		for (int j = 1;j <= 40;j++)
		{
			if (!a[i][j]) a[i][j] = 2;
			if (a[i][j] == 1) cout << 'r';
			if (a[i][j] == 2) cout << 'y';
			if (a[i][j] == 3) cout << 'x';
		}
		cout << '\n';
	}
	return 0;
}

B.游戏

有数组 \(a_1\cdots a_n\) ,\(A\) 先选择一个数 \(i\) 使 \(a_i=0\),\(B\) 后选择一个数 \(j\),答案即为 \(a_j\) ,\(A\) 想使答案最小,\(B\) 想使答案最大,求期望答案。(\(B\) 在选择时并不知道 \(A\) 选了哪个数)

赛时没读懂题,实际上只需考虑一方就可以了,即找出一个策略,使得无论 \(B\) 选择哪个数,最终期望答案都 \(\le m\) 。
所以我们可以二分答案,设 \(p_i\) 为 \(A\) 选择 \(i\) 的概率。
每次将 \(a_i>m\) 的 \(a_i\) 分配一个概率,即 \((1-p_i)a_i=m\) ,所以 \(p_i=1-\frac{m}{a_i}\) ,最后判断一下所有概率的和是否 \(\le0\) 。

C.数数

对于一个排列 \(\{p_n\}\),定义 \(f(k,i)=\min\limits_{j=i}^{i+k-1}p_j\),\(F(k)=\max\limits_{i=1}^{n-k+1}f(k,i)\)。
现在给出 \(F(1),F(2),\dots,F(n)\),求有多少个满足的排列。

赛时觉得跟 arc183_c 很像,但是在这里不能使用区间 \(dp\) 。
事实上这又是一个未知复杂度的题,不过这回 \(OI\) 赛制赛时谁敢写这个。
容易发现 \(F(i)\) 是单调不增的,同时每个数都覆盖一段区间。
于是我们记 \(l_i\) 为 \(i\) 在 \(F\) 中第一次出现的位置,\(r_i\) 为 \(i\) 在 \(F\) 中最后一次出现的位置。
当我们从小往大填数的时候,维护所有极长空段的长度,有两种情况:

  1. 当前数 \(i\) 在 \(F\) 数列中出现过,若当前最长空段的长度 \(\neq r_i\),那么状态不合法。否则我们枚举 \(i\) 填入的位置,同时更新状态和答案,将插入的空段分为两个空段。
  2. \(i\) 在 \(F\) 中没有出现过,此时直接枚举填入的位置就好,一个细节是若当前最长空段只有一个,那么当前数 \(i\) 不能填入极长空段。
点击查看代码
#include <bits/stdc++.h>
#define fr first
#define se second
#define U unsigned
#define LL long long
#define pb push_back
#define pii pair<int,int>
#define pLi pair<LL,int>
#define pLL pair<LL,LL>
#define __ __int128
#define ld long double
#define VE vector<LL>
#define db double

using namespace std;

inline int read()
{
	int x = 0,f = 1;char ch = getchar();
	while(!isdigit(ch)) (ch == '-') && (f = -1),ch = getchar();
	while(isdigit(ch)) x = x*10+ch-48,ch = getchar();
	return x*f;
}

const int P = 998244353;
int F[55],n,L[55],R[55];
map < vector<int>,int > f;
map < vector<int>,bool > vis;

inline int mod(int x)
{return x >= P ? x-P : x;}

int main()
{
	freopen("count.in","r",stdin);
	freopen("count.out","w",stdout);
    int n = read();
    for (int i = 1;i <= n;i++)
	{
		F[i] = read();
		if (!L[F[i]]) L[F[i]] = i;
		R[F[i]] = i;
	}
	queue < vector<int> > q;
	vector < int > ve;ve.pb(n);
	q.push(ve),f[ve] = 1;
	while (q.size())
	{
		ve = q.front();q.pop();vis[ve] = 0;
		int mx = ve.back(),id = ve.size(),s = 0;
		for (int i : ve) s += (i == mx);
		if (!L[id])
		{
			for (int i = 0;i < ve.size();i++)
			{
				if (ve[i] && (ve[i] < mx || s > 1))
				{
					for (int j = 1;j <= ve[i];j++)
					{
						vector < int > tmp;
						for (int k = 0;k < ve.size();k++)
							if (k != i) tmp.pb(ve[k]);
						tmp.pb(j-1),tmp.pb(ve[i]-j);
						sort(begin(tmp),end(tmp));
						if (!vis[tmp]) vis[tmp] = 1,q.push(tmp);
						f[tmp] = mod(f[tmp]+f[ve]);
					}
				}
			}
		}
		else
		{
			if (mx != R[id]) continue;
			for (int i = ve.size()-1;i >= 0;i--)
			{
				if (ve[i] != mx) break;
				for (int j = 1;j <= ve[i];j++)
				{
					vector < int > tmp;
					for (int k = 0;k < ve.size();k++)
						if (k != i) tmp.pb(ve[k]);
					tmp.pb(j-1),tmp.pb(ve[i]-j);
					sort(begin(tmp),end(tmp));
					if (tmp.back() == L[id]-1)
					{
						if (!vis[tmp]) vis[tmp] = 1,q.push(tmp);
						f[tmp] = mod(f[tmp]+f[ve]);
					}
				}
			}
		}
	}
	ve.clear(),ve.resize(n+1);
	cout << f[ve];
	return 0;
}

D.滈葕

给定一个 \(0/1\) 边权有向图,给每个点赋予一个 \(ABCD\) 中的字母使得每条有向边 \((u,v,w)\) 都满足 \(w=1\Leftrightarrow(a_u,a_v)\in\{(A,D),(A,B),(B,D),(B,A),(C,D),(C,A),(C,B)\}\) 。

简称输入的 \(0\) 边(不克制)为白边,\(1\) 边(克制)为黑边
容易看到,\(A,B\) 对称且强连通,而 \(C\) 只会克制别人,\(D\) 只会被别人克制。
所以首先,一个点只有无黑边入且无白边出(或者只有白边指向 \(C\))的可以是 \(C\),只有无白边入且无黑边出的可以是 \(D\)。
我们可以贪心把所有无黑边入且无白边出的染成 \(C\),把所有无白边入且无黑边出且还没染成 \(C\) 的染成 \(D\)。
这样染之后,剩下的点都既有黑入/白出之一又有白入/黑出之一。把那些只有白边指向 \(C\) 的设为 \(C\)。再剩下的只能是 \(A,B\) 之一。称这些剩下的点组成集合 \(X\)。
我们只需要考虑 \(X\) 内部连的边,因为其它边都已经被染成 \(C,D\) 的点满足了。
可以发现 \(X\) 内如果存在一条白边,则说明两端相同属性,如果存在一条黑边则说明两端不同属性。因
为 \(A,B\) 互克。那么直接把白边缩起来,并判定黑边在缩点之后的二分图染色即可。

标签:tmp,ch,ve,10.7,int,else,define
From: https://www.cnblogs.com/ZepX-D/p/18450216

相关文章

  • 2024.10.7 test
    nf#33B有一棵包含\(n\)个节点的有根树,且树的高度不超过\(100\)。每次操作时可以选择一个节点\(u\),使其与父节点断开(如果有),成为一颗新树的根节点,然后删除以节点\(u\)为根的树中的所有叶节点。求删除所有节点所需的最少操作次数和通过最少次操作删除所有节点的方案数。\(n......
  • 2024.10.7(周一)
    <%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPEhtml><html><head><title>车间班组</title><style>/*整体页面布局和样式*/......
  • 【计算机方向】IF:10.7,发展势头迅猛,中科院二区TOP神刊!
    期刊解析        ......
  • 电脑长截图滚动截图FastStone Capture v10.7专业授权绿色版
    FastStoneCapture是一款集屏幕捕捉、编辑、导出和屏幕录像为一体的轻量级、多功能截图录屏软件。软件的特色功能是支持电脑长截图滚动截图。它以其简洁高效的操作界面和强大的功能赢得了全球用户的青睐。FastStoneCapture自2000年推出以来,经历了多次更新迭代,每一次升级都是对......
  • Visual Studio 2013 jsoncpp 0.10.7库编译
    前言全局说明VisualStudio2013jsoncpp编译jsoncpp介绍说明:https://www.cnblogs.com/wutou/p/18367551一、说明环境:Windows7旗舰版VisualStudio2013二、选择根据vs2013工具环境和jsoncpp介绍,这里选用0.10.7版本演示三、准备3.1解压文件进入m......
  • 北斗/GNSS高精度数据处理暨GAMIT/GLOBK v10.75软件
    随着GNSS导航定位技术在不同领域的广泛应用和技术更新的飞速发展,在大型工程项目的设计、施工、运行和管理各个阶段对工程测量提出了更高的要求,许多测绘、勘测、规划、市政、交通、铁道、水利水电、建筑、矿山、道桥、国土资源、气象、地震等行业部门在大型工程建设过程中需应用......
  • 北斗/GNSS高精度数据处理暨GAMIT/GLOBK v10.75软件应用
    目录第一部分、UBUNTU操作系统介绍与基本使用第二部分、GAMIT/GLOBK软件安装第三部分、数据获取与预处理第四部分、分步式“玩转”GAMIT软件第五部分、应用GAMIT+网平差软件进行高精度北斗/GNSS工程控制网数据处理与精度评估第六部分、“玩转”TRACK软件第七部分、分步......
  • Nessus Professional 10.7.5 Auto Installer for macOS Sonoma (updated Jul 2024)
    NessusProfessional10.7.5AutoInstallerformacOSSonoma(updatedJul2024)发布Nessus试用版自动化安装程序,支持macOSSonoma、RHEL9和Ubuntu24.04请访问原文链接:https://sysin.org/blog/nessus-auto-install-for-macos/,查看最新版。原创作品,转载请保留出处。作......
  • Nessus Professional 10.7.5 Auto Installer for RHEL 9/AlmaLinux 9/Rocky Linux 9 (
    NessusProfessional10.7.5AutoInstallerforRHEL9/AlmaLinux9/RockyLinux9(updatedJul2024)发布Nessus试用版自动化安装程序,支持macOSSonoma、RHEL9和Ubuntu24.04请访问原文链接:https://sysin.org/blog/nessus-auto-install-for-rhel-9/,查看最新版。原创作......
  • Nessus Professional 10.7.5 Auto Installer for Ubuntu 24.04 (updated Jul 2024)
    NessusProfessional10.7.5AutoInstallerforUbuntu24.04(updatedJul2024)发布Nessus试用版自动化安装程序,支持macOSSonoma、RHEL9和Ubuntu24.04请访问原文链接:https://sysin.org/blog/nessus-auto-install-for-ubuntu/,查看最新版。原创作品,转载请保留出处。作......