>

巴邻旁之桥,圈地计划

- 编辑:www.bifa688.com -

巴邻旁之桥,圈地计划

bzoj4071[APIO2015]巴邻旁之桥

 

BZOJ4753: [Jsoi2016]顶级团队,bzoj4753jsoi二〇一四

Time Limit: 20 Sec  Memory Limit: 512 MB
Submit: 844  Solved: 318
[Submit][Status][Discuss]

bzoj2132 圈地计划

 

4071: [Apio2015]巴邻旁之桥

Time Limit: 20 Sec Memory Limit: 256 MB
Submit: 99 Solved: 45
[Submit][Status][Discuss]

Description

JSOI音讯学代表队一共有N名候选人,那几个候选人从1到N编号。方便起见,JYY的编号是0号。每一个候选人都由一人编号比她小的候选人Ri推荐。假设Ri=0则注脚那么些候选人是JYY本人爱上的。为了确认保证组织的调治将养,JYY要求保障, 倘诺招募了候选人i,那么候选人Ri"也不容置疑须求在协会中。当然了,JYY自身总是在协会里的。每一个候选人都有二个交战值Pi",也是有贰个招募成本Si"。JYY希望招募K个候选人(JYY自个儿不算),组成叁天性能价格比最高的团组织。 也正是,那K个被JYY选用的候选人的总战役值与总招募总费用的比值最大。  

 

2132: 圈地安排

Time Limit: 2 Sec Memory Limit: 256 MB
Submit: 661 Solved: 295
[Submit][Status][Discuss]

Description

一条东西走向的穆西河将巴邻旁市一分为二,分割成了区域 A 和区域 B。

每一块区域沿着河岸都建了恰好 一千000001 栋的建筑,每条岸边的建筑都从 0 编号到 1000000000。相邻的每对建筑相隔 1 个单位距离,河的大幅也是 1 个单位长度。区域 A 中的 i 号建筑物恰好与区域 B 中的 i 号建筑物隔河相对。 城市中有 N 个居民。第 i 个市民的屋宇在区域 Pi 的 Si 号建筑上,同期他的办公室位于在 Qi 区域的 Ti 号建筑上。贰个市民的房子和办公大概布满在河的相互,那样他就必供给搭乘船舶才具从家庭去往办公室,这种景色让十分的多人都觉着不便于。为了使市民们能够驾驶去职业,政党调控建造不当先K 座横跨河流的桥梁。 由于技艺上的由来,每一座桥必得刚好连接河的两侧,桥梁必得严谨垂直于河流,并且桥与桥中间不可能相交。当政坛构筑最多 K 座桥之后,设 Di 表示第 i 个居民此时驾乘从家里到办公室的最短距离。请协理当局构筑桥梁,使得 D1 D2 ? DN 最小。

Input

输入一行蕴含七个正整数K和N。 接下来N行,个中第i行李包裹蕴3个整数Si,Pi,Ri代表候选人i的招收花费,战争值和推荐人编号。 对于百分之百的数据满意1≤K≤N≤2500,0<"Si,Pi"≤10^4,0≤Ri<i    

 

Description

近日房土地资金财产商GDOI(Group of Dumbbells Or Idiots)从NOI(Nuts Old Idiots)手中得到了一块开采土地。据掌握,那块土地是一块矩形的区域,能够驰骋划分为N×M块小区域。GDOI要求将那几个区域分为商业区和工业区来开辟。依据分歧的地形条件,每块小区域建商业区和工业区能博取分裂的经济价值。更具体点,对于第i行第j列的区域,建造商业区将获取Aij收益,建造工业区将收获Bij收益。其余分裂的区域连在一同能够得到额外的进项,即固然区域(I,j)相邻(相邻是指四个格子有国有边)有K块(显著K不抢先4)类型不一样于(I,j)的区域,则那块区域能充实k×Cij收益。经过Tiger.S教授的勘察,收益矩阵A,B,C都早已知晓了。你能帮GDOI求出一个收入最大的方案么?

Input

输入的率先行饱含四个正整数 K 和 N,分别表示桥的上限数量和市民的数目。

接下去 N 行,每一行富含多个参数:Pi,Si,Qi 和 Ti,表示第 i 个市民的房舍在区域 Pi 的 Si 号建筑上,且她的办公位于 Qi 区域的 Ti 号建筑上。

