[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个空需要去填,有 ...
随机推荐
- const volatile同时限定一个类型int a = 10
const和volatile放在一起的意义在于: (1)本程序段中不能对a作修改,任何修改都是非法的,或者至少是粗心,编译器应该报错,防止这种粗心: (2)另一个程序段则完全有可能修改,因此编译器最好 ...
- 201621123027 Week02-Java基本语法与类库
Week02-Java基本语法与类库 1.本周学习总结 关键词:基本语法,数据类型,包装类 本周讲了Java的基本数据类型和包装类: 数据类型主要分为八类(byte,short,int,long,do ...
- 【技巧】Java工程中的Debug信息分级输出接口
也许本文的标题你们没咋看懂.但是,本文将带大家领略输出调试的威力. 灵感来源 说到灵感,其实是源于笔者在修复服务器的ssh故障时的一个发现. 这个学期初,同袍(容我来一波广告产品页面,同袍官网)原服务 ...
- 新手入门 git
Git是目前世界上最先进的分布式版本控制系统 特点:高端大气上档次 什么是版本控制系统 系统自动记录文件改动 方便同事协作管理 不用自己管理一堆类似的文件了,也不需要把文件传来传去.如果想查看某次改动 ...
- javascript 中的类型
javascript 中的类型 js 是一门弱语言,各式各样的错误多种多样,特别是确定返回值有问题的时候,你会用什么来进行表示错误? 我一般有三个选择: null '' error {} 第一个选择 ...
- SiteMesh在项目中的配置
SiteMesh在项目中的配置 首先在web.xml里面增加siteMesh的配置: <filter> <filter-name>sitemesh</filter-nam ...
- SpringCloud的服务注册中心(四)- 高可用服务注册中心的搭建
一.双 服务注册注册中心 1.服务注册中心的服务端 - EurekaServer 1.1.EurekaServer1 String.application.name=eureka-server ser ...
- KNN算法简单应用
这里是写给小白看的,大牛路过勿喷. 1 KNN算法简介 KNN(K-Nearest Neighbor)工作原理:存在一个样本数据集合,也称为训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集 ...
- java Servlet文件拷贝的模板代码
//通过response对象获得一个输出流对象 ServletOutputStream os = response.getOutputStream(); //获得要拷贝文件的绝对路径 String r ...
- mysql中text数据类型
有个小问题记录下: 需要从第三方api接口获取数据,返回的数据的长度不定,设计表的时候设计成了varchar(256):结果存数据的时候提示表字段长度不够. 一直从300改到500,600,700都一 ...