谢天谢地,还好没掉分,还加了8分,(8分再小也是加啊)前期刚开始有点卡,不过在尽力的调整状态之后,还是顺利的将前面的水题过完了,剩下的E2和F题就过不去了,估计是能力问题,自己还是得认真补题啦。

E2. Rubik's Cube Coloring (hard version)

这个题是在上一题的基础上出现的,E1的就很简单,一个完全二叉树,每个点都没有染色,求不同染色方案的方案数。显然的是在第一个点的颜色确定后,后面所有点的颜色都只有4种选择,也就是无论父节点选了什么颜色,该节点都有且仅有四种选择。所以答案就是\(6*4^{n-1}\).那么作为困难版的,这个题就是给某些点已经染上了颜色,要求所有的方案数。显然上一题的简单思路不能解决这个题了,因为我们似乎不能将所有的点都割裂开了。考虑这个例子,一个节点的父节点和子节点都以前提前被染过色了,那么该节点的颜色选择就依赖于父节点和子节点的颜色。像这种题,肯定存在一些性质,或者说我们没有找到颜色之间限制的本质。考虑这样一个事情,就像简单题的那个例子,若一颗树,其根节点确定后,那么颜色的方案数就是\(4^{n-1}\),那么考虑在有一些点被提前确定颜色的树上,我们能不能用上这个结论,我们先找到这棵树上的所有符合条件子树,他们的所有节点都没有被确定颜色。那么对于这些节点,他们的根节点的颜色可能有限制,但他们非根节点的颜色方案数就是4,我们用最朴素的思路,采取dp的思路,某些点上必须采用dp的方式才能解决颜色限制的问题,但有些子树,所有节点都没被提前染色,他们的方案数就能快速计算。观察题目数据,有颜色的点是\(2000\),考虑一个有颜色的点最多使多少个点必须用dp的方式,显然是n,那么总的dp的状态数就是\(2000*60*6*3\)如果采用map的话,还需要多乘一个log。

(我死也没想到我会死在快速幂上,以后的\(y\)我都打成\(long long\)....)

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int P=1e9+7;
int n,k;
char c[10];
map<ll,int>vis,co,f[4]; inline ll power(ll x,ll y)
{
ll ans=1;
while(y)
{
if(y&1) ans=ans*x%P;
y>>=1;
x=x*x%P;
}
return ans%P;
} inline void dfs(ll x,int dep)
{
if(dep>n) return;
if(vis.find(x*2)!=vis.end()) dfs(x*2,dep+1);
if(vis.find(x*2+1)!=vis.end()) dfs(x*2+1,dep+1);
if(co.find(x)!=co.end()) f[co[x]][x]=1;
else f[1][x]=f[2][x]=f[3][x]=2;
if(dep==n) return;
ll F[4],G[4],C[4]={0,0,0,0};//分别表示两个儿子不同颜色的方案数。
ll ds=(2ll*power(4,(1ll<<(n-dep))-2))%P;
if(vis.find(2*x)!=vis.end())
for(int i=1;i<=3;++i) F[i]=f[i][2*x];
else
for(int i=1;i<=3;++i) F[i]=ds;
if(vis.find(2*x+1)!=vis.end())
for(int i=1;i<=3;++i) G[i]=f[i][2*x+1];
else
for(int i=1;i<=3;++i) G[i]=ds;
C[1]=(F[2]*G[2]%P+F[2]*G[3]%P+F[3]*G[2]%P+F[3]*G[3]%P)%P;
C[2]=(F[1]*G[1]%P+F[1]*G[3]%P+F[3]*G[1]%P+F[3]*G[3])%P;
C[3]=(F[1]*G[1]%P+F[1]*G[2]%P+F[2]*G[1]%P+F[2]*G[2])%P;
for(int i=1;i<=3;++i) f[i][x]=C[i]*f[i][x]%P;
} int main()
{
//freopen("1.in","r",stdin);
scanf("%d%d",&n,&k);
for(int i=1;i<=k;++i)
{
ll id;scanf("%lld",&id);
scanf("%s",c+1);
if(c[1]=='w'||c[1]=='y') co[id]=1;
else if(c[1]=='g'||c[1]=='b') co[id]=2;
else if(c[1]=='r'||c[1]=='o') co[id]=3;
while(id)
{
vis[id]=1;//标记这些点不能直接算。
id=id/2;
}
}
dfs(1,1);
int ans=((f[1][1]+f[2][1])%P+f[3][1])%P;
printf("%d",ans);
return 0;
}

F. Ideal Farm

这个数学题真的屯了好久....淦!