Output

出口一行叁个实数,表示最好比值。答案保留三人小数。  

 

Input

输入第一行事八个整数,分别为正整数N和M,分别代表区域的行数和列数;第2到N 1列,每行M个整数,表示商业区受益矩阵A;第N 2到2N 1列,每行M个整数,表示工业区收益矩阵B;第2N 2到3N 1行,每行M个整数,表示相邻额外收入矩阵C。第一行,多个整数,分别是n和m(1≤n,m≤100);

另外数字不超过一千”的限定

Output

输出仅为一行,包括二个大背头,表示 D1 D2 ? DN 的小不点儿值。

Sample Input

1 2
1000 1 0
1 1000 1

Output

输出只有一行,包涵二个子弹头,为最大受益值。

Sample Input

1 5
B 0 A 4
B 1 B 3
A 5 B 7
B 2 A 6
B 1 A 7

Sample Output

0.001

Sample Input

3 3
1 2 3
4 5 6
7 8 9
9 8 7
6 5 4
3 2 1
1 1 1
1 3 1
1 1 1

Sample Output

24

HINT

 

2017.9.12新增加少一组 By GXZlegend

 

Sample Output

81
【数据规模】
对于100%的数量有N,M≤100

HINT

 

子任务

不无数据都有限支持:Pi 和 Qi 为字符 “A” 和 “B” 中的一个, 0≤Si,Ti≤一千000000,同一栋建筑内或者有超越 1 间屋子或办公室(或双方的结缘,即房屋或办公的数目同不经常间超越等于 1)。

子任务 1 (8 分)
K=1
1≤N≤1000
子任务 2 (14 分)
K=1
1≤N≤100000
子任务 3 (9 分)
K=2
1≤N≤100
子任务 4 (32 分)
K=2
1≤N≤1000
子任务 5 (37 分)
K=2
1≤N≤100000

 

Source

 

相应是相比裸的难题 01分数规划 树形正视公文包。 01分数规划的话遵照套路二分查验,注意设置好精度 树形重视马鞍包注目的在于枚举的时候上限应该在枚举之后改变否则会被卡成$O(N^3log ans)$    

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=1e6 10,INF=1e4 10;
inline char nc()
{
    static char buf[MAXN],*p1=buf,*p2=buf;
    return p1==p2&&(p2=(p1=buf) fread(buf,1,MAXN,stdin),p1==p2)?EOF:*p1  ;
}
inline int read()
{
    char c=nc();int x=0,f=1;
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=nc();}
    while(c>='0'&&c<='9'){x=x*10 c-'0';c=nc();}
    return x*f;
}
int N,K;
int S[MAXN],P[MAXN],R[MAXN];
struct node
{
    int u,v,nxt;
}edge[MAXN];
int head[MAXN];
int num=1;
inline void AddEdge(int x,int y)
{
    edge[num].u=x;
    edge[num].v=y;
    edge[num].nxt=head[x];
    head[x]=num  ;
}
double dp[2501][2501],/*i处,选了j个*/siz[MAXN],w[MAXN];
void find(int now)
{
    siz[now]=1;
    for(int i=head[now];i!=-1;i=edge[i].nxt)
        find(edge[i].v),siz[now] =siz[edge[i].v];
}
void dfs(int now)
{
    int tot=0,b=0;
    if(now) dp[now][1]=w[now],tot=1,b  ;
    else dp[now][0]=0;
    for(int i=head[now];i!=-1;i=edge[i].nxt)
    {
        dfs(edge[i].v);
        for(int j=tot;j>=b;j--)//背包容量 
            for(int k=1;k<=siz[edge[i].v];k  )
                dp[now][j k]=max(dp[now][j k],dp[now][j] dp[edge[i].v][k]);
        tot =siz[edge[i].v];//必须在后面加 
    }
}
bool check(double val)
{
    memset(dp,0xc2,sizeof(dp));
    for(int i=1;i<=N;i  ) w[i]=P[i]-val*S[i];
    dfs(0);
    return dp[0][K]>=0;
}
int main()
{
    #ifdef WIN32
    freopen("a.in","r",stdin);
    #else 
    #endif
    memset(head,-1,sizeof(head));
    K=read(),N=read();
    for(int i=1;i<=N;i  )
    {
        S[i]=read(),P[i]=read(),R[i]=read();
        AddEdge(R[i],i);
    }
    find(0);
    double l=0,r=INF;
    double ans=0;
    while(r-l>1e-5)
    {
        double mid=(l r)/2;
        if(check(mid)) l=mid;
        else r=mid;    
    }
    printf("%.3lf",(l r)/2);
     return 0;
}

 

