2/19 福建四校联考

1.设计图案

给你一个n*m的矩阵,每个格子必须填或者不能填,要用环和1*2的小方块填满它,求方案数。

比如3*2,每个格子都必须填 有6种填法。

n*m<=300  

当时一看就觉得不可做然后就放弃了.....

题解:有个结论:

 

 

状压dp详细就是:

按照从上到下,从左到右dp,用f[i][j][k]表示到第i行j列的格子,轮廓线之上的格子的状态是k的方案数量。

如果这个格子不能填,那么他上面的格子必须被填满,上面格子也被填了的时候f[i][j][k]=f[i][j-1][k](j!=1)或者f[i-1][m][k](j=1)

如果这个格子可以填,那么先看一下它上面那个格子是否填满了,没填满就一定要填,填满了就不能竖着填了。然后看一下能不能横着填就可以了。

设x=2^(j-1)   f[i][j][k^x]+=f[i][j-1][k](j!=1) 或者f[i-1][m][k](j==1)    这句话表示的是填竖着的。

当j!=1时,判断一下是否可以横着填,可以的时候f[i][j][k|(x<<1)]+=f[i][j-1][k]

复杂度 nm * 2^(min(n,m))

实际实现可以滚动数组,这样简单很多。

代码

#include<iostream>
#include<cstdio>
#define ll long long
#include<cstring>
using namespace std;
inline int read()
{int  x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();}return x*f;
}
int n,m,mod;
ll f[2][1<<17];
bool b[305][305];
bool b2[305][305];int main()
{freopen("design.in","r",stdin);freopen("design.out","w",stdout);n=read();m=read();mod=read();for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)b[i][j]=(bool)read();if(n<m){for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)b2[i][j]=b[i][j];swap(n,m);for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)b[i][j]=b2[j][i];}int nown=1,pre=0,to=(1<<m)-1;f[pre][to]=1;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){for(int k=0;k<=to;k++){int x=1<<j-1;if(!b[i][j]){if((k|x)==k) f[nown][k]=(f[nown][k]+f[pre][k])%mod;    }    else{f[nown][k^x]=(f[nown][k^x]+f[pre][k])%mod;    if(j!=1&&(k|x)==k&&((k|(x>>1))!=k)&&b[i][j-1])f[nown][k|(x>>1)]=(f[nown][k|(x>>1)]+f[pre][k])%mod;}    }pre=1-pre;nown=1-nown;memset(f[nown],0,sizeof(f[nown]));        }  }ll ans=(f[pre][to]*f[pre][to])%mod; printf("%lld\n",ans);return 0;
}

 

 2.最优发射

大意:有一个环,有n个武器,每个武器可以打死一个区间内的人。

多组数据,每次给你很多人,问至少要多少个武器可以全部打死.....

n<=100000  人的总数<=200000

题解做法:

倍增加速贪心。

我的做法:

先删掉没用的边,这样的话就可以保证边的l和r都是递增的。由于数据组数比较多,所以显然不能每次遍历全部边。每个点直接二分一个能盖住它的边中最右能到哪里。

不考虑环,显然是一个dp,可以优化到nlogn  

但是加上环之后就比较麻烦,可以用一个lct维护一下dp路径

从1到m遍历,从每一个点向它能转移的点连边,如果它能越过环,就向m+1连边,这样的话一个点的深度就是它一直到现在的点的dp值。

每个点如果有能跨过环的边,那么就用能跨到的地方右边的第一个点的深度+1更新一下答案。

复杂度nlogn

