Codeforces Round #533 (Div. 2) C.思维dp D. 多源BFS

题目链接:https://codeforces.com/contest/1105

 

C. Ayoub and Lost Array

题目大意:一个长度为n的数组,数组的元素都在[L,R]之间,并且数组全部元素的和可以被3整除,问有多少种方法构建出该数组。答案模1000000007

输入
2 1 3
输出
3

note:满足的情况只有[1,2],[2,1],[3,3]

解题思路:用dp[i][j]表示长度为i的数组,元素大小在[L,R]之间,并且元素和模3的余数为j的方案数,我们可以计算出[L,R]范围内模3余0\1\2的数的个数,分别设为num0,num1,num2, 我们可以很容易知道dp[1][0]=num0,dp[1][1]=num1,dp[1][2]=num2,而dp[2][0]需要分情况,当前1个数和模3余0时,第2个数便只能放模3余0的数,即有dp[1][0]*num0种;当前1个数和模3余1时,第2个数便只能放模3余2的数,即有dp[1][1]*num2种;当前1个数和模3余2时,第2个数便只能放模3余1的数,即有dp[1][2]*num1种。dp[n][0]即为我们要求的答案。

于是我们便可以得出递推式:

dp[i][0]=((dp[i-1][0]*num0%mod+dp[i-1][1]*num2%mod)%mod+dp[i-1][2]*num1%mod)%mod;
dp[i][1]=((dp[i-1][0]*num1%mod+dp[i-1][1]*num0%mod)%mod+dp[i-1][2]*num2%mod)%mod;
dp[i][2]=((dp[i-1][0]*num2%mod+dp[i-1][1]*num1%mod)%mod+dp[i-1][2]*num0%mod)%mod;

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<string>
#include<set>
#include<cmath>
#include<list>
#include<deque>
#include<cstdlib>
#include<bitset>
#include<stack>
#include<map>
#include<queue>
using namespace std;
typedef long long ll;
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define pushup() tree[rt]=tree[rt<<1]+tree[rt<<1|1]
const int INF=0x3f3f3f3f;
const double PI=acos(-1.0);
const double eps=1e-6;
const ll mod=1e9+7;
const int maxn=100005;
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
ll dp[2000005][5];
ll n,l,r;
int main()
{ios::sync_with_stdio(false); cin.tie(0);cin>>n>>l>>r;ll num0=r/3-(l-1)/3;ll num1=num0;ll num2=num0;int i,j;for(i=l;i<=r;i++){if(i%3==0)break;else if(i%3==1)num1++;else num2++;}for(j=r;j>=i;j--){if(j%3==2)break;else if(j%3==1){num2--; break;}else if(j%3==0){num1--; num2--;break;}}dp[1][0]=num0; dp[1][1]=num1; dp[1][2]=num2;for(int i=2;i<=n;i++){dp[i][0]=((dp[i-1][0]*num0%mod+dp[i-1][1]*num2%mod)%mod+dp[i-1][2]*num1%mod)%mod;dp[i][1]=((dp[i-1][0]*num1%mod+dp[i-1][1]*num0%mod)%mod+dp[i-1][2]*num2%mod)%mod;dp[i][2]=((dp[i-1][0]*num2%mod+dp[i-1][1]*num1%mod)%mod+dp[i-1][2]*num0%mod)%mod;}cout<<dp[n][0]<<endl;return 0;
}

 

 

 

D. Kilani and the Game

 

题目大意:给出一个n*m的地图,最多9个人,每个人至少含有一个城堡,同时有每个人的扩张速度,即可以连续扩张的次数,现在从1-n轮流从各自的城堡开始扩张,不可通过障碍,求整个地图被扩张完成后,各个人所占领城堡的数目。

Examples
input
3 3 2
1 1
1..
...
..2
output
6 3

解题思路:开始就是想bfs嵌套,先把每一个玩家从1-n的城堡压入第一个队列,再每次把第一个队列的第一个元素弹出,压入第二个队列继续进行bfs,,一直不知道哪里错了,看了别人博客后才发现那样是错的,如果那样做的话,对于这个样例是过不了的:

