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-;
const ll mod=1e9+;
const int maxn=;
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[][];
ll n,l,r;
int main()
{
ios::sync_with_stdio(false); cin.tie();
cin>>n>>l>>r;
ll num0=r/-(l-)/;
ll num1=num0;
ll num2=num0;
int i,j;
for(i=l;i<=r;i++)
{
if(i%==)break;
else if(i%==)num1++;
else num2++;
}
for(j=r;j>=i;j--)
{
if(j%==)break;
else if(j%==)
{
num2--; break;
}
else if(j%==)
{
num1--; num2--;
break;
}
}
dp[][]=num0; dp[][]=num1; dp[][]=num2;
for(int i=;i<=n;i++)
{
dp[i][]=((dp[i-][]*num0%mod+dp[i-][]*num2%mod)%mod+dp[i-][]*num1%mod)%mod;
dp[i][]=((dp[i-][]*num1%mod+dp[i-][]*num0%mod)%mod+dp[i-][]*num2%mod)%mod;
dp[i][]=((dp[i-][]*num2%mod+dp[i-][]*num1%mod)%mod+dp[i-][]*num0%mod)%mod;
}
cout<<dp[n][]<<endl;
return ;
}
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,,一直不知道哪里错了,看了别人博客后才发现那样是错的,如果那样做的话,对于这个样例是过不了的:
2 1
1..
1..
..2
...
#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-;
const ll mod=1e9+;
const int maxn=;
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[][]={{,},{-,},{,},{,-}};
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[];
vector<node> p[];
char mp[][];
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,));
while(que.size()&&que.front().id==id) //判断第一个队列元素是否为当前压入队列是同一个玩家
{
que1.push(node1(que.front().x,que.front().y,que.front().id,));
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=;i<;i++){
int dx=now.x+dir[i][];
int dy=now.y+dir[i][];
if(dx>=&&dx<n&&dy>=&&dy<m&&mp[dx][dy]=='.'){
mp[dx][dy]=''+now.id;
que1.push(node1(dx,dy,now.id,now.steps+));
}
}
}
}
}
int main()
{
ios::sync_with_stdio(false); cin.tie();
cin>>n>>m>>sump;
for(int i=;i<=sump;i++) cin>>s[i];
for(int i=;i<n;i++){
for(int j=;j<m;j++){
cin>>mp[i][j];
if(mp[i][j]>=''&&mp[i][j]<='')
p[mp[i][j]-''].push_back(node(i,j,mp[i][j]-'')); //同一个玩家的城堡压入同一个向量里
}
}
for(int i=;i<=sump;i++)
for(int j=;j<p[i].size();j++)
que.push(p[i][j]);
BFS();
int ans[];
memset(ans,,sizeof(ans));
for(int i=;i<n;i++)
for(int j=;j<m;j++)
for(int k=;k<=sump;k++)
if(mp[i][j]==(k+''))
ans[k]++;
cout<<ans[];
for(int i=;i<=sump;i++)
cout<<" "<<ans[i];
cout<<endl;
return ;
}
Codeforces Round #533 (Div. 2) C.思维dp D. 多源BFS的更多相关文章
- Codeforces Round #533 (Div. 2) D. Kilani and the Game(BFS)
题目链接:https://codeforces.com/contest/1105/problem/D 题意:p 个人在 n * m 的地图上扩展自己的城堡范围,每次最多走 a_i 步(曼哈顿距离),按 ...
- Codeforces Round #533 (Div. 2)题解
link orz olinr AK Codeforces Round #533 (Div. 2) 中文水平和英文水平都太渣..翻译不准确见谅 T1.给定n<=1000个整数,你需要钦定一个值t, ...
- Codeforces Round #533 (Div. 2)
C: 题意: 有n个整数ai,数列a有两个神奇的性质.1.所有的整数都在[l,r]范围内.2.这n个数的和能被3整除.现在给出l和r,和个数n,问你有多少种方法构造出数列a,方案数mod1e9+7. ...
- Codeforces Round #533 (Div. 2) 部分题解A~D
A. Salem and Sticks 题目描述 Salem gave you n n n sticks with integer positive lengths a1,a2,…,an a_1, a ...
- 【CF1256】Codeforces Round #598 (Div. 3) 【思维+贪心+DP】
https://codeforces.com/contest/1256 A:Payment Without Change[思维] 题意:给你a个价值n的物品和b个价值1的物品,问是否存在取物方案使得价 ...
- Codeforces Round #533 (Div. 2) C. Ayoub and Lost Array 【dp】
传送门:http://codeforces.com/contest/1105/problem/C C. Ayoub and Lost Array time limit per test 1 secon ...
- Codeforces Round #105 (Div. 2) E. Porcelain —— DP(背包问题)
题目链接:http://codeforces.com/problemset/problem/148/E E. Porcelain time limit per test 1 second memory ...
- Codeforces Round #131 (Div. 1) B. Numbers dp
题目链接: http://codeforces.com/problemset/problem/213/B B. Numbers time limit per test 2 secondsmemory ...
- Codeforces Round #131 (Div. 2) B. Hometask dp
题目链接: http://codeforces.com/problemset/problem/214/B Hometask time limit per test:2 secondsmemory li ...
随机推荐
- Java 异常处理的误区和经验总结
Java 异常处理的误区和经验总结 1 本文着重介绍了 Java 异常选择和使用中的一些误区,希望各位读者能够熟练掌握异常处理的一些注意点和原则,注意总结和归纳.只有处理好了异常,才能提升开发人员 ...
- [转帖]Docker的daemon.json的作用
Docker(十六)-Docker的daemon.json的作用 https://www.cnblogs.com/zhuochong/p/10070434.html jfrog 培训的时候 说过这个地 ...
- windows 安装tensorflow
原文知乎:https://zhuanlan.zhihu.com/p/25778703 前言 看到Rstudio中开始支持Tensorflow,本人是欣喜若狂的,同时TensorFlow官网从16年9月 ...
- 用dbExpress页的SQLConnection1连接sql server2000怎么设置。 [问题点数:0分]
在d7或者c6已经支持了. 贡献一下我的代码吧:dbeConn:= TSQLConnection.Create(nil); dbeConn.Params.Clear; dbeC ...
- Java使用RabbitMQ之消息确认(confirm模板)
RabbitMQ生产者消息确认Confirm模式,分为普通模式.批量模式和异步模式,本次举例为普通模式. 源码: package org.study.confirm4; import com.rabb ...
- php2
session //将用户的会话数据存储在服务端,通过 session_start()开启session,通过$_SESSION读写session session_start(); //开启ses ...
- Lodop连续打印内容逐渐偏移怎么办
Lodop打印控件中,可以使用打印机自带的纸张名称,也可以自定义纸张.(SET_PRINT_PAGESIZE语句).通常进行打印开发,为了避免浪费纸张,会用虚拟打印机效果作为依据,虚拟打印机连续打印多 ...
- darknet源码解析
https://blog.csdn.net/u014540717/article/category/6513159
- default配置页面一级菜单用于进入二级菜单
- codeforces158D
Ice Sculptures CodeForces - 158D The Berland University is preparing to celebrate the 256-th anniver ...