现场的时候写挂了只有60.

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define INF 2000000000
#define ms(x) memset(x,0,sizeof(x))
using namespace std;
inline int read()
{int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();}return x*f;
}
int n,m,L,qq,ans;
int t[400005];
int c[200005][2];
int fa[200005],size[200005];
int rev[200005];
int qu[200005],top=0;
int tf[200005];
bool yes;struct line{int l,r;
}ll[400005];bool cmp(line x,line y)
{return (x.l<y.l)||(x.l==y.l&&x.r>y.r);
}inline bool isroot(int x){return c[fa[x]][0]!=x&&c[fa[x]][1]!=x;}
inline void update(int x){size[x]=size[c[x][0]]+size[c[x][1]]+1;}void rotate(int x)
{//printf("rotate%d\n",x);int y=fa[x],z=fa[y],l,r;l=(c[y][1]==x),r=l^1;if(!isroot(y)) c[z][c[z][1]==y]=x;fa[x]=z;fa[y]=x;fa[c[x][r]]=y;c[y][l]=c[x][r];c[x][r]=y;update(y);update(x);
}void splay(int x)
{while(!isroot(x)){int y=fa[x],z=fa[y];if(!isroot(y)){if(c[z][1]==y^c[y][1]==x)rotate(x);else rotate(y);}rotate(x);}
}void access(int x)
{splay(x);while(fa[x]){int y=fa[x];splay(y);c[y][1]=x;update(y);splay(x);}
}
void link(int x,int y)
{access(x);splay(x);//rever(c[x][0]);
    access(y);splay(y);c[y][1]=x;fa[x]=y;
}void cut(int x)
{access(x);splay(x);fa[c[x][0]]=0;c[x][0]=0;
}int get(int x)
{int l=1,r=n,mid,ans=-1;while(l<=r){mid=(l+r)>>1;if(ll[mid].l>x) r=mid-1;else{    ans=ll[mid].r;l=mid+1;    }    }return ans;
}int get2(int x)
{int l=1,r=m,mid,ans=0;while(l<=r){mid=(l+r)>>1;if(t[mid]<=x) {ans=mid;l=mid+1;}else {r=mid-1;}}return ans;
}int check(int x)
{access(x);//splay(x);return size[c[x][0]];
}int main()
{freopen("launch.in","r",stdin);freopen("launch.out","w",stdout);n=read();qq=read();L=read();for(int i=1;i<=n;i++){ll[i].l=read();ll[i].r=read();if(ll[i].r<ll[i].l) ll[i].r+=L;}for(int i=1;i<=n;i++) if(ll[i].r>=L) {ll[++n].l=0;ll[n].r=ll[i].r-L;    }sort(ll+1,ll+n+1,cmp);int j=1;for(int i=2;i<=n;i++){if(ll[i].r>ll[j].r) {ll[++j]=ll[i];}     }    n=j;
//    for(int i=1;i<=n;i++) printf("%d %d %d\n",i,ll[i].l,ll[i].r);while(qq--){ms(fa);ms(c);ms(size);ms(rev);t[0]=-1;yes=true;m=read();for(int i=1;i<=m;i++) t[i]=read();sort(t+1,t+m+1);ans=INF;size[m+1]=1;int j=1;for(int i=2;i<=m;i++)if(t[i]!=t[j]) t[++j]=t[i];m=j;for(int i=0;i++<=m;i++) size[i]=1;if(yes) for(int i=1;i<=m;i++){int x=get(t[i]);if(x==-1||x<t[i]) {puts("-1");yes=false;break;}if(x-L>=t[1]){ ans=min(ans,check(get2(x-L)+1)+1);link(i,m+1);}else link(i,get2(x)+1);}ans=min(ans,check(1));if(yes) printf("%d\n",ans);}return 0;    
}

 

 3.传输网络

有m条信息,n个传输装置。

每个装置可以把一个范围a-b内的全部信息转移到c(a<=c<=b),但是需要d点费用

现在要把全部信息都转移到一个点,求最小费用。

m<=10^9 n<=10^5

先离散一下,再用两个线段树维护第一条和最后一条信息到每个点c的距离。

然后按dp做就行了。

现场只写了n^3 dp 只有50分......

