bzoj2755【SCOI2012】喵星人的入侵


输入格式
第一行为三个整数n,m,K,分别表示地图的长和宽,以及最多能放置的炮塔数量。
接下来的n行,每行包含m个字符,‘#’表示地图上原有的障碍,‘.’表示该处为空地,
数据保证在原地图上存在S到T的路径。
输出格式
输出在合理布阵下,喵星人采取最优策略后,会受到的最大伤害。
注意必须保证在布阵结束后喵星人仍然可以沿一条或以上的路径从起点S到达终点T,
否则他们组织更大规模的侵略。
提示
【数据范围】
对于30%的数据,保证:
1<=N,M<=6
对于100%的数据,保证:
1<=N<=6,1<=M<=20,1<=K<=15,且从S到T的路径必定存在。
题解:
- 由于可以无限放置障碍,所以最后一定只会有一条路径;
- 插头$dp$求出路径即可;
- 注意和普通路径不同,路径不能组成四连通块;
#include<bits/stdc++.h>
#define il inline
#define rg register
using namespace std;
const int N=,M=,sz=1e5;
int n,m,K,c1[N],c2[N],cur,ans;
char s[M][M];
struct HASH{
int o,hd[sz],v[sz],w[sz],nt[sz];
il void init(){for(int i=;i<=o;++i)hd[v[i]%sz]=,v[i]=w[i]=nt[i]=;o=;}
il void upd(int x,int y){
for(rg int i=hd[x%sz];i;i=nt[i])if(v[i]==x){
if(w[i]<y)w[i]=y;
return;
}
nt[++o]=hd[x%sz],hd[x%sz]=o,v[o]=x,w[o]=y;
}
}f[][M];
il void upd(int&x,int y){if(x<y)x=y;}
il void decode(int x){
for(rg int i=;i<=m;++i)c1[i]=x&,x>>=;
for(rg int i=;i<=m;++i)c2[i]=x&,x>>=;
}
il int encode(){
int x=;
for(rg int i=m;~i;--i)x=(x<<)^c2[i];
for(rg int i=m;~i;--i)x=(x<<)^c1[i];
return x;
}
il int le(int x){
for(rg int i=x,y=;~i;--i)if(c1[i]&&c1[i]!=){
y+=(c1[i]&)?:-;
if(!y)return i;
}return ;
}
il int ri(int x){
for(rg int i=x,y=;i<=m;++i)if(c1[i]&&c1[i]!=){
y+=(c1[i]&)?:-;
if(!y)return i;
}return ;
}
il int cal1(int x){
int l=max(x-,),r=min(x+,m),re=;
for(rg int i=l;i<=r;++i)if(c2[i]==)re++;
return re;
}
il int cal2(int x){
int l=max(x-,),r=min(x+,m),re=;
for(rg int i=l;i<=r;++i)if(c2[i]==)re++;
return re;
}
il bool check(int j){
for(rg int i=;i<=m;++i)if(i!=j&&i!=j+&&c1[i])return false;
return true;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("C.in","r",stdin);
freopen("C.out","w",stdout);
#endif
scanf("%d%d%d",&n,&m,&K);
for(rg int i=;i<n;++i)scanf("%s",s[i]);
if(n<m){
for(rg int i=;i<n;++i)
for(rg int j=i+;j<m;++j){
swap(s[i][j],s[j][i]);
}
swap(n,m);
}
f[cur=][].upd(,);
for(rg int i=;i<n;++i)
for(rg int j=;j<m;++j){
for(rg int k=;k<=K;++k){
for(rg int l=;l<=f[cur][k].o;++l){
int w=f[cur][k].w[l];
decode(f[cur][k].v[l]);
if(!j){
if(c1[m])continue;
for(rg int i=m;i;--i)c1[i]=c1[i-],c2[i]=c2[i-];
c1[]=c2[]=;
}
/*
{
printf("%d %d %d:\n",i,j,k);
for(int i=0;i<=m;++i)printf("%d ",c1[i]);
puts("");
for(int i=0;i<=m;++i)printf("%d ",c2[i]);
puts("");
printf("%d\n",w);
printf("#\n");
}*/ int &p=c1[j],&q=c1[j+],&r=c2[j],w1=w+cal1(j),w2=w+cal2(j);
int t1=j&&(c2[j-]&),t2=j!=m&&(c2[j+]&);
if(s[i][j]=='#'){
if(p||q)continue;
r=,f[cur^][k].upd(encode(),w);
}else if(!p&&!q){
if(s[i][j]=='.'){
p=,q=;
r=,f[cur^][k].upd(encode(),w);
if(k<K)r=,f[cur^][k+].upd(encode(),w1);
}
if(t1||t2)continue;
if(s[i][j]=='S'||s[i][j]=='T'){
p=,q=,r=,f[cur^][k].upd(encode(),w2);
p=,q=,r=,f[cur^][k].upd(encode(),w2);
}else p=,q=,r=,f[cur^][k].upd(encode(),w2);
}else if(!p||!q){
if(t1&&t2)continue;
if(s[i][j]=='S'||s[i][j]=='T'){
if(p+q!=){
if(p+q==)c1[ri(j)]=;else c1[le(j+)]=;
p=q=,r=,f[cur^][k].upd(encode(),w2);
}
else if(check(j))p=,q=,r=,f[cur^][k].upd(encode(),w2);
}else{
r=,swap(p,q),f[cur^][k].upd(encode(),w2);
r=,swap(p,q),f[cur^][k].upd(encode(),w2);
}
}else{
if(p==&&q==){
p=q=,r=,f[cur^][k].upd(encode(),w2);
}else if(p==||q==){
if(p+q-==)c1[ri(j)]=;
else if(p+q-==)c1[le(j+)]=;
p=q=,r=,f[cur^][k].upd(encode(),w2);
}else {
if(p==&&q==)continue;
if(p==q){
if(p==)c1[ri(j+)]=;
else c1[le(j)]=;
}
p=q=,r=,f[cur^][k].upd(encode(),w2);
}
}
}
f[cur][k].init();
}
cur^=;
}
for(int i=;i<=K;++i)
for(int j=;j<=f[cur][i].o;++j){
decode(f[cur][i].v[j]);
if(check(m+))upd(ans,f[cur][i].w[j]);
}
printf("%d\n",ans);
return ;
}
bzoj2755【SCOI2012】喵星人的入侵的更多相关文章
- 洛谷 P2337 【[SCOI2012]喵星人的入侵】
这几天一直在刷插头Dp,写了几道入门题后,觉得还比较水,直到我发现了这一题.... 题目大意:给你一个n*m的地图,有些是空地,有些是障碍,还有两个是ST,在给你一个L,代表可以放L个炮台,你要在空地 ...
- 插头dp小结
插头dp: \(A:\)插头dp是什么? \(B:\)一种基于连通性状态压缩的动态规划问题 \(A:\)请问有什么应用呢? \(B:\)各种网格覆盖问题,范围允许状压解决,常用于计算方案数与联通块权值 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- BZOJ_2754__[SCOI2012]_喵星球上的点名_(暴力+后缀数组)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=2754 给出n个姓名串和m个点名串.求每个点名串在多少人的姓名中出现过(在名中出现或在姓中出现, ...
- BZOJ 2754([SCOI2012]喵喵叫的星球-统计序列的后缀阵列中子序列出现次数)
2754: [SCOI2012]喵喵叫的星球 Time Limit: 20 Sec Memory Limit: 128 MB Submit: 805 Solved: 380 [id=2754&qu ...
- BZOJ 2754: [SCOI2012]喵星球上的点名
2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 649 Solved: 305[Submit][Sta ...
- BZOJ2754: [SCOI2012]喵星球上的点名
2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 680 Solved: 314[Submit][Sta ...
- BZOJ 2754: [SCOI2012]喵星球上的点名 [后缀数组+暴力]
2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1906 Solved: 839[Submit][St ...
- BZOJ 2754: [SCOI2012]喵星球上的点名 [AC自动机+map+暴力]
2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1902 Solved: 837[Submit][St ...
随机推荐
- Hyperledger Fabric 1.2 --- Chaincode Operator 解读和测试(一)
前言 本文主要目的是用于整理Hyperledger Fabric中关于chaincode 管理和操作的内容,作者以release-1.2为范本进行讲解. 主要参考链接: https://hyperl ...
- shell之arp命令
arp: 显示所有的表项. arp -d address: 删除一个arp表项. arp -s address hw_addr: 设置一个arp表项. 常用参数: -a 使用bsd形式输出.(没有 ...
- Ubuntu 1804 本地显示远程服务器文件
本地是 Ubuntu 1804 最近想查看服务器上的图片,之前都是scp到本地,感觉太麻烦,于是查到有一种方法,ssh图形界面那种: 1.在File 界面下,左侧文件栏的最后一列有 “+ Other ...
- 【欢迎来怼】 Beta发布事后诸葛亮会议
队名:欢迎来怼 项目名称:博客园Android端APP 小组成员队长:田继平成员:李圆圆,葛美义,王伟东,姜珊,邵朔,阚博文 ————————————————————————————————————— ...
- TeamWork#3,Week5,Scrum Meeting 11.6, 11.7, 11.11, 11.12
11.6:到目前为止基本已完成相关知识的学习,各方面工作都开始进行,一开始进行比较慢. 11.7:项目遇到困难,需要补充相关知识,进度慢了下来. 11.11:各方面工作进展比较顺利,没有什么大问题. ...
- [BUAA OO]第一次博客作业
第一次作业 第一次进行面向对象的编程,不论是针对数据设计类还是对方法进行合适的归于不同类中,都不是很熟悉.所写出来的程序还是面向过程+有函数的类(虽然现在很大程度上感觉起来也是这样).索性作业难度并不 ...
- 信息安全系统设计基础_exp1
北京电子科技学院(BESTI) 实 验 报 告 课程:信息安全系统设计基础 班级:1353 姓名:吴子怡.郑伟 学号:20135313.20135322 指导教师: 娄嘉鹏 实验 ...
- beat冲刺(3/7)
目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:beta冲刺(3/7) 团队部分 后敬甲(组长) 过去两天完成了哪些任务 整理博客 ppt模板 接下来的计划 做好机动. ...
- HDU 4123 Bob’s Race 树形dp+单调队列
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4123 Time Limit: 5000/2000 MS (Java/Others) Memory L ...
- 论文《Network in Network》笔记
论文:Lin M, Chen Q, Yan S. Network In Network[J]. Computer Science, 2013. 参考:关于CNN中1×1卷积核和Network in N ...