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 ...
随机推荐
- 【程序员札记#学习&&塑形# 】2018年5月04号
回顾 工作:pendding 学习:看算法导论第一章,leetcode还在做(本身翻译错误,被误导了). 体会: 1) 浩俊之前推荐让我看的<算法导论>,昨天再回过头看,里面很多确 ...
- remove Nth Node from linked list从链表中删除倒数第n个元素
Given a linked list, remove the nth node from the end of list and return its head. For example, Give ...
- 前端到docker入门
Docker的诞生 我们总是会遇到测试对开发说项目又不work了,开发总说:在我电脑上是ok的阿. 项目组加了新人,我们就需要教新人配置各种开发环境,每换一台机器就要配置一次,每来一个新人就要配置一次 ...
- Nginx SSL功能支持的一些资料。
http://wiki.nginx.org/HttpSslModulehttp://zou.lu/nginx-https-ssl-module/http://www.21andy.com/blog/2 ...
- 利用arcserver 自带tomcat实现上传shapefile、cad等文件,然后用soe解析。
一.功能实现分析 1.soe中传入指定路径目录和文件名就能读取shp.cad并解析,然后返回JSON格式数据给flex端生成图形.(soe读取的是本地绝对路径) 2.所以首先要上传文件到soe发布所在 ...
- C#的一些小知识
一.Server.MapPath E:\MyProject\GisSystem\Json\jsonlist.aspx,GisSystem项目下有个Json文件夹,文件夹下有个jsonlist.aspx ...
- Linnux入门之简介
一.Linux简介 Minix(教授实验) -> Linux(大三学生Linus)企鹅作为吉祥物 linux主要分为内核版本和发行版本 linux 内核版本 :官网下载:https://www. ...
- CentOS的启动流程
因6和7俩个系列的启动流程有区别,所以我把他们分开来写 linux可看作是内核和根文件系统组成我们把内核单独拿出来总结一下 CentOS6系列启动流程 首先总结一下总体的流程,接下来展开来叙述:POS ...
- 树莓派创建WiFi热点
将代码clone到本地 git clone https://github.com/oblique/create_ap cd create_ap make install 安装依赖的库 有些源中可能使用 ...
- JaveScript基础(2)之数据类型转换和常用字符串的操作方法
1.JaveScript数据类型转换: A.转字符串:通过"+"或toString(); PS:如果都是数值类型,'+'会进行求和运算,否则会做字符串连接: var s=2.5;d ...