[NowCoder]牛客OI周赛3
A.地斗主
题意:\(4\times N\) 的地板,在上面铺 \(1\times 2\) 和 \(2\times 1\) 的地砖,求铺满方案数, \(N\le 10^9\)
原题。。先把一列的状态压缩成二进制,这一格为1就表示这一格被左边一列横着占用了
为0表示没被左边占用(放了竖着的或者没放都是一样的)
可以推出一系列转移,最后发现有用状态只有6个,有两个方案数总是一样,可以合并
因此用矩阵乘法加速递推即可
#include<bits/stdc++.h>
#define REP(i,a,b) for(int i(a);i<=(b);++i)
using namespace std;
typedef long long ll;
inline int read(){char c,p=0;int w;
while(isspace(c=getchar()));if(c=='-')p=1,c=getchar();
for(w=c&15;isdigit(c=getchar());w=w*10+(c&15));return p?-w:w;
}
int n,m;
struct mat{
int v[5][5];
mat(){memset(v,0,sizeof v);}
inline int*operator[](const int&i){return v[i];}
inline mat operator*(mat&r){
mat ans;REP(k,0,4)REP(i,0,4)REP(j,0,4)
ans[i][j]=(ans[i][j]+1ll*v[i][k]*r[k][j])%m;
return ans;
}
}A,B,C;
inline mat fpow(mat x,int k){
mat r;REP(i,0,4)r[i][i]=1;
for(;k;k>>=1,x=x*x)if(k&1)r=r*x;return r;
}
int main(){
A[0][0]=A[0][1]=A[0][4]=1;A[0][2]=2;
A[1][0]=A[2][0]=1,A[2][2]=1,A[3][4]=1,
A[4][0]=A[4][3]=1;
B[0][0]=1;
int T=read();
while(T--){
n=read(),m=read();
C=fpow(A,n)*B;
io.print(C[0][0]);
}
return 0;
}
B.1048
题意:\(N\) 个白球和 \(N\) 个黑球,每个都以 \(1\dots N\) 标号,现在给出每个球的颜色和标号,要求用最少的步数邻项交换,使得白球是有序的,黑球也是有序的,\(N\le 2000\)
由邻项交换可以想到冒泡排序,冒泡排序的最小交换次数是逆序对,考虑DP
设 \(f[i][j]\) 表示 已经排了前 \(i\) 个白球,前 \(j\) 个黑球(都在最前面)的最小代价。
若用 \(i\) 转移,则代价是 在 \(i\) 前面,比 \(i\) 大的白球数目 和 在 \(i\) 前面, 比 \(j\) 大的黑球数目,简单起见用 \(c1[i]\) 表示;同理,若用 \(j\) 转移,代价是 \(c2[j]\)
\]
#include<bits/stdc++.h>
#define REP(i,a,b) for(int i(a);i<=(b);++i)
#define dbg(...) fprintf(stderr,__VA_ARGS__)
using namespace std;
template<typename T,typename U>inline char smin(T&x,const U&y){return x>y?x=y,1:0;}
template<typename T,typename U>inline char smax(T&x,const U&y){return x<y?x=y,1:0;}
const int N=2005;
int n,f[N][N],p[2][N],cnt[2][N<<1][N];
int main(){
scanf("%d",&n);
REP(i,1,n<<1){
char c;int x;scanf("%s%d",&c,&x);
p[c=='B'][x]=i;
REP(j,i,n<<1)++cnt[c=='B'][j][x];
}
REP(k,0,1)REP(i,1,n<<1)for(int j=n;~j;--j)cnt[k][i][j]+=cnt[k][i][j+1];
REP(i,0,n)REP(j,0,n){
if(i||j)f[i][j]=1e9;
if(i)smin(f[i][j],f[i-1][j]+cnt[1][p[0][i]-1][j+1]+cnt[0][p[0][i]-1][i+1]);
if(j)smin(f[i][j],f[i][j-1]+cnt[0][p[1][j]-1][i+1]+cnt[1][p[1][j]-1][j+1]);
}
cout<<f[n][n];
return 0;
}
C.爆瓶子
题意:你有 \(N\) 种瓶子每种 \(N\) 个,需要把它排成 \(N\times N\) 的方阵,要求每行每列不能有相同瓶子,输出字典序最小的方案 \(N \le 220\)
垃圾题,跟着数据卡数据范围,暴力二分图匹配
一行一行进行二分图匹配,匹配了就把对应的边删掉,得出一组匹配后再看能不能和前面交换得到字典序更小的匹配
#include<bits/stdc++.h>
#define REP(i,a,b) for(int i(a);i<=(b);++i)
using namespace std;
inline int read(){char c,p=0;int w;
while(isspace(c=getchar()));if(c=='-')p=1,c=getchar();
for(w=c&15;isdigit(c=getchar());w=w*10+(c&15));return p?-w:w;
}
const int N=225;
int n,m,head[N],pre[N][N],nxt[N][N],vis[N],T,bel[N],to[N];
inline void del(int i,int j){
if(j==head[i])head[i]=nxt[i][j];
else pre[i][nxt[i][j]]=pre[i][j],nxt[i][pre[i][j]]=nxt[i][j];
}
inline bool dfs(int x,int lim){
for(int i=head[x];i;i=nxt[x][i])if(vis[i]!=T){
vis[i]=T;
if(!bel[i]||bel[i]>lim&&dfs(bel[i],lim))
return to[x]=i,bel[i]=x,1;
}
return 0;
}
inline void solve(){
REP(i,1,n)++T,dfs(i,0);
REP(i,1,n){
++T;
for(int j=head[i];j;j=nxt[i][j]){
if(bel[j]==i)break;
if(bel[j]<i)continue;
int x=bel[j],y=to[i];
to[i]=j,bel[j]=i,to[x]=bel[y]=0;
if(dfs(x,i))break;
to[x]=j,bel[j]=x,to[i]=y,bel[y]=i;
}
}
}
int main(){
int t=read();
while(t--){
n=read();m=read();
REP(i,1,n){
REP(j,1,n)pre[i][j]=j-1,nxt[i][j]=j+1;nxt[i][n]=0;head[i]=1;
}
REP(i,1,m)REP(j,1,n)del(j,read());
REP(i,m+1,n){
memset(to,0,sizeof to);
memset(bel,0,sizeof bel);
memset(vis,0,sizeof vis);
T=0,solve();
REP(j,1,n)del(j,to[j]),printf("%d ",to[j]);puts("");
}
}
return 0;
}
[NowCoder]牛客OI周赛3的更多相关文章
- [NowCoder]牛客OI周赛1 题解
A.分组 首先,认识的人不超过3个,因此不存在无解的方案 考虑直接构造,先把所有点设为1,顺序扫一遍把有问题的点加入队列 每次取队头,将其颜色取反,再更新有问题的点 复杂度:考虑到每个点不会操作2次, ...
- 牛客OI周赛8-提高组A-用水填坑
牛客OI周赛8-提高组A-用水填坑 题目 链接: https://ac.nowcoder.com/acm/contest/403/A 来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制: ...
- 牛客OI周赛9-提高组题目记录
牛客OI周赛9-提高组题目记录 昨天晚上做了这一套比赛,觉得题目质量挺高,而且有一些非常有趣而且非常清奇的脑回路在里边,于是记录在此. T1: 扫雷 题目链接 设 \(f_i\) 表示扫到第 \(i\ ...
- 牛客OI周赛7-提高组 A 小睿睿的等式
链接:https://ac.nowcoder.com/acm/contest/371/A来源:牛客网 小睿睿在游戏开始时有n根火柴棒,他想知道能摆成形如“A+B=n”的等式且使用的火柴棒数也恰好等于n ...
- 牛客OI周赛7-提高组 B小睿睿的询问(ST打表)
链接:https://ac.nowcoder.com/acm/contest/371/B来源:牛客网 小睿睿的n个妹纸排成一排,每个妹纸有一个颜值val[i].有m个询问,对于每一个询问,小睿睿想知道 ...
- 牛客OI周赛2-提高组
A.游戏 链接:https://www.nowcoder.com/acm/contest/210/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语 ...
- 牛客OI周赛10-普及组-A眼花缭乱的街市-(加速+二分)
https://ac.nowcoder.com/acm/contest/901/A 很简单的一道题,全场只有20+AC,卡时间.新学了cin加速语法和数组二分查找的函数调用. 知道有个读写挂,可以加速 ...
- 牛客OI周赛11-普及组 B Game with numbers (数学,预处理真因子)
链接:https://ac.nowcoder.com/acm/contest/942/B 来源:牛客网 Game with numbers 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C+ ...
- 牛客OI周赛7-普及组 解题报告
出题人好评. 评测机差评. A 救救喵咪 二位偏序.如果数据范围大的话直接树状数组,不过才1000就\(O(n^2)\)暴力就ok了. #include <bits/stdc++.h> s ...
随机推荐
- WHU 1542 Countries (floyd)
题意: 在小明出生的星球X上有n国家. 一些国家通过结盟而拥有良好的双边关系,因此他们的公民得益于这些政策,使得所有这些国家之间的旅行变得免费. 但是,不同联盟之间的旅行就不是这么容易了.如果可能,它 ...
- WAS集群系列(5):集群搭建:步骤3:安装IHS软件
选择"安装IBM HTTPServer"选项,点击"安装向导".例如以下图提示: 安装提示,逐步点击"下一步",当中偶有几处细节注意就可以. ...
- 翻翻git之---炫酷的自己定义翻滚View TagCloudView
转载请注明出处:王亟亟的大牛之路 周一好,又到了每周最困的一天.近期都被啮齿类动物搞的累死,废话不多,今天上一个自己定义的ViewGroup实现一个3D球形集合. 效果图: 效果还不错,能够作为短小文 ...
- android 聊天室窗体
public class MainActivity extends Activity { ScrollView scrollView; Button button; LinearLayout layo ...
- quartz 持久化 数据库表
此处只包括配置数据库操作 quartz 持久化数据库表格字段解释建表,SQL语句在dbTables文件夹中可以找到,介绍下我们开发主要使用到的表: (版本不一样,可能数据库表也不一样,这里使用2.2. ...
- 【实用篇】Android之应用程序实现自动更新功能
我个人用的是友盟提供的自动更新组件,因此在这里只描述如何实用友盟提供的组件来完成程序的自动更新,步骤如下: 1.登录友盟官网,点击注册一个友盟账号. 2.注册成功后将会自动进入到添加新应用界面,选择添 ...
- BFS(广度优先搜索)
Catch That Cow Farmer John has been informed of the location of a fugitive cow and wants to catch he ...
- printf---格式化并输出结果到标准输出。
printf命令格式化并输出结果到标准输出. 语法 printf(选项)(参数) --help:在线帮助: --version:显示版本信息. 参数 输出格式:指定数据输出时的格式: 输出字符串:指定 ...
- mysql简单备份脚本
#!/bin/bash #army.han #2016-11-11 #new_gj_DBbackup#备份路径配置 GSdir='/data/dbbackup/mysqlDB' TIME=`date ...
- HOJ——T 1867 经理的烦恼
http://acm.hit.edu.cn/hoj/problem/view?id=1867 Source : HCPC 2005 Spring Time limit : 2 sec Memo ...