Preface

本着刷遍(只刷一遍)各大OJ的原则我找到了一场UOJ的比赛

无奈UOJ一般的比赛难度太大,我就精选了UER中最简单的一场打了一下,就当是CSP前的练习吧


A. 【UER #5】万圣节的南瓜灯

一看就是要搞个结论的题目。首先我们看出来所有没有坏的格子要形成一棵

那么对于\(n,m\le 1000\)的数据我们直接暴力连边并查集判断即可

然后考虑\(n,m\)较大时怎么做,我们发现树一定满足边数+1=点数,换句话说就是边数小于点数

那么我们容易发现对于\(2nm-m-4K<nm-k\),那么我们粗略地估计一下就会发现当\(nm\ge 400000\)的时候一定无解,否则使用上述过程即可

`#include<cstdio>
#include<cctype>
#define RI register int
#define CI const int&
#define Tp template <typename T>
const int N=400005,dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};
int t,n,m,p,ans,x[N],y[N]; bool mpl[N],*a[N],flag;
class FileInputOutput
{
private:
static const int S=1<<21;
#define tc() (A==B&&(B=(A=Fin)+fread(Fin,1,S,stdin),A==B)?EOF:*A++)
char Fin[S],*A,*B;
public:
Tp inline void read(T& x)
{
x=0; char ch; while (!isdigit(ch=tc()));
while (x=(x<<3)+(x<<1)+(ch&15),isdigit(ch=tc()));
}
#undef tc
}F;
inline int id(CI x,CI y)
{
return (x-1)*m+y;
}
class UnionFindSet
{
private:
int fa[N];
inline int getfa(CI x)
{
return x!=fa[x]?fa[x]=getfa(fa[x]):x;
}
public:
inline void init(CI n)
{
for (RI i=1;i<=n;++i) fa[i]=i;
}
inline void link(CI x,CI y)
{
int fx=getfa(x),fy=getfa(y);
if (fx==fy) return (void)(flag=0); ++ans; fa[fx]=fy;
}
}S;
inline void clear(void)
{
for (RI i=1;i<=p;++i) a[x[i]][y[i]]=0;
}
int main()
{
//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
RI i,j,k; for (F.read(t);t;--t)
{
F.read(n); F.read(m); F.read(p); ans=0;
if (1LL*n*m>400000)
{
for (i=1;i<=p;++i) F.read(x[i]),F.read(y[i]);
puts("No"); continue;
}
for (a[1]=mpl,i=2;i<=n;++i) a[i]=a[i-1]+m;
for (i=1;i<=p;++i) F.read(x[i]),F.read(y[i]),a[x[i]][y[i]]=1;
//for (i=1;i<=n;++i) for (j=1;j<=m;++j) printf("%d%c",a[i][j]," \n"[j==m]);
for (S.init(n*m),flag=i=1;i<=n;++i) for (j=1;j<=m;++j)
if (!a[i][j]) for (k=0;k<4;++k)
{
int x=i+dx[k],y=j+dy[k]; if (!y) y=m; if (y>m) y=1;
if (x&&x<=n&&!a[x][y]&&id(i,j)<id(x,y)) S.link(id(i,j),id(x,y));
}
if (!flag) { puts("No"); clear(); continue; }
if (ans+1==n*m-p) puts("Yes"); else puts("No"); clear();
}
return 0;
}

B. 【UER #5】万圣节的数列

可以说是非常良心的一道题了,思路很顺畅

我们先考虑排列的部分分,猜测有一种构造使得它只存在长度小于等于\(2\)的等差序列

那么推广到一般的数列,那么就是不可能出现公差不为零的长度\(\ge 3\)的等差子序列

考虑怎么构造,首先就想到分治。考虑我们如果能避免所有公差的长度\(\ge 3\)的等差子序列出现就一定可行(废话),那么怎么实现对于所有公差都能成立的构造

当然要请到神奇的二进制了。我们考虑对于一个区间\([l,r]\),现在在处理二进制下的第\(k\)位

我们把二进制下第\(k\)位为\(1\)的丢到这个区间的左边,第\(k\)位为\(0\)的都扔到右边,然后递归处理两个子区间,将\(k\)增加一位即可

因为这样当前公差能表示的等差序列必然一个端点在一侧,无法构成长度为\(3\)的,因此是合法的

复杂度\(O(n\log n)\)(大雾跑\(500\))

#include<cstdio>
#define RI register int
#define CI const int&
using namespace std;
const int N=505;
int n,a[N],p[N],odd[N],even[N];
inline void solve(CI l=1,CI r=n,CI s=0)
{
if (l>=r||s>30) return; RI p1=0,p2=0,i;
for (i=l;i<=r;++i) if ((a[p[i]]>>s)&1) odd[++p1]=p[i]; else even[++p2]=p[i];
for (i=1;i<=p1;++i) p[l+i-1]=odd[i]; for (i=1;i<=p2;++i) p[l+p1+i-1]=even[i];
solve(l,l+p1-1,s+1); solve(l+p1,r,s+1);
}
int main()
{
RI i; for (scanf("%d",&n),i=1;i<=n;++i) scanf("%d",&a[i]),p[i]=i;
for (solve(),i=1;i<=n;++i) printf("%d ",p[i]); return 0;
}

C. 【UER #5】万圣节的糖果

这么多年的一道DP题了放在当下看还是会令人感觉很妙

(注意一下的算法无视集合的顺序进行计算,最后乘上\(m!\)即可)

首先我们能想出\(O(n^3)\)的DP,设\(f_{i,j,k}\)为前\(i\)个数中,有\(j\)个集合的最后一个糖果奇偶性与\(i\)相同,有\(k\)个集合的最后一个糖果的奇偶性与\(i\)不同的方案数

很显然地我们有\(f_{i,j,k}=(k+1)\times f_{i-1,k+1,j-1}+f_{i-1,k,j-1}\)

但是这样的复杂度是\(O(n^3)\)的,不足以通过此题(然后我就不会了,以下都是题解的绝妙做法)

这是一个很有趣的故事(参见题解算法四)

我们考虑把DP改一下,变成求每个集合中糖果奇偶性相同的方案数

则\(dp_{i,j,k}=s_{\lceil\frac{i}{2}\rceil,j}\times s_{\lfloor\frac{i}{2}\rfloor,k}\),其中\(dp\)的维数表示与\(f\)一致,\(s\)表示第二类斯特林数

那么我们有以下性质:\(f_{i,j,k}=dp_{i+1,k+1,j}\),证明如下:

当\(i=1\)时,显然只有\(j=1,k=0\)的时候方案数为\(1\),否则为\(0\)

当\(i>1\)时,将上面的等式稍稍变形就有:\(f_{i-1,j,k}=dp_{i,k+1,j}\),则:

\[f_{i,j,k}=(k+1)\times f_{i-1,k+1,j-1}+f_{i-1,k,j-1}=(k+1)\times dp_{i,j,k+1}+dp_{i,j,k}=dp_{i+1,k+1,j}
\]

(最后一步利用第二类斯特林数的收缩把系数收回去)

那么我们只要\(O(n^2)\)次计算就可以得出答案

·#include<cstdio>
#define RI int
#define CI const int&
using namespace std;
const int N=6005,mod=998244353;
int n,m,g[N][N],ans;
inline int sum(CI x,CI y)
{
int t=x+y; return t>=mod?t-mod:t;
}
inline int dp(CI x,CI y,CI z)
{
return 1LL*g[(x>>1)+1][y]*g[x+1>>1][z]%mod;
}
int main()
{
RI i,j; for (scanf("%d%d",&n,&m),g[0][0]=i=1;i<=(n+1>>1)+1;++i)
for (j=1;j<=i;++j) g[i][j]=sum(g[i-1][j-1],1LL*j*g[i-1][j]%mod);
for (i=0;i<=m;++i) ans=sum(ans,dp(n,m-i+1,i));
for (i=1;i<=m;++i) ans=1LL*ans*i%mod; return printf("%d",ans),0;
}

Postscript

我还菜啊对于计数题毫无还手之力

UOJ Easy Round #5的更多相关文章

  1. UOJ Easy Round#7

    UOJ Easy Round#7 传送门:http://uoj.ac/contest/35 题解:http://matthew99.blog.uoj.ac/blog/2085 #1 题意: 在一个(2 ...

  2. 【UOJ Easy Round #1】

    数论/Trie/并查集 猜数 这题我是这样分析的…… $a*b=g*l=n=k^2 \ and \ (g|a,g|b) \Rightarrow (g*a')*(g*b' )=g*l=k^2 \\ \R ...

  3. 【UOJ Easy Round #2】

    然而UER我也照样跪…… 第一题 忘了取模sad || 操作符将整个区间分成了一些段,每个手机只会执行其中某一段,执行次数为这一段中&&的个数?+1? ans=ans*num[i]+1 ...

  4. UOJ Test Round 1

    第一题: 题目大意: 给出N个字符串,字符串的前面部分都是字母且都是一样的,后面部分是数字,按照后面的数字排序.N<=10000 解题过程: 1.第一题是真良心,一开始的做法是把后面的数字分离出 ...

  5. UOJ Test Round #2

    昨天晚上打的这个比赛,简直一颗赛艇啊-- 感觉发挥的并不好.比赛的时候比较紧张,最后一题还脑残写了个离散化结果爆零了,哎我怎么这么逗逼-- 讲讲比赛经过吧. 比赛之前逗逼地以为是8:00开始,然后淡定 ...

  6. YZOI Easy Round 2_回文串 string

    原文链接:http://laphets1.gotoip3.com/?id=18 Description 给出一个由小写字母组成的字符串,其中一些字母被染黑了,用?表示.已知原来的串不是 一个回文串,现 ...

  7. YZOI Easy Round 2_化简(simplify.c/cpp/pas)

    Description 给定一个多项式,输出其化简后的结果. Input 一个字符串,只含有关于字母x 的多项式,不含括号与分式,没有多余的空格. Output 一个字符串,化简后的多项式,按照次数从 ...

  8. [模拟赛FJOI Easy Round #2][T3 skill] (最小割+最大权闭合子图(文理分科模型))

    [题目描述] 天上红绯在游戏中扮演敏剑,对于高攻击低防御的职业来说,爆发力显得非常重要,为此,她准备学习n个技能,每个技能都有2个学习方向:物理攻击和魔法攻击.对于第i个技能,如果选择物理攻击方向,会 ...

  9. [模拟赛FJOI Easy Round #2][T1 sign] (模拟+求字符串重复字串)

    [题目描述] 小Z在无意中发现了一个神奇的OJ,这个OJ有一个神奇的功能:每日签到,并且会通过某种玄学的算法计算出今日的运势.在多次试验之后,小Z发现自己的运势按照一定的周期循环,现在他找到了你,请通 ...

随机推荐

  1. WPF 精修篇 样式继承

    原文:WPF 精修篇 样式继承 这个 是新知识 样式可以继承 <Style x:Key="TextBlockStyleBase" TargetType="{x:Ty ...

  2. golang--海量用户即使通讯系统

    功能需求: 用户注册 用户登录 显示在线用户列表 群聊 点对点聊天 离线留言

  3. saltstack--关于报错“UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 6: ordinal not in range(128)”

    [root@linux-node1 桌面]# salt-key [ERROR ] 'ascii' codec can't decode byte 0xe6 in position 6: ordinal ...

  4. dotnetcore实现Aop

    dotnetcore实现Aop Aop大家都不陌生,然而今天给大家不将讲官方的filter,今天给大家分享一个轻量级的Aop解决方案(AspectCore) 什么是AspectCore AspectC ...

  5. IT兄弟连 HTML5教程 HTML5的靠山 W3C、IETF是什么

    无规矩不成方圆,软件开发当然不能例外.Web开发涉及的厂商和技术非常多,所以必须要有参考的标准,而且需要一系列的标准.Web程序都是通过浏览器来解析执行的,通过页面的展示内容与用户互动,所以Web标准 ...

  6. 疑问:Spring 中构造器、init-method、@PostConstruct、afterPropertiesSet 孰先孰后,自动注入发生时间

    一.前言 spring的一大优点就是扩展性很强,比如,在spring bean 的生命周期中,给我们预留了很多参与bean 的生命周期的方法.大致梳理一下,有以下几种: 通过实现 Initializi ...

  7. 常用regex正则表达式

    [单个]字符匹配 任意字符:表示由任意字符组成 \\:匹配一个'\' \n:匹配换行 \t:匹配制表符 [单个]字符集(可以从里面任选一个字符) [abc]:可以是字母abc中任意一个 [^abc]: ...

  8. SpringBoot(15)—@Conditional注解

    SpringBoot(15)-@Conditional注解 作用 @Conditional是Spring4新提供的注解,它的作用是按照一定的条件进行判断,满足条件的才给容器注册Bean. 一.概述 1 ...

  9. MySQL(6)---变量

    MySQL(6)-变量 这里学习变量主要是为后面学习存储过程和函数做铺垫. 变量的分类 系统变量: 全局变量 会话变量 自定义变量: 用户变量 局部变量 一.系统变量 1.概述 说明:变量由系统定义, ...

  10. python bin文件处理

    参考: https://blog.csdn.net/and_then111/article/details/86744938 https://blog.csdn.net/zw515370851/art ...