: [Jsoi2016]极品团队,bzoj4753jsoi二〇一六Time Limit:20 Sec Memory Limit:512 MB Submit:844 Solved:318 [Submit][Status][Discuss] Description JSOI新闻学代表队一共有...

HINT

数量已进步,天公地道测--贰零壹伍.5.15

Source

 

 

 

 

先是假诺办公室和家在同一侧,直接将距离加到答案中就可以。

那正是说办公室和家不在同一侧应该如何消除吧?对于k=1,显明只须求将桥建在颇具职位的中位数就可以。

对此k=2,能够窥见种种人都会挑选距离家和办公中式茶食较近的桥行走。那么大家就足以根据家和办公中点将各样人排序,枚举分割点,将分割点前后的人按k=1的意况分别管理。难点就转载动态维护区间中位数了,能够用平衡树管理。(方法类似bzoj1112)

那道题将全数人按中心排序的思路很好。

 

 

 

#include
#include
#include
#include
#include
#include
#define F(i,j,n) for(int i=j;i<=n;i  )
#define D(i,j,n) for(int i=j;i>=n;i--)
#define LL long long
#define MAXN 200100
using namespace std;
int n,root,tot,cnt=0;
LL m,x,y,ans=0,mn,a[MAXN],f1[MAXN],f2[MAXN];
char cx,cy;
struct tree_type
{
 int l,r;
 LL s,rnd,sum,v,w;
}t[MAXN];
struct node
{
 LL x,y;
}b[MAXN];
inline LL read()
{
 LL ret=0,flag=1;char ch=getchar();
 while (ch<'0'||ch>'9'){if (ch=='-') flag=-1;ch=getchar();}
 while (ch>='0'&&ch<='9'){ret=ret*10 ch-'0';ch=getchar();}
 return ret*flag;
}
inline char readch()
{
 char ch=getchar();
 while (ch!='A'&&ch!='B') ch=getchar();
 return ch;
}
inline void solve1()
{
 F(i,1,n)
 {
  cx=readch();x=read();cy=readch();y=read();
  if (cx==cy) ans =abs(x-y);
  else a[  cnt]=x,a[  cnt]=y,ans  ;
 }
 sort(a 1,a cnt 1);
 F(i,1,cnt) ans =abs(a[i]-a[cnt>>1]);
 printf("%lldn",ans);
}
inline bool cmp(node n1,node n2){return n1.x n1.yx){ins(t[k].l,x);if (t[t[k].l].rnd1){t[k].s--;t[k].w--;t[k].sum-=x;}
  else if (!t[k].l||!t[k].r) k=t[k].l t[k].r;
  else if (t[t[k].l].rnd=x){m =t[t[k].l].sum (x-ln)*t[k].v;return t[k].v;}
 else if (ln>=x) return getans(t[k].l,x);
 else{m =t[t[k].l].sum t[k].w*t[k].v;return getans(t[k].r,x-ln-t[k].w);}
}
inline LL calc(int q)
{
 m=0;
 LL tmp=getans(root,q);
 LL ret=t[root].sum-m*2;
 return ret;
}
inline void solve2()
{
 F(i,1,n)
 {
  cx=readch();x=read();cy=readch();y=read();
  if (cx==cy) ans =abs(x-y);
  else b[  cnt].x=x,b[cnt].y=y,ans  ;
 }
 sort(b 1,b cnt 1,cmp);
 f1[0]=root=tot=0;
 F(i,1,cnt)
 {
  ins(root,b[i].x);ins(root,b[i].y);
  f1[i]=calc(i);
 }
 f2[cnt 1]=root=tot=0;
 D(i,cnt,1)
 {
  ins(root,b[i].x);ins(root,b[i].y);
  f2[i]=calc(cnt-i 1);
 }
 mn=f1[0] f2[1];
 F(i,1,cnt) mn=min(f1[i] f2[i 1],mn);
 ans =mn;
 printf("%lldn",ans);
}
int main()
{
 LL ff=read();
 n=read();
 if (ff==1) solve1();
 else solve2();
}

 

