bzoj4067 [Ctsc2015]gender
好神的一道题啊!
我们发现题目中的ln的贡献非常傻逼,但是我们可以发现这个东西的取值只有40个左右,于是我们可以枚举他!
枚举完了对于题里的贡献就是一个普通的最小割,采用的是文理分科的思想,与S连代表不改,与T连代表改,然后流量凑一下就可以了。
那么我们怎么判断我们枚举的值和算出来的方案是否对应呢?我们发现K很小,于是我们可以对于每一层都状压状态,然后通过上面的网络流来计算当这层状态确定时的最优解,然后最后再dp转移一下就可以了。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <queue>
#define N 1050
#define inf 0x3fffffff
using namespace std;
int e=,head[N];
struct edge{
int u,v,f,next;
}ed[N*N<<];
void add(int u,int v,int f){
ed[e].u=u;ed[e].v=v;ed[e].f=f;
ed[e].next=head[u];head[u]=e++;
ed[e].u=v;ed[e].v=u;ed[e].f=;
ed[e].next=head[v];head[v]=e++;
}
int dep[N],S,T;
bool bfs(){
memset(dep,,sizeof dep);
queue<int> q;q.push(S);dep[S]=;
while(!q.empty()){
int x=q.front();q.pop();
for(int i=head[x];i;i=ed[i].next){
if(ed[i].f&&!dep[ed[i].v]){
dep[ed[i].v]=dep[x]+;
if(ed[i].v==T)return ;
q.push(ed[i].v);
}
}
}
return ;
}
int dfs(int x,int f){
if(x==T||!f)return f;
int ans=;
for(int i=head[x];i;i=ed[i].next){
if(ed[i].f&&dep[ed[i].v]==dep[x]+){
int nxt=dfs(ed[i].v,min(f,ed[i].f));
ans+=nxt;f-=nxt;ed[i].f-=nxt;ed[i^].f+=nxt;
}
}
if(!ans)dep[x]=-;
return ans;
}
int dinic(){
int ans=;
while(bfs())ans+=dfs(S,inf);
return ans;
}
int cnt[]={,,,,,,,,,,,,,,,};
int n,K,m,p,c[N],id[N],x[N],y[N],a[][];
int fa[N];
int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
struct data{int u,v,w,x;}d[N*];
bool cmp1(data a,data b){return y[a.u]<y[b.u];}
bool cmp2(int a,int b){return y[a]<y[b];}
char s[N];
int in[N],w[][],f[][][],ans;
void getmax(int &x,int y){x>y?x=x:x=y;}
int main(){
scanf("%d%d%d%d%s",&n,&K,&m,&p,s+);
S=m+;T=S+;
register int i,j,k,l,s1,s2,l1,r1,l2,r2,V,now;
for(i=;i<=m;i++)
scanf("%d",&c[i]),id[i]=fa[i]=i;
for(i=;i<=K;i++)
for(j=;j<=n;j++){
scanf("%d",&a[i][j]);
x[a[i][j]]=i;y[a[i][j]]=j;
}
for(i=;i<=p;i++){
double x;
scanf("%d%d%d%lf",&d[i].u,&d[i].v,&d[i].w,&x);
d[i].x=d[i].w*x;
if(find(d[i].u)!=find(d[i].v))fa[fa[d[i].u]]=fa[d[i].v];
}
for(i=;i<=m;i++){
if(y[find(i)])y[i]=y[fa[i]];
if(!y[fa[i]]&&y[i])y[fa[i]]=y[i];
}
for(i=;i<=m;i++){
if(!y[fa[i]])y[fa[i]]=;
y[i]=y[fa[i]];
}
sort(d+,d+p+,cmp1);
sort(id+,id+m+,cmp2);
for(l=;l<=(n-)*K;l++){
if(!l||(floor(*log(1.0*l))!=floor(*log(1.0*(l+))))){
V=floor(*log(1.0*(l+)));
for(i=,l1=,r1=,l2=,r2=;i<=n;i++){
while(r1<p&&y[d[r1+].u]==i)r1++;
while(r2<m&&y[id[r2+]]==i)r2++;
for(j=;j<(<<K);j++){
e=;now=head[S]=head[T]=;
for(k=l2;k<=r2;k++)in[id[k]]=head[id[k]]=;
for(k=l1;k<=r1;k++){
now+=V*d[k].w*;
in[d[k].u]+=V*(d[k].w-d[k].x);
in[d[k].v]+=V*(d[k].w-d[k].x);
add(d[k].u,d[k].v,V*(d[k].w+d[k].x));
add(d[k].v,d[k].u,V*(d[k].w+d[k].x));
}
for(k=l2;k<=r2;k++){
if(!x[id[k]])add(S,id[k],c[id[k]]*+in[id[k]]),add(id[k],T,);
else if(j&(<<x[id[k]]-))add(S,id[k],c[id[k]]*+in[id[k]]),add(id[k],T,inf);
else add(S,id[k],inf),add(id[k],T,);
}
w[i][j]=(now-dinic())/;
}
l1=r1+;l2=r2+;
}
}
memset(f,-0x3f,sizeof f);
for(i=;i<(<<K);i++)f[][][i]=w[][i];
for(i=;i<n;i++)
for(j=;j<=l&&j<=(i-)*K;j++)
for(s1=;s1<(<<K);s1++)if(f[i][j][s1]!=f[][][])
for(s2=;s2<(<<K);s2++)
getmax(f[i+][j+cnt[s1^s2]][s2],f[i][j][s1]+w[i+][s2]);
for(i=;i<(<<K);i++)ans=max(ans,f[n][l][i]);
}
printf("%d\n",ans);
return ;
}
bzoj4067 [Ctsc2015]gender的更多相关文章
- 4067: [Ctsc2015]gender 动态规划 网络流
国际惯例的题面:首先这题是缺少两个隐藏条件的:第一个是这k条链的起点和终点所在的层是对齐的,也就是说不会出现两条链错开的情况,且这张图恰好由n层组成:第二个就是任意一个点都包含在与链上的点直接或间接相 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 家长-Parents表增加字段Token,Gender,Email,Portrait
家长-Parents表增加字段Token,Gender,Email,Portrait ) ) ) )
- Saying that Java is nice because it works on every OS is like saying that anal sex is nice because it works on every gender.
Saying that Java is nice because it works on every OS is like saying that anal sex is nice because i ...
- Gender, Genre, and Writing Style in Formal Written Texts
http://u.cs.biu.ac.il/~koppel/papers/male-female-text-final.pdf Abstract. This paper explores di ...
- Data truncation: Data too long for column 'gender' at row 1 出现的原因
创建数据库的代码如下: create database day15 ; use day15 ; create table customer( id varchar(100) primary key, ...
- 报错pymysql.err.DataError: (1406, "Data too long for column 'gender' at row 1")
在Django默认的admin后台创建超级用户时, 报错pymysql.err.DataError: (1406, "Data too long for column 'gender' at ...
- django.db.utils.DataError: (1406, "Data too long for column 'gender' at row 1")
报错现象 在使用 django 创建 超级用户的时候提示报错 Password (again): ytyt521521 Traceback (most recent call last): File ...
- 创建Java不可变型的枚举类型Gender
创建Java不可变型的枚举类型,其实例如下: // 创建不可变型的枚举类 enum Gender { // 此处的枚举值必须调用对应的构造器来创建 MALE("男"), FEMAL ...
随机推荐
- getContext在谷歌浏览器中,使用时要先加载canvas对象,否则会提示'getContext is null'
<body> <canvas id=" style="border:1px solid #c3c3c3;"> Your browser does ...
- jQuery live()方法使用及变更(事件委托)
根据jQuery的官方描述,live方法在1.7中已经不建议使用,在1.9中删除了这个方法.并建议在以后的代码中使用on方法来替代. on方法可以接受三个参数:事件名.触发选择器.事件函数. 需要特别 ...
- miniui 给表格行添加监听事件的几种方法以及点击某列列名数据不能排序的问题
最近在使用miniui框架做开发,在做表格行的点击监听事件中发现了几个属性,都可以起到监听效果但是执行的结果却大有不同.好了废话不多说,直接上代码. <div id="pageGrid ...
- 数据库scheme设计(9.4 小结)
通过这一章的内容,希望能够让大家明白一个道理,“数据库系统的性能不是优化出来的,更多的是设计出来的”.数据库Schema 的设计并不如很多人想象的那样只是一个简单的对象对应实现,而是一个系统工程.要想 ...
- rsync的详细配置
服务器配置: yum install rsync 安装rsync vi /etc/rsyncd.conf 创建主配置文件 pid file = /var/run/rsyncd.pid port ...
- C 四则运算表达式解析器
下载实例:http://www.wisdomdd.cn/Wisdom/resource/articleDetail.htm?resourceId=1074 程序主要包括:基础结构定义.词法分析.语法分 ...
- php中获取用户登陆的IP地址以及常规处理
本文为原创,转载请注明! 在我们开发多站点业务网站中,经常需要获取客户端的ip地址来给用户推荐其所在地址的信息的业务,用php获取客户端的ip地址,我们一般用到的PHP内置方法是$_SERVER[' ...
- vscode 停用插件自动更新
- centOS7虚拟环境搭建
今天来记录一下使用WMware虚拟机来搭建centOS虚拟机的过程. 本次使用工具为VMware Workstation 14 Pro,可以从https://www.vmware.com/来获取所需工 ...
- ArcCore重构-Makefile模块化
基于官方arc-stable-9c57d86f66be,AUTOSAR版本3.1.5 基本问题 2. 编译系统中代码文件是否编译及目标文件集中定义在boards/board_common.mk,而 ...