4 3 2
2 1
1..
1..
..2
...
如果那样做可能会输出9 3,而正确答案是10 2。
正确做法应该是每次将第一个队列相同编号的城堡压入到第二个队列,然后再对第二个队列进行bfs,这样就不会出现上面那种情况了
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<string>
#include<set>
#include<cmath>
#include<list>
#include<deque>
#include<cstdlib>
#include<bitset>
#include<stack>
#include<map>
#include<queue>
using namespace std;
typedef long long ll;
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define pushup() tree[rt]=tree[rt<<1]+tree[rt<<1|1]
const int INF=0x3f3f3f3f;
const double PI=acos(-1.0);
const double eps=1e-6;
const ll mod=1e9+7;
const int maxn=100005;
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
const int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
struct node{int x,y,id;node(int a,int b,int c):x(a),y(b),id(c){}
};
struct node1{int x,y,id,steps;node1(int a,int b,int c,int d):x(a),y(b),id(c),steps(d){}
};
int n,m,sump,s[10];
vector<node> p[10];
char mp[1050][1050];
queue<node> que;
queue<node1> que1;
void BFS()
{while(que.size()){node tmp=que.front();int id=tmp.id;que1.push(node1(tmp.x,tmp.y,tmp.id,0));while(que.size()&&que.front().id==id)  //判断第一个队列元素是否为当前压入队列是同一个玩家
        {que1.push(node1(que.front().x,que.front().y,que.front().id,0));que.pop();}while(que1.size()){node1 now=que1.front();que1.pop();if(now.steps==s[now.id]){que.push(node(now.x,now.y,now.id)); //走到最后一步继续压入第一个队列continue;}for(int i=0;i<4;i++){int dx=now.x+dir[i][0];int dy=now.y+dir[i][1];if(dx>=0&&dx<n&&dy>=0&&dy<m&&mp[dx][dy]=='.'){mp[dx][dy]='0'+now.id;que1.push(node1(dx,dy,now.id,now.steps+1));}}}}
}
int main()
{ios::sync_with_stdio(false); cin.tie(0);cin>>n>>m>>sump;for(int i=1;i<=sump;i++) cin>>s[i];for(int i=0;i<n;i++){for(int j=0;j<m;j++){cin>>mp[i][j];if(mp[i][j]>='0'&&mp[i][j]<='9')p[mp[i][j]-'0'].push_back(node(i,j,mp[i][j]-'0'));  //同一个玩家的城堡压入同一个向量里
        }}for(int i=1;i<=sump;i++)for(int j=0;j<p[i].size();j++)que.push(p[i][j]);BFS();int ans[10];memset(ans,0,sizeof(ans));for(int i=0;i<n;i++)for(int j=0;j<m;j++)for(int k=1;k<=sump;k++)if(mp[i][j]==(k+'0'))ans[k]++;cout<<ans[1];for(int i=2;i<=sump;i++)cout<<" "<<ans[i];cout<<endl;return 0;
}

 

转载于:https://www.cnblogs.com/zjl192628928/p/10303329.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/463613.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++并发编程之原子操作的实现原理

原子(atomic)本意是”不能被进一步分割的最小粒子”,而原子操作(atomic operation)意为”不可被中断的一个或一系列操作”. 处理器如何实现原子操作 (1) 使用总线锁保证原子性 如果多个处理器同时对共享变量进行读写操作,那么共享变量就会被多个处理器同时进行操作,这样读写…

Sqlserver 通用存储过程(二) 联合主键

CREATEPROCP_public_ViewPage /**//**//**//* no_mIss 通用分页存储过程 2007.3.1 QQ:34813284 适用于联合主键/单主键/存在能确定唯一行列/存在能确定唯一行的多列 (用英文,隔开) 调用&#xff1a; 第一页查询时返回总记录和总页数及第一…

PHP定时执行任务的实现

此代码只要运行一次后关闭浏览器即可。 ignore_user_abort();//关掉浏览器&#xff0c;PHP脚本也可以继续执行.set_time_limit(0);// 通过set_time_limit(0)可以让程序无限制的执行下去$interval60*30;// 每隔半小时运行do{//这里是你要执行的代码sleep($interval);// 等待5分钟…

预检请求

不久前在公司写了一个基于 Hapijs 的后端项目&#xff0c;感觉这个框架很有自己的特点&#xff0c;跟 Express 和 Koa 的区别比较大&#xff0c;体现了配置大于编码的思想。用起来很方便&#xff0c;据说 Walmart 团队用这个框架扛住了黑五的流量&#xff0c;看起来在实际项目中…

linux编译动态库之-fPIC

在生成动态库时&#xff0c;常常习惯性的加上fPIC选项&#xff0c;fPIC有什么作用和意义&#xff0c;加不加有什么区别&#xff0c;这里做下小结&#xff1a; fPIC的全称是 Position Independent Code&#xff0c; 用于生成位置无关代码。什么是位置无关代码&#xff0c;个人理…

深入理解golang 的栈

线程栈(thread stacks)介绍 先回顾下linux的内存空间布局 简书_stack02.png当启动一个C实现的thread时&#xff0c;C标准库会负责分配一块内存作为这个线程的栈。标准库分配这块内存&#xff0c;告诉内核它的位置并让内核处理这个线程 的执行。在linux系统中&#xff0c;可通过…

const和define的区别

今天查看以前的代码&#xff0c;进行优化&#xff0c;回想到const和define一些区别&#xff0c;记录下来。 1.const是关键字&#xff0c;define不是关键字。 2.const定义的是只读变量&#xff0c;不是常量&#xff0c;define宏定义的是常量&#xff0c;变量不能作为定义数组的维…

理解ALSA

最近处理音频的问题&#xff0c;所以看了一些不错的文章&#xff0c;整理一些有用的资料出来&#xff0c;有需要的可以收藏。ALSA的框架图&#xff1a;这个图可以说是我目前看到最不错的&#xff0c;我发现很多应用开发的&#xff0c;一出现解决不了的问题&#xff0c;或者奇怪…

Xshell 6如何设置多个session显示在同一个窗口

刚才安装了Xshell 6之后&#xff0c;发现在同一个窗口只能显示4个session&#xff0c;网上查找了一些资料但是都不是想要的结果&#xff0c;经过几分钟的查找&#xff0c;终于找到了设置在同一个窗口session的个数&#xff0c;因此记录下来&#xff0c;或者给与他人帮助。以下以…

appium+java(五)微信小程序自动化测试实践

前言&#xff1a; 上一篇《appiumjava&#xff08;四&#xff09;微信公众号自动化测试实践》中&#xff0c;尝试使用appium实现微信公众号自动化测试&#xff0c;接着尝试小程序自动化&#xff0c;以学院小程序为例 准备工作 1、java-client 3.4.16依赖包 2、微信应用版本7.0.…

blockUI应用到Asp.Net页面时服务器控件(Button等)失效的问题

问题&#xff1a;在Asp.Net页面中用blockUI这个控件实现弹出窗口的效果&#xff0c;弹出页面内容为页面中某个Panel中的内容&#xff0c;包含TextBox、Button等服务器控件。使用时就简单的设置message属性。问题出来了&#xff0c;当显示这个弹出页面后&#xff0c;所有Button等…

android DatePicker

为什么80%的码农都做不了架构师&#xff1f;>>> public class DatePicker extends FrameLayout java.lang.Object android.view.View android.view.ViewGroup android.widget.FrameLayout android.widget.DatePicker DatePicker 一个选择年月日的日历布局视图 公…

一次限制进程的 CPU 用量的实操过程

大家好&#xff0c;我是飞哥&#xff01;给大家分享一个事情。背景是这样的&#xff0c;我们要测试某个第三方 SDK 运行性能&#xff0c;这是个 CPU 密集型的服务。我想评估一下它运行一遍到底有多吃 CPU&#xff0c;以便评估上线后我们需要部署多少台服务器。我们是在一台 16 …

map与unordered_map的区别

set/map底层实现的机制是红黑树。红黑树是一种近似于平衡的二叉查找树&#xff0c;默认是按升序排序的。在红黑树上做查找、插入、删除操作的时间复杂度为O(logN)。 红黑树的缺点&#xff1a;空间占用率高&#xff0c;每一个节点都需要额外保存父节点、孩子节点和红/黑性质&am…

navicat不同数据库数据传输

复制fo的t_fo_account表结构和数据到base库 结果 转载于:https://www.cnblogs.com/feifeicui/p/10307646.html

Win2003 IIS下,ASP.NET无法访问数据库和网页

1.Win2003 IIS下,ASP.NET无法访问网页 将IIS的 允许ASP 设置为允许. 2.Win2003 IIS下,ASP.NET无法访问数据库(这里我用的是Oracle9i) 1)将网站的虚拟目录 添加 ASP.NET 和 NETWORK_SERVICE用户. 2)oracle目录下ora92目录的Authenticateduser用户 去掉勾中的权限 再勾上权限. 最…

FTP自动上传日期命名文件

说明&#xff1a;此文章是从http://177048.blog.51cto.com/167048/919374转载过来的&#xff0c;若有侵权之处&#xff0c;请联系本人&#xff0c;及时删除&#xff0c;谢谢&#xff01; 需求&#xff1a;将每天备份的数据以当天日期命名&#xff0c;并定时上传到FTP服务器上。…

收藏了两年的嵌入式AI资源学习笔记,今天全分享给大家(附代码/资料/视频/学习规划)...

当前乃至未来5-10年&#xff0c;嵌入式开发者还有哪些风口&#xff1f;”画外音&#xff1a;风口的本质&#xff0c;其实就是一段时间的人才供需不平衡。说白了就是由于行业突变&#xff0c;敏锐的资本快速进入&#xff0c;导致短时间内行业大量扩张&#xff0c;需要大量开发者…

gcc -O0 -O1 -O2 -O3 四级优化选项及每级分别做什么优化

今天看到了一篇文章&#xff0c;写的挺好就将其转载&#xff0c; https://blog.csdn.net/zhangzq86/article/details/80840927 Gcc 编译优化简介 gcc 提供了为了满足用户不同程度的的优化需要&#xff0c;提供了近百种优化选项&#xff0c;用来对{编译时间&#xff0c;目标文…

Vmware由于centos升级内核不可运行(C header files matching your running kernel were not found)的解决方案...

C header files matching your running kernel were not found. Refer to your distributions documentation for installation instructions - NoH4cker - 博客园 http://www.cnblogs.com/NoH4cker/p/4840571.html centos6 安装wmwaretools找不到kernel header - jiejnan - 博…