#include<iostream>
#include<cstdio>
#include<algorithm>
#define ll long long
#define N 262144
#define INF 1000000000000000000LL
using namespace std;
inline ll llread()
{ll x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();}return x*f;
}
inline int read()
{int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();}return x*f;
}
int n,m,cnt=0;
ll ans=INF;
int s[300005];
struct ma{int l,r,c;ll d;
}a[100005];ll T1[600005],T2[600005];ll query(ll*T,int l,int r)
{ll minn=INF;for(l+=N-1,r+=N+1;l^r^1;l>>=1,r>>=1){if(~l&1) minn=min(minn,T[l+1]);if( r&1) minn=min(minn,T[r-1]);    }return minn;
}void renew(ll*T,int x,ll ad)
{T[x+=N]=min(T[x],ad);for(x>>=1;x;x>>=1)T[x]=min(T[x<<1],T[(x<<1)+1]);    
} void init()
{for(int i=1;i<=N*2;i++)T1[i]=T2[i]=INF;
}int main()
{freopen("network.in","r",stdin);freopen("network.out","w",stdout);n=read();m=read();for(int i=1;i<=n;i++){a[i].l=read();a[i].r=read();a[i].c=s[i]=read();a[i].d=llread();}s[n+1]=1;s[n+2]=m;sort(s+1,s+n+3);init();int j=0;for(int i=1;i<=n+2;i++){if(s[i]!=s[i-1])s[++j]=s[i];}cnt=j;renew(T1,1,0);renew(T2,cnt,0);for(int i=1;i<=n;i++){a[i].l=lower_bound(s+1,s+cnt+1,a[i].l)-s;a[i].r=upper_bound(s+1,s+cnt+1,a[i].r)-s-1;a[i].c=lower_bound(s+1,s+cnt+1,a[i].c)-s;}for(int i=1;i<=n;i++){if(a[i].l>a[i].r||a[i].l>cnt||a[i].r>cnt) continue;ll x1=query(T1,a[i].l,a[i].r);ll x2=query(T2,a[i].l,a[i].r);ans=min(ans,x1+x2+a[i].d);renew(T1,a[i].c,x1+a[i].d);renew(T2,a[i].c,x2+a[i].d);    }if(ans<INF) printf("%lld\n",ans);else puts("-1");return 0;
}

 

转载于:https://www.cnblogs.com/FallDream/p/liankao219.html

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

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

相关文章

RPC调用和HTTP调用的区别你知道吗

前言 很长时间以来都没有怎么好好搞清楚RPC&#xff08;即Remote Procedure Call&#xff0c;远程过程调用&#xff09;和HTTP调用的区别&#xff0c;不都是写一个服务然后在客户端调用么&#xff1f;这里请允许我迷之一笑~Naive&#xff01; 本文简单地介绍一下两种形式的C/…

C#实战:基于ItextSharp技术标签生成小工具

目录 1、运行主界面 2、标签生成界面 3、需要引入的依赖包 4、解决方案目录 5、主要代码 1、新建PdfUtils工具类 2、Form1.cs 窗体主要代码 IT技术分享社区 / Itext Sharp Demo GitCode 今天给大家分享小编基于ItextSharp制作的一款标签生成小工具&#xff0c;可供大家…

开发工具:推荐一款非常好用的SSH客户端WindTerm

目录 1、主要功能 2、安装WindTerm 3、设置与使用 3.1 设置终端字体 3.2 外观设置 3.3 配置会话 3.5 新建会话 4、软件性能 5、总结 今天给大家推荐一款基于C语言开发的支持跨平台SSH客户端WindTerm&#xff0c;感兴趣朋友可以下载试试。 1、主要功能 支持 SSH v2、T…

Java实战:指定大小分组压缩文件夹里面的文件案例

目录 一、前言 二、代码示例 新建FileModel.java 实体 Main.java 代码&#xff1a; 三、展示效果 四、最后 一、前言 今天给大家分享一个J自己写的ava实战的小案例&#xff0c;主要功能是实现指定一个文件夹&#xff0c;然后分组压缩里面的文件。其实这个案例还是有一定用…

mac系统快捷键大全详细介绍

对于使用苹果电脑的操作系统的新人来说&#xff0c;快捷键是个很麻烦的问题&#xff0c;要一个个的找到快捷键也不是很容易的问题&#xff0c;今天这篇文章就解决了到处找快捷键的麻烦。 Mac中主要有四个修饰键&#xff0c;分别是Command&#xff0c;Control&#xff0c;Optio…

Docker实战:Docker安装nginx并配置SSL