首先我们定义\(a_i\)为每个围栏的牛的个数,则\(a_i\)>=1,题目要求无论怎么分,都必须有一个连续的区间使得这个区间内的\(a_i\)的和为k。第一部,我们定义pre[i]为a[i]的前缀和,为什么呢?方便区间和的运算。其中pre[0]=0,pre[n]=s,那么题目就变成了我们能否构造一个序列使得不存在pre[i]-pre[j]=k.(\(0\leq j<i\leq n\)).由于\(a[i]\)都是正整数,所以pre是递增的且各不相同。之后考虑怎么构造a数组是比较麻烦,相比较下,我们考虑怎么构造pre数组,由于pre的性质,其实我们要做的就是在(0,s)中选出n-1个数(因为pre[n]一定是s),使得他们作为当前的pre数组。并且保证不能存在两个被选择的数作差为k。作差为k,我们很容易想到同余系,只有当两个数对k同余时,他们作差才可能为k。既然如此,那我们大可以按照k的余数将(0,s)中的数进行分类。

首先因为pre[0]=0,pre[n]=s,我们先对这两个同余系进行讨论,(先假设s=p*k+r(\(0\leq r\leq k-1\)))先考虑pre[0],它的同余系中的所有数有:\(0,k,2k,3k,...\),发现在(0,s)中一共有\(\lfloor \frac{s}{k}\rfloor\)+1个,由于0已经选过了,且k不能选,所以我们最多拿\(\lceil\frac{\lfloor \frac{s}{k}\rfloor-1}{2}\rceil\).同理,对于r的同余系而言,所有数为\(r,k+r,2*k+4...,p*k+r\),一共\(\lfloor\frac{(s-r)}{k}\rfloor+1=\lfloor\frac{s}{k}\rfloor+1\),同理\(p*k+r,和(p-1)*k+r\)我们同样不能选,故我们能选的个数为\(\lceil\frac{\lfloor\frac{s}{k}\rfloor-1}{2}\rceil\),对于其他的余数\((1\leq x\leq k-1且x!=r)\),我们都有x,x+k,...总的个数都为\(\lfloor\frac{s-x}{k}\rfloor+1\),我们能选出的个数为\(\lceil\frac{\lfloor\frac{s-x}{k}\rfloor+1}{2}\rceil\)所以总的能选出来的个数为:\(2\times\lceil\frac{\lfloor \frac{s}{k}\rfloor-1}{2}\rceil+\sum_{x=1}^{k-1}\lceil\frac{\lfloor\frac{s-x}{k}\rfloor+1}{2}\rceil(x!=r)\)在求和号中,k依然比较大,因为\(s=p*k+r\),当\(x<r\)时,可取\(\lceil\frac{p+1}{2}\rceil(x!=r)\),当\(x>r\)时,可取\(\lceil\frac{p}{2}\rceil(x!=r)\)所以我们最后的答案就是\(ans=2\times\lceil\frac{\lfloor \frac{s}{k}\rfloor-1}{2}\rceil+(r-1)*\lceil\frac{p+1}{2}\rceil+(k-1-r)*\lceil\frac{p}{2}\rceil\)。但考虑一种情况,即r=0的情况,观察我们上述式子,会发现上述推论可能存在一些问题,但我们观察我们的式子,能否得到正确的答案。如果你有兴趣的话1,你话发现结果是一样的,滑稽,这里就不给出详细的推导过程了,留作思考吧。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int T;
int main()
{
// freopen("1.in","r",stdin);
scanf("%d",&T);
while(T--)
{
ll s,n,k;
scanf("%lld%lld%lld",&s,&n,&k);
if(s<k) puts("NO");
else if(s==k) puts("YES");
else
{
ll p=s/k,r=s%k;
ll ans=2ll*ceil((p-1)/2.0)+(r-1)*ceil((p+1)/2.0)+(k-1-r)*ceil(p/2.0);
if(ans>=n-1) puts("NO");
else puts("YES");
}
}
return 0;
}

