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 ...
随机推荐
- 理解java值传递与引用传递
1.基本类型和引用类型在内存中的保存 Java中数据类型分为两大类,基本类型和对象类型.相应的,变量也有两种类型:基本类型和引用类型.基本类型的变量保存原始值,即它代表的值就是数值本身:而引用类型的变 ...
- PLSQL学习教程(全)
基于ORACLE9i+PL/SQLDeveloper7.1.4) 课程 一 PL/SQL 基本查询与排序 本课重点: 1.写SELECT语句进行数据库查询 2.进行数学运算 3.处理空值 4.使用别名 ...
- python抽象类+抽象方法实现接口(interface)
#python没有类似于java和C#的接口类(interface),需要使用抽象类 和抽象方法来实现接口功能 #!/usr/bin/env python#_*_ coding:utf-8 _*_ f ...
- No plugin found for prefix 'tomcat' in the current project and in the plugin groups和java.net.BindException: Address already in use: JVM_Bind <null>:8080的错误解决
错误报告:No plugin found for prefix 'tomcat' in the current project and in the plugin groups [org.apache ...
- 如何使你的Ajax应用内容可让搜索引擎爬行
This document outlines the steps that are necessary in order to make your AJAX application crawlable ...
- Jmeter——HTTP协议的接口压力测试环境搭建
文章版权由作者小小小丝和博客园共有,若转载请于明显处标明出处:http://rpc.cnblogs.com/metaweblog/xxxs JDK 是整个Java的核心,包括了Java运行环境.Ja ...
- [开源]基于ffmpeg和libvlc的视频剪辑、播放器
[开源]基于ffmpeg和libvlc的视频剪辑.播放器 以前研究的时候,写过一个简单的基于VLC的视频播放器.后来因为各种项目,有时为了方便测试,等各种原因,陆续加了一些功能,现在集成了视频播放.视 ...
- Pescal Triangle Two
Description: Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3 ...
- PermutationTwo
Description: Given a collection of numbers that might contain duplicates, return all possible unique ...
- Solr(六)Solr索引数据存放到HDFS下
Solr索引数据存放到HDFS下 一 新建solr core hdfs 方法:http://www.cnblogs.com/Matchman/p/7287385.html 二 修改solrconfig ...