好神的一道题啊!

我们发现题目中的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. Android之动画

    Android的动画可以分为三种,View动画.帧动画.属性动画.View动画通过对场景里的对象不断做图像变化(平移.缩放.旋转.透明度)从而产生动画效果,它是一种渐进式动画,而且View动画支持自定 ...

  2. JavaScript 将两个数组合并,且删除重复的值

    var a=[1,2,3,4,5,8,9,10]; var b=[6,7,8,9,10]; var c = a.concat(b);//合并成一个数组 console.log(c) temp = {} ...

  3. FFPLAY的原理(三)

    播放声音 现在我们要来播放声音.SDL也为我们准备了输出声音的方法.函数SDL_OpenAudio()本身就是用来打开声音设备的.它使用一个叫做SDL_AudioSpec结构体作为参数,这个结构体中包 ...

  4. python---面向对象高级进阶

    静态方法,调用静态方法后,该方法将无法访问类变量和实例变量 class Dog(object): def __init__(self,name): self.name = name def eat(s ...

  5. Django中的Python高级特性

    本小文的内容实际是作为<Pro Django>第二版第二章的读书笔记简单总结. 1.类的构建:元类,使用带元类的基类----这个特性的案例主要就是models.Model类,用这种方式高效 ...

  6. CRM客户关系管理系统(九)

    第九章.filter_horizontal优化和kingadmin删除功能 9.1.filter_horizontal优化 (1)添加Choose ALL 和Remove ALL table_obj_ ...

  7. MySQL 8 新特性之持久化全局变量的修改

    在8之前的版本中,对于全局变量的修改,其只会影响其内存值,而不会持久化到配置文件中.数据库重启,又会恢复成修改前的值.从8开始,可通过SET PERSIST命令将全局变量的修改持久化到配置文件中. 试 ...

  8. js相关

    记录工作中用到的js实用方法: 1. 判断包含:indexOf "https".indexOf("http") 包含结果为0,不包含结果为-1: 通常用(&qu ...

  9. python3 爬去QQ音乐

    import requests import re import json import os def get_name(singer): url = 'https://c.y.qq.com/soso ...

  10. nginx常用配置系列-虚拟主机

    本来准备详尽的出一份nginx配置讲解,但nginx功能配置繁多,平常使用中使用最多的一般有: 1. 虚拟主机配置 2. HTTPS配置 3. 静态资源处理 4. 反向代理 ============= ...