Codeforces Round #747 (Div. 2)题解的更多相关文章

  1. Codeforces Round #182 (Div. 1)题解【ABCD】

    Codeforces Round #182 (Div. 1)题解 A题:Yaroslav and Sequence1 题意: 给你\(2*n+1\)个元素,你每次可以进行无数种操作,每次操作必须选择其 ...

  2. Codeforces Round #608 (Div. 2) 题解

    目录 Codeforces Round #608 (Div. 2) 题解 前言 A. Suits 题意 做法 程序 B. Blocks 题意 做法 程序 C. Shawarma Tent 题意 做法 ...

  3. Codeforces Round #525 (Div. 2)题解

    Codeforces Round #525 (Div. 2)题解 题解 CF1088A [Ehab and another construction problem] 依据题意枚举即可 # inclu ...

  4. Codeforces Round #528 (Div. 2)题解

    Codeforces Round #528 (Div. 2)题解 A. Right-Left Cipher 很明显这道题按题意逆序解码即可 Code: # include <bits/stdc+ ...

  5. Codeforces Round #466 (Div. 2) 题解940A 940B 940C 940D 940E 940F

    Codeforces Round #466 (Div. 2) 题解 A.Points on the line 题目大意: 给你一个数列,定义数列的权值为最大值减去最小值,问最少删除几个数,使得数列的权 ...

  6. Codeforces Round #677 (Div. 3) 题解

    Codeforces Round #677 (Div. 3) 题解 A. Boring Apartments 题目 题解 简单签到题,直接数,小于这个数的\(+10\). 代码 #include &l ...

  7. Codeforces Round #747 (Div. 2) Editorial

    Codeforces Round #747 (Div. 2) A. Consecutive Sum Riddle 思路分析: 一开始想起了那个公式\(l + (l + 1) + - + (r − 1) ...

  8. Codeforces Round #665 (Div. 2) 题解

    Codeforces Round #665 (Div. 2) 题解 写得有点晚了,估计都官方题解看完切掉了,没人看我的了qaq. 目录 Codeforces Round #665 (Div. 2) 题 ...

  9. Codeforces Round #160 (Div. 1) 题解【ABCD】

    Codeforces Round #160 (Div. 1) A - Maxim and Discounts 题意 给你n个折扣,m个物品,每个折扣都可以使用无限次,每次你使用第i个折扣的时候,你必须 ...

随机推荐

  1. Spring Boot中有多个@Async异步任务时,记得做好线程池的隔离!

    通过上一篇:配置@Async异步任务的线程池的介绍,你应该已经了解到异步任务的执行背后有一个线程池来管理执行任务.为了控制异步任务的并发不影响到应用的正常运作,我们必须要对线程池做好相应的配置,防止资 ...

  2. 深入浅出 BPF TCP 拥塞算法实现原理

    本文地址:https://www.ebpf.top/post/ebpf_struct_ops 1. 前言 eBPF 的飞轮仍然在快速转动,自从 Linux 内核 5.6 版本支持 eBPF 程序修改 ...

  3. 使用metaweblog API实现通用博客发布 之 本地图片自动上传以及替换路径

    使用metaweblog API实现通用博客发布 之 本地图片自动上传以及替换路径 通过metaweblog API 发布博文的时候,由于markdown中的图片路径是本地路径,将导致发布的文章图片不 ...

  4. 鸿蒙内核源码分析(中断概念篇) | 海公公的日常工作 | 百篇博客分析OpenHarmony源码 | v43.02

    百篇博客系列篇.本篇为: v43.xx 鸿蒙内核源码分析(中断概念篇) | 海公公的日常工作 | 51.c.h .o 硬件架构相关篇为: v22.xx 鸿蒙内核源码分析(汇编基础篇) | CPU在哪里 ...

  5. 鸿蒙内核源码分析(内存映射篇) | 虚拟内存虚在哪里 | 百篇博客分析OpenHarmony源码 | v15.03

    百篇博客系列篇.本篇为: v15.xx 鸿蒙内核源码分析(内存映射篇) | 虚拟内存虚在哪里 | 51.c.h .o 内存管理相关篇为: v11.xx 鸿蒙内核源码分析(内存分配篇) | 内存有哪些分 ...

  6. Three 之 Animation 体验一

    Animation 体验一 动画效果 其中涉及到 skeletion.clipAction.GUI Skeletion 在建模软件中可导出 skeletion,这里安利一个可以创建动画的网站 http ...

  7. CentOS7安装Python3和VIM8

    参考:http://blog.sina.com.cn/s/blog_45249ad30102yulz.html

  8. Ysoserial Commons Collections3分析

    Ysoserial Commons Collections3分析 写在前面 CommonsCollections Gadget Chains CommonsCollection Version JDK ...

  9. 高级爬虫面试题测试题 v1.3

    Python Web高级爬虫工程师测试题 (请本文件发送到: SpiderTestQuestion@163.com 并附带简历) 1. 用yield写一个斐波那契数列的生成器函数. 2. 放一段scr ...

  10. centos7谷歌chrome内网部署演示

    上传需要的包,注释网关创建内网环境 [root@localhost ~]# ls anaconda-ks.cfg chrome mcw4 mcw4.tar.gz mcwchromerpm.tar.gz ...