4071: [Apio2015]巴邻旁之桥 Time Limit: 20 Sec Memory Limit: 256 MB Submit: 99 Solved: 45 [Submit][必发88手机版,Status][Discuss] Description 一条东西走向...

Source

和bzoj一九七六能量魔方类似,可是那道题是二维的。

我们先将全体一点点黑白染色。对于黑点i,从s到i连权值为a[i]的边,从i到t连权值为b[i]的边;对于白点i,从s到i连权值为b[i]的边,从i到t连权值为a[i]的边。对于隔壁的四个点i和j,从i到j、从j到i分别连权值为c[i] c[j]的边。

终极跑叁遍最小割,从开始时期的总纯收入中减去最小割。

#include
#include
#include
#include
#include
#include
#include
#define F(i,j,n) for(int i=j;i<=n;i  )
#define D(i,j,n) for(int i=j;i>=n;i--)
#define ll long long
#define pa pair
#define maxn 10100
#define maxm 100100
#define inf 1000000000
#define f(x,y) (x-1)*m y
using namespace std;
struct edge_type
{
 int next,to,v;
}e[maxm];
int head[maxn],cur[maxn],dis[maxn],a[105][105];
int n,m,s,t,x,cnt=1,ans=0,tot=0;
inline int read()
{
 int x=0,f=1;char ch=getchar();
 while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
 while (ch>='0'&&ch<='9'){x=x*10 ch-'0';ch=getchar();}
 return x*f;
}
inline void add_edge(int x,int y,int v1,int v2)
{
 e[  cnt]=(edge_type){head[x],y,v1};head[x]=cnt;
 e[  cnt]=(edge_type){head[y],x,v2};head[y]=cnt;
}
inline bool bfs()
{
 queueq;
 memset(dis,-1,sizeof(dis));
 dis[s]=0;q.push(s);
 while (!q.empty())
 {
  int tmp=q.front();q.pop();
  if (tmp==t) return true;
  for(int i=head[tmp];i;i=e[i].next) if (e[i].v&&dis[e[i].to]==-1)
  {
   dis[e[i].to]=dis[tmp] 1;
   q.push(e[i].to);
  }
 }
 return false;
}
inline int dfs(int x,int f)
{
 if (x==t) return f;
 int tmp,sum=0;
 for(int &i=cur[x];i;i=e[i].next)
 {
  int y=e[i].to;
  if (e[i].v&&dis[y]==dis[x] 1)
  {
   tmp=dfs(y,min(f-sum,e[i].v));
   e[i].v-=tmp;e[i^1].v =tmp;sum =tmp;
   if (sum==f) return sum;
  }
 }
 if (!sum) dis[x]=-1;
 return sum;
}
inline void dinic()
{
 while (bfs())
 {
  F(i,1,t) cur[i]=head[i];
  ans =dfs(s,inf);
 }
}
int main()
{
 n=read();m=read();
 s=n*m 1;t=s 1;
 F(i,1,n) F(j,1,m)
 {
  x=read();
  tot =x;
  if ((i j)&1) add_edge(s,f(i,j),x,0);
  else add_edge(f(i,j),t,x,0);
 }
 F(i,1,n) F(j,1,m)
 {
  x=read();
  tot =x;
  if ((i j)&1) add_edge(f(i,j),t,x,0);
  else add_edge(s,f(i,j),x,0);
 }
 F(i,1,n) F(j,1,m) a[i][j]=read();
 F(i,1,n) F(j,1,m-1)
 {
  int tmp=a[i][j] a[i][j 1];
  tot =tmp;
  add_edge(f(i,j),f(i,j 1),tmp,tmp);
 }
 F(i,1,n-1) F(j,1,m)
 {
  int tmp=a[i][j] a[i 1][j];
  tot =tmp;
  add_edge(f(i,j),f(i 1,j),tmp,tmp);
 }
 dinic();
 printf("%dn",tot-ans);
}

 

圈地布署 2132: 圈地安排 Time Limit: 2 Sec Memory Limit: 256 MB Submit: 661 Solved: 295 [Submit][Status][Discuss] Description 这几天房地产商GDOI(Group of Dumbbe...

本文由必发88手机版发布,转载请注明来源:巴邻旁之桥,圈地计划