目录 1、拉取nginx镜像 2、启动nginx容器 3、创建挂载nginx目录 4、重新启动nginx容器 5、查看目录挂载是否成功 6、在宿主目录创建ssl目录&#xff0c;将ssl证书放在宿主主机 7、修改配置宿主主机nginx增加ssl证书配置 8、重启nginx容器 今天继续给大家分享Docker实战…

W模型和瀑布模型与“V”模式开发模型有何异同?

在做软件开发时&#xff0c;程序员们肯定接触过各式各样的软件开发模型&#xff0c;例如&#xff1a;写了再改模型、瀑布模型、增量模型等。其实&#xff0c;很多开发模型是在瀑布模型基础上衍生出来的。 然而&#xff0c;了解“V”模式开发模型的程序员应该不多。“V”模式开…

语言模型(N-Gram)

问题描述&#xff1a;由于公司业务产品中&#xff0c;需要用户自己填写公司名称&#xff0c;而这个公司名称存在大量的乱填现象&#xff0c;因此需要对其做一些归一化的问题。在这基础上&#xff0c;能延伸出一个预测用户填写的公司名是否有效的模型出来。 目标&#xff1a;问题…

C#:Winfrom 实现DataGridView 自定义分页

目录 安装Dapper依赖 安装SQLite依赖 新建SQLite数据库文件 主要代码示例 运行界面 今天给大家分享Winform实现DataGridView 自定义分页的案例&#xff0c;感兴趣的朋友可以一起来学习一下。 采用技术&#xff1a;C#WinformDapperSQLite。 本次为了避免安装数据库的繁琐&#x…

超维空间S2无人机使用说明书——21、VINS视觉定位仿真

引言&#xff1a;为了实现室内无人机的定位功能&#xff0c;S系列无人机配置了VINS-FUSION定位环境&#xff0c;主要包含了仿真跑数据集和实际操作部分。为了提前熟悉使用原理&#xff0c;可以先使用仿真环境跑数据集进行学习和理解 硬件&#xff1a;1080P显示器、Jetson orin…

正割函数(sec)

1. 定义 正割与余弦互为倒数&#xff0c;余割与正弦互为倒数。即&#xff1a; ⎧⎩⎨⎪⎪⎪⎪secθ1cosθcscθ1sinθ也即在几何上&#xff0c;设 △ABC&#xff0c;∠C90&#xff0c;ACb&#xff0c;BCa&#xff0c;ABc&#xff0c;正割函数&#xff1a;sec∠Ac/b&#xff08;…

网站:推荐几款好用的在线短链生成工具

目录 一、网站工具&#xff1a;ft12 二、网站工具&#xff1a;缩我短网址 三、Sina新浪短网址 四、短网址在线生成- ock.cn 五、网站工具&#xff1a;i排版 短链技术目前对网站推广非常的有用&#xff0c;有了它就可以把非常长的网址缩短。这样分享推广起来非常方便。今天…

学习mysql中使用inner join,left join 等

left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录 inner join(等值连接) 只返回两个表中联结字段相等的行 举例如下&#xff1a; -----------------------------------------…

MySQL:union all与union区别详解

union 是对数据进行并集操作&#xff0c;不包括重复行&#xff0c;同时进行默认排序 Union all 是对数据进行并集操作&#xff0c;包括重复行&#xff0c;不进行排序 举例说明&#xff1a; 创建数据库表&#xff1a; CREATE TABLE t_demo ( id int(32) NOT NULL, name var…

如何理解Mysql的索引及他们的原理--------二叉查找树和平衡二叉树和B树和B+树

1.索引是什么东西&#xff1f; 索引就是一个数据结构&#xff0c;我们把表中的记录用一个适合高效查找的数据结构来表示&#xff0c;目的就是让查询变得更高效。 2.它到底怎么运作的&#xff1f; 这个问题就说来话长了&#xff0c;且听我慢慢道来&#xff1a; 在mysql中使用…

微信输入法来了,一起来体验一下吧

大家期待已久的微信输入法终于来了&#xff0c;不是内置于微信当中&#xff0c;而是一款独立应用的APP&#xff0c;今天小编带大家来体验一下微信输入&#xff0c;到底好不好用&#xff1f; 目录 1、安装 2、功能介绍 2.1、智能推荐公众号、视频号、小程序等 2.2、可直接发…