Codeforces Round #533 (Div. 2)
C:
题意:
有n个整数ai,数列a有两个神奇的性质。1.所有的整数都在[l,r]范围内。2.这n个数的和能被3整除。现在给出l和r,和个数n,问你有多少种方法构造出数列a,方案数mod1e9+7.
题解:
一个数被3除只有三种可能。1.整除,2.余1,2.余2.
然后我们再想这个问题,[l,r]区间内,能被3整除的数有多少?a0=r/3-l/3。余1/2的数有多少?a1/2=((r-l+1)-a0)/2.(这里具体余1和余2不重要,想想为什么)
我们设f[i][j]为前i个数,和除3余j的方案数。怎么转移呢。
f[i][0]=f[i-1][1]*a2+f[i-1][2]*a1+f[i-1][0]*a0.
f[i][1]=f[i-1][0]*a1+f[i-1][1]*a0+f[i-1][2]*a2.
f[i][2]=f[i-1][0]*a2+f[i-1][1]*a1+f[i-1][2]*a0.
#include<stdio.h>
#include<iostream>
using namespace std; long long dp[][];
const long long mod=;
int main(){
int n,l,r;
cin>>n>>l>>r;
long long a0,a1,a2;
long long sum=r-l+;
a0=r/-(l-)/;
sum-=a0;
a1=sum/;
a2=sum-a1 ;
dp[][]=a0;
dp[][]=a1;
dp[][]=a2;
for(int i=;i<=n;i++)
{
dp[i][]=(dp[i-][]*a2+dp[i-][]*a0+dp[i-][]*a1)%mod;
dp[i][]=(dp[i-][]*a0+dp[i-][]*a1+dp[i-][]*a2)%mod;
dp[i][]=(dp[i-][]*a1+dp[i-][]*a2+dp[i-][]*a0)%mod;
}
printf("%I64d\n",dp[n][]); }
D.题意
kilani正在和朋友们玩一个游戏,这个游戏在一个n*m的网格上,每个格子要么是空白,要么是已经被占领,每个玩家有一个或者多个城堡。每个玩家轮流进行游戏。对于玩家i,他可以从一个已有的城堡向一个空白的格子扩建一个城堡,如果这个空白的格子和它的曼哈顿距离不超过s[i]。
求游戏结束后每个玩家占领的格子数量。
题解:
一个多源bfs。具体可以看代码
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <queue> #define pir pair<int,int>
#define mkp make_pair
using namespace std;
const int maxn=+;
const int dx[]={,,,-};
const int dy[]={,-,,}; int n,m,p;
int a[],ans[];
char G[maxn][maxn];
int vis[maxn][maxn];
struct Node{
int x,y,p;
};
int main(){
scanf("%d%d%d",&n,&m,&p);
for(int i=;i<=p;i++){
scanf("%d",&a[i]);
}
queue<pir>q;
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
scanf(" %c",&G[i][j]);
}
}
for(int k=;k<=p;k++){
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
// scanf(" %c",&G[i][j]);
if(G[i][j]!='.'&&G[i][j]!='#'&&G[i][j]-''==k){
vis[i][j]=k;
q.push(mkp(i,j));
}
}
}
} while(!q.empty()){
pir u=q.front();q.pop();
int x=u.first,y=u.second;
int num=vis[x][y];
queue<Node>q2;
q2.push({x,y,a[num]});
while(!q.empty()){
pir u1=q.front();
if(vis[u1.first][u1.second]==num){
q.pop();
q2.push({u1.first,u1.second,a[num]});
}else{
break;
}
} while(!q2.empty()){
Node u1=q2.front();q2.pop();
if(u1.p<=)continue;
for(int k=;k<;k++){
int nx=u1.x+dx[k];
int ny=u1.y+dy[k];
if(nx>=&&nx<=n&&ny>=&&ny<=m&&G[nx][ny]=='.'&&vis[nx][ny]==){
vis[nx][ny]=num;
q2.push({nx,ny,u1.p-});
q.push(mkp(nx,ny));
}
}
} } for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
if(vis[i][j]){
ans[vis[i][j]]++;
//printf("%d ",vis[i][j]);
}
}
//printf("\n");
} for(int i=;i<=p;i++){
printf("%d ",ans[i]);
}
return ;
}
E. Helping Hiasat
题意:
Hiasat有一个社交账号,当他的朋友们每次来看他社交首页的时候,如果他首页的名字是这个朋友的名字,他朋友就会很开心。给出一个序列代表可以修改名字的时间和朋友们来访问的顺序,问如何修改才能让开心的朋友们最多。
题解:
显然在两次修改之间的所有访问,只能满足一次。那么其实很显然,将这些点之间连边,然后求图的最大独立集。然后最大独立集怎么求?求补图中的最大团。最大团怎么求?套板子啊!!
include <bits/stdc++.h>
using namespace std;
const int maxn = ;
bool mp[maxn][maxn];
int num[maxn], group[maxn], now[maxn];
int n, m, ans;
bool dfs(int u, int cnt)
{
int i, j;
for(i = u+; i <= n; ++i)
{
if(num[i]+cnt <= ans) return false; //��֦3
if(mp[u][i])
{
for(j = ; j < cnt; ++j)
if(!mp[i][now[j]]) break;
if(j == cnt) //��
{
now[cnt] = i;
if(dfs(i, cnt+)) return true;
}
}
}
if(cnt > ans)
{
for(i = ; i < cnt; ++i)
group[i] = now[i];
ans = cnt;
return true;
}
return false;
} int MaximumClique()
{
ans = -;
for(int i = n; i >= ; --i)
{
now[] = i;
dfs(i, );
num[i] = ans;
}
return ans;
}
map<string,int>Name;
int name_num;
int N,M;
int G[maxn][maxn]; int main()
{
scanf("%d%d",&N,&M);
vector<int>per;
set<int>S;
for(int i=;i<=N;i++){
int type;
scanf("%d",&type);
if(type==){
per.clear();
S.clear();
}else{
string name;
cin>>name;
if(!Name.count(name)){
Name[name]=++name_num;
}
if(!S.count(Name[name])){
S.insert(Name[name]);
for(int i=;i<per.size();i++){
int u=per[i];
G[u][Name[name]]=;
G[Name[name]][u]=;
}
per.push_back(Name[name]);
}
}
}
n=name_num;
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
mp[i][j]=!G[i][j];
}
}
printf("%d\n",MaximumClique());
// while(cin >> n && n)
// {
// for(int i = 1; i <= n; ++i)
// for(int j = 1; j <= n; ++j)
// {
// int x; cin >> x;
// mp[i][j] = x;
// }
// cout << MaximumClique() << endl;
// }
return ;
}
Codeforces Round #533 (Div. 2)的更多相关文章
- Codeforces Round #533 (Div. 2)题解
link orz olinr AK Codeforces Round #533 (Div. 2) 中文水平和英文水平都太渣..翻译不准确见谅 T1.给定n<=1000个整数,你需要钦定一个值t, ...
- Codeforces Round #533 (Div. 2) C.思维dp D. 多源BFS
题目链接:https://codeforces.com/contest/1105 C. Ayoub and Lost Array 题目大意:一个长度为n的数组,数组的元素都在[L,R]之间,并且数组全 ...
- 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 #533 (Div. 2) B. Zuhair and Strings 【模拟】
传送门:http://codeforces.com/contest/1105/problem/B B. Zuhair and Strings time limit per test 1 second ...
- Codeforces Round #533(Div. 2) C.Ayoub and Lost Array
链接:https://codeforces.com/contest/1105/problem/C 题意: 给n,l,r. 一个n长的数组每个位置可以填区间l-r的值. 有多少种填法,使得数组每个位置相 ...
- Codeforces Round #533(Div. 2) D.Kilani and the Game
链接:https://codeforces.com/contest/1105/problem/D 题意: 给n*m的地图,最多9个人,同时有每个人的扩张次数(我开始以为是直线扩张最大长度..实际是能连 ...
- Codeforces Round #533(Div. 2) B.Zuhair and Strings
链接:https://codeforces.com/contest/1105/problem/B 题意: 给一个字符串和k,连续k个相同的字符,可使等级x加1, 例:8 2 aaacaabb 则有aa ...
- Codeforces Round #533(Div. 2) A.Salem and Sticks
链接:https://codeforces.com/contest/1105/problem/A 题意: 给n个数,找到一个数t使i(1-n)∑|ai-t| 最小. ai-t 差距1 以内都满足 思路 ...
- Codeforces Round #533 (Div. 2) E. Helping Hiasat(最大独立集)
题目链接:https://codeforces.com/contest/1105/problem/E 题意:有 n 个事件,op = 1 表示我可以修改昵称,op = 2 表示一个名为 s_i 的朋友 ...
- Codeforces Round #533 (Div. 2) D. Kilani and the Game(BFS)
题目链接:https://codeforces.com/contest/1105/problem/D 题意:p 个人在 n * m 的地图上扩展自己的城堡范围,每次最多走 a_i 步(曼哈顿距离),按 ...
随机推荐
- Mysql-binlog的移动和归档
#!/bin/bash # To backup and archive binlogs. declare -i NUM=0 declare -i SUM=0 SUM=`/bin/ls -l mysql ...
- 关于json_encode()的使用注意
json_encode($json_str,true)在一般情况下可以返回一个数组,但当$json_str的字符编码是GBK或其它时,返回的是一个 空数组,必须用iconv(‘gbk’,‘ut8//I ...
- 【洛谷】P1357 花园(状压+矩阵快速幂)
题目 传送门:QWQ 分析 因为m很小,考虑把所有状态压成m位二进制数. 那么总状态数小于$ 2^5 $. 如果状态$ i $能转移到$ j $,那么扔进一个矩阵,n次方快速幂一下. 答案是对角线之和 ...
- no_unnest,push_subq,push_pred的用法 (转)
常常有人把这三个hint搞混,主要是因为对三种重写原理不清楚.特总结如下.(实验环境为10204)1. no_unnest, unnestunnest我们称为对子查询展开,顾名思义,就是别让子查询孤单 ...
- 批处理框架-spring Batch
并发处理业务 数据量大,并发度高,要支持事物,回滚,并发机制.事务.并发.监控.执行等,并不提供相应的调度功能.因此,如果我们希望批处理任务定期执行,可结合 Quartz 等成熟的调度框架实现. 业务 ...
- CSS border边框属性教程(color style)
CSS 边框即CSS border-border边框样式颜色.边框样式.边框宽度的语法结构与应用案例教程篇 一.CSS 边框基础知识 CSS 边框即CSS border是控制对象的边框边线宽度.颜色. ...
- python中os常用方法
python中OS常用方法 Python的标准库中的os模块包含普遍的操作系统功能.如果你希望你的程序能够与平台无关的话,这个模块是尤为重要的.即它允许一个程序在编写后不需要任何改动,也不会发生任何问 ...
- Spark Streaming 例子
NetworkWordCount.scala /* * Licensed to the Apache Software Foundation (ASF) under one or more * con ...
- 面对最菜TI战队,OpenAI在Dota2上输的毫无还手之力
作者:Tony Peng 去年,OpenAI 的 1v1 AI 击败了世界顶尖选手 Dendi,OpenAI CTO Greg Brockman 承诺:明年,我们会带着 5v5 的 AI bot 重回 ...
- POI实现EXCEL单元格合并及边框样式
POI实现EXCEL单元格合并及边框样式 下面例子为创建产生一个excel,合并单元格,然后为合并后的单元格添加边框 package test; import java.io.FileOutp ...