[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个空需要去填,有 ...
随机推荐
- Scrum 冲刺 第五日
目录 要求 项目链接 燃尽图 问题 今日任务 明日计划 成员贡献量 要求 各个成员今日完成的任务(如果完成的任务为开发或测试任务,需给出对应的Github代码签入记录截图:如果完成的任务为调研任务,需 ...
- 第九条:覆盖equals方法时总要覆盖hashCode方法
Object类的hashCode方法: public native int hashCode(); 是一个本地方法. 其中这个方法的主要注释如下: Whenever it is invoked o ...
- bzoj千题计划113:bzoj1023: [SHOI2008]cactus仙人掌图
http://www.lydsy.com/JudgeOnline/problem.php?id=1023 dp[x] 表示以x为端点的最长链 子节点与x不在同一个环上,那就是两条最长半链长度 子节点与 ...
- c# 几种深拷贝方式的比较
public static class Tools { //利用 BinaryFormatter 实现深拷贝 public static T DeepCopyByBinary<T>(thi ...
- Python内置函数(38)——zip
英文文档: zip(*iterables) Make an iterator that aggregates elements from each of the iterables. Returns ...
- Mego开发文档 - 复杂保存操作
复杂保存操作 Mego框架还提供了更强大的数据更新API,以简化开发工作,同时也保证的性能. 指定属性添加数据 本列中指定插入一个数据对象,并且只会插入三列数据,最后两个属性是以表达式的形式插入. u ...
- OrientDB入门(1)Getting Started
Running OrientDB the First Time First, download and extract OrientDB by selecting the appropriate pa ...
- 新概念英语(1-55)The Sawyer family
新概念英语(1-55)The Sawyer family When do the children do their homework? The Sawyers live at 87 King Str ...
- python实现 字符串匹配函数
通配符是 shell 命令中的重要功能,? 表示匹配任意 1 个字符,*表示匹配 0 个或多个字符.请使用你熟悉的编程语言实现一个字符串匹配函数,支持 ? 和 * 通配符.如 "a?cd*d ...
- python基础——特性(property)、静态方法(staticmethod)和类方法(classmethod)
python基础--特性(property) 1 什么是特性property property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值 import math class Circl ...