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]\)

\[f[i][j]=min(f[i-1][j]+c1[i],f[i][j-1]+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的更多相关文章

  1. [NowCoder]牛客OI周赛1 题解

    A.分组 首先,认识的人不超过3个,因此不存在无解的方案 考虑直接构造,先把所有点设为1,顺序扫一遍把有问题的点加入队列 每次取队头,将其颜色取反,再更新有问题的点 复杂度:考虑到每个点不会操作2次, ...

  2. 牛客OI周赛8-提高组A-用水填坑

    牛客OI周赛8-提高组A-用水填坑 题目 链接: https://ac.nowcoder.com/acm/contest/403/A 来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制: ...

  3. 牛客OI周赛9-提高组题目记录

    牛客OI周赛9-提高组题目记录 昨天晚上做了这一套比赛,觉得题目质量挺高,而且有一些非常有趣而且非常清奇的脑回路在里边,于是记录在此. T1: 扫雷 题目链接 设 \(f_i\) 表示扫到第 \(i\ ...

  4. 牛客OI周赛7-提高组 A 小睿睿的等式

    链接:https://ac.nowcoder.com/acm/contest/371/A来源:牛客网 小睿睿在游戏开始时有n根火柴棒,他想知道能摆成形如“A+B=n”的等式且使用的火柴棒数也恰好等于n ...

  5. 牛客OI周赛7-提高组 B小睿睿的询问(ST打表)

    链接:https://ac.nowcoder.com/acm/contest/371/B来源:牛客网 小睿睿的n个妹纸排成一排,每个妹纸有一个颜值val[i].有m个询问,对于每一个询问,小睿睿想知道 ...

  6. 牛客OI周赛2-提高组

    A.游戏 链接:https://www.nowcoder.com/acm/contest/210/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语 ...

  7. 牛客OI周赛10-普及组-A眼花缭乱的街市-(加速+二分)

    https://ac.nowcoder.com/acm/contest/901/A 很简单的一道题,全场只有20+AC,卡时间.新学了cin加速语法和数组二分查找的函数调用. 知道有个读写挂,可以加速 ...

  8. 牛客OI周赛11-普及组 B Game with numbers (数学,预处理真因子)

    链接:https://ac.nowcoder.com/acm/contest/942/B 来源:牛客网 Game with numbers 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C+ ...

  9. 牛客OI周赛7-普及组 解题报告

    出题人好评. 评测机差评. A 救救喵咪 二位偏序.如果数据范围大的话直接树状数组,不过才1000就\(O(n^2)\)暴力就ok了. #include <bits/stdc++.h> s ...

随机推荐

  1. HDU 4398 Template Library Management (最优页面调度算法)

    中等偏易题.操作系统理论中的最优页面调度算法,贪心.当需要淘汰某个模版时,淘汰掉当前手中在最远的将来才会被用到(或者以后永远不再用到)的那个. 代码: #include <iostream> ...

  2. C# 快捷使用自定义配置节点

    C#除了appSettings和connectionStrings默认配置外还允许用户自定义使用配置.C# 提供3中简单的自定义配置,配置文件如下 <?xml version="1.0 ...

  3. [Python] Histograms for analysis Daily return

    A histogram is an accurate representation of the distribution of numerical data. Y axis is the occur ...

  4. ddr sdram self-refresh & auto-refresh

    以下是EDD5116AFTA数据手册的摘录.不过看过了还是不太明白二者的区别. self-refresh:Self-refresh entry [SELF]This command starts se ...

  5. 深入Vue的响应式原理

    工作的过程中,有时候会有数据改变但是视图没有更新的问题,作者在vue的官方文档中有提到这个问题,我来总结一下 1.vue的每个组件实例都有对象的watcher实例对象,它会在组件渲染的过程中把属性记录 ...

  6. HAProxy高可用配置视频教程

    HAProxy提供高可用性.负载均衡等,它是免费.快速并且可靠的一种解决方案.HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理.HAProxy运行在当前的硬件上, ...

  7. swing导出html到excel

    swing导出html到excel 1  ShowCopDetal package com.product; import java.awt.BorderLayout; import java.awt ...

  8. 963B:Destruction of a Tree

    You are given a tree (a graph with n vertices and n - 1 edges in which it's possible to reach any ve ...

  9. MyEclipse的代码自动提示功能

     一般默认情况下,Eclipse ,MyEclipse的代码提示功能是比Microsoft Visual Studio的差很多的,主要是Eclipse ,MyEclipse本身有很多选项是默认关闭的, ...

  10. 【Docker自定制镜像之Dockerfile】

    镜像的定制,就是定制每一层所添加的配置.文件,如果可以把每一层修改.安装.构建.操作的命令都写入到一个脚本中,用脚本来构建.定制镜像,这个脚本就是Dockerfile Dockerfile是一个文本文 ...