好神的一道题啊!

我们发现题目中的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的更多相关文章

  1. 4067: [Ctsc2015]gender 动态规划 网络流

    国际惯例的题面:首先这题是缺少两个隐藏条件的:第一个是这k条链的起点和终点所在的层是对齐的,也就是说不会出现两条链错开的情况,且这张图恰好由n层组成:第二个就是任意一个点都包含在与链上的点直接或间接相 ...

  2. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  3. 家长-Parents表增加字段Token,Gender,Email,Portrait

    家长-Parents表增加字段Token,Gender,Email,Portrait ) ) ) )

  4. 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 ...

  5. 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 ...

  6. Data truncation: Data too long for column 'gender' at row 1 出现的原因

    创建数据库的代码如下: create database day15 ; use day15 ; create table customer( id varchar(100) primary key, ...

  7. 报错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 ...

  8. django.db.utils.DataError: (1406, "Data too long for column 'gender' at row 1")

    报错现象 在使用 django 创建 超级用户的时候提示报错 Password (again): ytyt521521 Traceback (most recent call last): File ...

  9. 创建Java不可变型的枚举类型Gender

    创建Java不可变型的枚举类型,其实例如下: // 创建不可变型的枚举类 enum Gender { // 此处的枚举值必须调用对应的构造器来创建 MALE("男"), FEMAL ...

随机推荐

  1. Java IO学习--(五)字节和字符数组

    内容列表 从InputStream或者Reader中读入数组 从OutputStream或者Writer中写数组 在java中常用字节和字符数组在应用中临时存储数据.而这些数组又是通常的数据读取来源或 ...

  2. jquery 滚动事件

    $(window).scroll(function () { if ($(window).scrollTop() >50) {  alert('show!!'); }});

  3. 在 javascript 中,为什么 [1,2] + [3,4] 不等于 [1,2,3,4]?

    在 stackoverflow 上有人提问:arrays - Why does [1,2] + [3,4] = "1,23,4" in JavaScript? 问题 我想将一个数组 ...

  4. Day8 封装 静态属性property

    封装:将类的属性隐藏 #先看如何隐藏 1,在定义的属性之前加入__. class Foo: __N=111111 #_Foo__N def __init__(self,name): self.__Na ...

  5. Django升级1.9.6出现的中文本地化bug

    Error日志: Error opening file for reading: Permission denied ERROR Internal Server Error: / Traceback  ...

  6. php获取汉字首字母实例

    在我们实际开发工作中,有时候需要获取输入汉字的首字母,然后存到库中,方便用户搜索相关信息,下面给出php代码,留做备用: //新添加获取汉子首字,首字字母 function pinyin($zh){ ...

  7. 代码质量管理平台SonarQube的安装、配置与使用

    SonarQube是管理代码质量一个开放平台,可以快速的定位代码中潜在的或者明显的错误,下面将会介绍一下这个工具的安装.配置以及使用. 准备工作: 1.jdk(不再介绍) 2.sonarqube:ht ...

  8. SQL Server 表的管理_关于表的操作增删查改的操作的详解(案例代码)

    SQL Server 表的管理_关于表的操作增删查改的操作的详解(案例代码) 概述: 表由行和列组成,每个表都必须有个表名. SQL CREATE TABLE 语法 CREATE TABLE tabl ...

  9. esayui扩展验证方法

    下面是关于平时中积累的esayui扩展验证方法仅作记录:       /**************************************************************** ...

  10. Collections.synchronizedMap()、ConcurrentHashMap、Hashtable之间的区别

    为什么要比较Hashtable.SynchronizedMap().ConcurrentHashMap之间的关系?因为常用的HashMap是非线程安全的,不能满足在多线程高并发场景下的需求. 那么为什 ...