[4.14校内训练赛by hzwer]
来自FallDream的博客,未经允许,请勿转载,谢谢。
hzwer又出丧题虐人 4道noi.... 很奇怪 每次黄学长出题总有一题我做过了。
嗯题目你们自己看看呗 好难解释
--------------------------------------
A.[bzoj1565][NOI2009]植物大战僵尸
这道题其实挺好想的。nm比较小,考虑最小割,假设割到S表示吃,割到T表示不吃
那么能源小于0的,从S向他连边,流量是负的能源,
能源大于0的,从它向T连边,流量是能源,同时答案加上能源,
然后对于每一个限制条件,都连INF的边 最后最小割。
#include<iostream>
#include<cstdio>
#include<cstring>
#define S 0
#define T 601
#define INF 2000000000
#define num(x,y) ((x-1)*m+y)
using namespace std;
inline int read()
{
int x = , f = ; char ch = getchar();
while(ch < '' || ch > ''){ if(ch == '-') f = -; ch = getchar();}
while(ch >= '' && ch <= ''){x = x * + ch - '';ch = getchar();}
return x * f;
} int head[T+],head2[T+],c[T+],d[T+],cnt=T*T*,tcnt=,n,m,ans=,q[T+],top,s[T+],in[T+];
struct edge{int to,next,w;}e[];
bool b[T+]; void ins(int f,int t){e[++tcnt]=(edge){t,head2[f],};head2[f]=tcnt;in[t]++;}
void ins(int f,int t,int w)
{
e[++cnt]=(edge){t,head[f],w};head[f]=cnt;
e[++cnt]=(edge){f,head[t],};head[t]=cnt;
} void topsort(int x)
{
q[top=]=x;
for(int i=;i<=top;i++)
{
if(x=q[i])
b[x]=,s[x]>=?(ans+=s[x],ins(x,T,s[x]),)
:(ins(S,x,-s[x]),);
for(int j=head2[x];j;j=e[j].next)
if(!--in[e[j].to]) q[++top]=e[j].to;
} for(int i=;i<=n*m;i++) if(b[i])
for(int j=head2[i];j;j=e[j].next) if(b[e[j].to])
ins(i,e[j].to,INF);
} int dfs(int x,int f)
{
if(x==T)return f;
int used=;
for(int&i=c[x];i;i=e[i].next)
if(e[i].w&&d[e[i].to]==d[x]+)
{
int w=dfs(e[i].to,min(f-used,e[i].w));
used+=w;e[i].w-=w;e[i^].w+=w;
if(used==f)return f;
}
return d[x]=-,used;
} bool bfs()
{
memset(d,,sizeof(d));int i,j;
for(d[q[top=i=]=S]=;i<=top;i++)
for(int j=c[q[i]]=head[q[i]];j;j=e[j].next)
if(e[j].w&&!d[e[j].to])
d[q[++top]=e[j].to]=d[q[i]]+;
return d[T];
} int main()
{
n=read();m=read();
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
if(j>) ins(num(i,j),num(i,j-));
s[num(i,j)]=read();
for(int k=read();k;k--)
{
int x=read()+,y=read()+;
ins(num(i,j),num(x,y));
}
}
for(int i=;i<=n;i++) ins(,num(i,m));
topsort();
while(bfs()) ans-=dfs(S,INF);
cout<<ans;
return ;
}
B.阿狸的打字机 戳这里
C.[bzoj1499][NOI2005]瑰丽华尔兹
题解:很容易想到O(nmk)dp,然后我们每一次的更新都只能从一个方向转移,用一个单调队列维护一下
#include<iostream>
#include<cstdio>
#include<cstring>
#define pa pair<int,int>
#define mp(x,y) make_pair(x,y)
#define MN 200
#define INF 200000000
using namespace std;
inline int read()
{
int x = , f = ; char ch = getchar();
while(ch < '' || ch > ''){ if(ch == '-') f = -; ch = getchar();}
while(ch >= '' && ch <= ''){x = x * + ch - '';ch = getchar();}
return x * f;
} int f[MN+][MN+][MN+],T[MN+],dir[MN+],n,m,x,y,k;
char st[MN+][MN+];
struct MyQueue
{
int top,tail;pa s[MN+];
void clear(int x){top=tail=;s[top]=mp(x,-INF);}
void ins(int x,int from)
{
while(s[top].second<x&&top>=tail) --top;
s[++top]=mp(from,x);
}
int get(int t)
{
while(s[tail].first<t) ++tail;
return s[tail].second;
}
}q; int main()
{
memset(f,,sizeof(f)); q.clear();
n=read();m=read();x=read();y=read();k=read();
f[][x][y]=;
for(int i=;i<=n;i++) scanf("%s",st[i]+);
for(int i=;i<=k;i++)
{
int x=read(),y=read();
T[i]=y-x+;dir[i]=read();
}
for(int t=;t<=k;t++)
{
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
f[t][i][j]=max(f[t][i][j],f[t-][i][j]);
if(dir[t]==)
for(int i=;i<=m;i++,q.clear())
for(int j=n;j;j--)
if(st[j][i]!='x')
f[t][j][i]=max(f[t][j][i],q.get(n+-j-T[t])-j),q.ins(f[t-][j][i]+j,n+-j);
else q.clear(n+-j);
if(dir[t]==)
for(int i=;i<=m;i++,q.clear())
for(int j=;j<=n;j++)
if(st[j][i]!='x')
f[t][j][i]=max(f[t][j][i],q.get(j-T[t])+j),q.ins(f[t-][j][i]-j,j);
else q.clear(j);
if(dir[t]==)
for(int i=;i<=n;i++,q.clear())
for(int j=m;j;j--)
if(st[i][j]!='x')
f[t][i][j]=max(f[t][i][j],q.get(m+-j-T[t])-j),q.ins(f[t-][i][j]+j,m+-j);
else q.clear(m+-j);
if(dir[t]==)
for(int i=;i<=n;i++,q.clear())
for(int j=;j<=m;j++)
if(st[i][j]!='x')
f[t][i][j]=max(f[t][i][j],q.get(j-T[t])+j),q.ins(f[t-][i][j]-j,j);
else q.clear(j);
}
int ans=;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
ans=max(ans,f[k][i][j]);
cout<<ans;
return ;
}
D.[bzoj3670][Noi2014]动物园
自己yy了一下,发现num[i]就是在i/2之前的fail节点的个数。
可以假装用自己这个串匹配自己,然后到了第i个点的时候突然不对了(别问我为什么不对),那么我跳到的fail节点一定既是前缀又是现在的后缀,因为我在匹配自己呢(雾)
#include<iostream>
#include<cstdio>
#include<cstring>
#define MN 1000000
#define mod 1000000007
using namespace std;
bool b[MN+];
int fail[MN+],num[MN+],ans=;
char st[MN+];
int main()
{
num[]=;int T;
for(cin>>T;T;T--)
{
scanf("%s",st+);ans=;
memset(b,,sizeof(b));
for(int i=,j=;st[i];i++)
{
while(j&&st[j+]!=st[i])j=fail[j];
if(st[j+]==st[i]) ++j;
fail[i]=j;num[i]=num[j]+;
}
for(int i=,j=;st[i];i++)
{
while(j&&((j+)*>i||st[j+]!=st[i]))j=fail[j];
if(st[j+]==st[i]) ++j;
ans=1LL*ans*(num[j]+)%mod;
}
printf("%d\n",ans);
}
return ;
}
[4.14校内训练赛by hzwer]的更多相关文章
- [2017.4.7校内训练赛by hzwer]
来自FallDream的博客,未经允许,请勿转载,谢谢. 报警啦.......hzwer又出丧题虐人啦..... 4道ctsc...有一道前几天做过了,一道傻逼哈希还wa了十几次,勉强过了3题..我好 ...
- [3.24校内训练赛by hzwer]
来自FallDream的博客,未经允许,请勿转载,谢谢. ----------------------------------------------------------------------- ...
- 2015 AlBaath Collegiate Programming Contest(2月14日训练赛)
A (By ggg): 题意:一个人还有x秒到红绿灯,这个红绿灯有g秒绿灯,y秒黄 灯,r秒红灯,问你到红绿灯的时候是什么灯.值得注意的是绿 灯变黄灯时,第g秒是黄灯了. B (By Anxdada) ...
- NOIP模拟赛 by hzwer
2015年10月04日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...
- 10.0.0.55_12-16训练赛部分writeup
0x1 - MISC MISC100 一张帅行的照片 目测是图片隐写,但是binwalk并没有出来,应该是对文件头进行了修改 010editor查看一下,发现在jpg文件尾之后还有大量的数据 而且在灰 ...
- Contest1592 - 2018-2019赛季多校联合新生训练赛第二场(部分题解)
Contest1592 - 2018-2019赛季多校联合新生训练赛第二场 D 10248 修建高楼(模拟优化) H 10252 组装玩具(贪心+二分) D 传送门 题干 题目描述 C 市有一条东西走 ...
- Contest1585 - 2018-2019赛季多校联合新生训练赛第一场(部分题解)
Contest1585 - 2018-2019赛季多校联合新生训练赛第一场 C 10187 查找特定的合数 D 10188 传话游戏 H 10192 扫雷游戏 C 传送门 题干: 题目描述 自然数中除 ...
- 7.30 正睿暑期集训营 A班训练赛
目录 2018.7.30 正睿暑期集训营 A班训练赛 T1 A.蔡老板分果子(Hash) T2 B.蔡老板送外卖(并查集 最小生成树) T3 C.蔡老板学数学(DP NTT) 考试代码 T2 T3 2 ...
- HDU6578 2019HDU多校训练赛第一场 1001 (dp)
HDU6578 2019HDU多校训练赛第一场 1001 (dp) 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6578 题意: 你有n个空需要去填,有 ...
随机推荐
- python简单路由系统
# 输入模块名/函数 url = input('请输入网址:') module,func = url.split('/') m = __import__('lib.'+module,fromlist= ...
- 库函数strstr的实现
没什么说的,常规思路: 函数原型:const char* StrStr(const char *str1, const char *str2) 方法一: str1:源字符串: str2:需要查找的目的 ...
- SWFUpload文件上传详解
SWFUpload是一个flash和js相结合而成的文件上传插件,其功能非常强大. SWFUpload的特点: 1.用flash进行上传,页面无刷新,且可自定义Flash按钮的样式; 2.可以在浏览器 ...
- OSI七层协议模型、TCP/IP四层模型学习笔记
1. OSI七层和TCP/IP四层的关系 1.1 OSI引入了服务.接口.协议.分层的概念,TCP/IP借鉴了OSI的这些概念建立TCP/IP模型. 1.2 OSI先有模型,后有协议,先有标准,后进行 ...
- python之路--day13-模块
1,什么是模块 模块就是系统功能的集合体,在python中,一个py文件就是一个模块, 例如:module.py 其中module叫做模块名 2,使用模块 2.1 import导入模块 首次带入模块发 ...
- JAVA_SE基础——13.选择结构语句
if选择结构 语法: if(条件){ 代码块 } public class Test{ public static void main(String[] args){ int a = 5; if(a ...
- PHP分页初探 一个最简单的PHP分页代码的简单实现
PHP分页代码在各种程序开发中都是必须要用到的,在网站开发中更是必选的一项. 要想写出分页代码,首先你要理解SQL查询语句:select * from goods limit 2,7.PHP分页代码核 ...
- Linux下的Shell编程(1)最简单的例子
深入地了解和熟练地掌握Shell编程,是每一个Linux用户的必修 功课之一. 从第一行开始 我们可以使用任意一种文字编辑器编写shell脚本,它必须以如下行开始(必须放在文件的第一行): #!/bi ...
- 开源软件:NoSql数据库 - 图数据库 Neo4j
转载自原文地址:http://www.cnblogs.com/loveis715/p/5277051.html 最近我在用图形数据库来完成对一个初创项目的支持.在使用过程中觉得这种图形数据库实际上挺有 ...
- eclipse开发Groovy代码,与java集成,maven打包编译
今天尝试了一下在eclipse里面写Groovy代码,并且做到和Java代码相互调用,折腾了一下把过程记录下来. 首先需要给eclipse安装一下Groovy的插件,插件地址:https://gith ...