description

洛谷

\[max_{1\le i<j\le n}\{\sum_{s=1}^{k-1}(C_s-|D_{is}-D_{js}|)-(C_k-|D_{ik}-D_{jk}|)\}
\]

data range

\[n\le 10^5,2\le k\le 5
\]

solution

拆绝对值。

一开始的想法是3维CDQ套线段树 5维偏序

对于前\(k-1\)位,直接\(2^{k-1}\)枚举每一个数的正负情况。

对于最后一位,排序即可拆掉绝对值。

居然还被卡了空间

Code

#include<bits/stdc++.h>
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<iomanip>
#include<cstring>
#include<complex>
#include<vector>
#include<cstdio>
#include<string>
#include<bitset>
#include<cassert>
#include<ctime>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<set>
#define F "a"
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define RG register
using namespace std;
typedef unsigned long long ull;
typedef pair<int,int> PI;
typedef vector<int>VI;
typedef long long ll;
typedef double dd;
const dd eps=1e-6;
const int mod=1e4;
const int N=1000010;
const dd pi=acos(-1);
const int inf=2147483647;
const ll INF=1e18+1;
const ll P=100000;
inline ll read(){
RG ll data=0,w=1;RG char ch=getchar();
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')w=-1,ch=getchar();
while(ch<='9'&&ch>='0')data=data*10+ch-48,ch=getchar();
return data*w;
} inline void file(){
srand(time(NULL)+rand());
freopen(F".in","r",stdin);
freopen(F".out","w",stdout);
} #define fi first
#define se second
int n,k,S,c[5],v[64],x,y,ans;
pair<int,int> pre[64],suf[64],L,R,Ans;
struct wild{int d[5],id;}w[N];
bool cmp(wild x,wild y){return x.d[k-1]<y.d[k-1];}
int main()
{
n=read();k=read();S=(1<<(k-1))-1;
for(RG int i=0;i<k;i++)c[i]=read();
for(RG int i=1;i<=n;i++){
w[i].id=i;
for(RG int j=0;j<k;j++)w[i].d[j]=c[j]*read();
}
sort(w+1,w+n+1,cmp);
for(RG int s=0;s<=S;s++)pre[s]=suf[s]=(PI){-1e9,0};
for(RG int i=1;i<=n;i++){
for(RG int s=0,f=S;s<=S;s++,f=((~s)&S)){
v[s]=0;
for(RG int j=0;j<k-1;j++)
(s&(1<<j))?v[s]+=w[i].d[j]:v[s]-=w[i].d[j];
if(ans<pre[f].fi+v[s]-w[i].d[k-1]){
ans=pre[f].fi+v[s]-w[i].d[k-1];
x=w[i].id;y=pre[f].se;
if(x>y)swap(x,y);
}
}
for(RG int s=0;s<=S;s++)
pre[s]=max(pre[s],(PI){v[s]+w[i].d[k-1],w[i].id});
}
for(RG int i=n;i;i--){
for(RG int s=0,f=S;s<=S;s++,f=((~s)&S)){
v[s]=0;
for(RG int j=0;j<k-1;j++)
(s&(1<<j))?v[s]+=w[i].d[j]:v[s]-=w[i].d[j];
if(ans<suf[f].fi+v[s]+w[i].d[k-1]){
ans=suf[f].fi+v[s]+w[i].d[k-1];
x=w[i].id;y=suf[f].se;
if(x>y)swap(x,y);
}
}
for(RG int s=0;s<=S;s++)
suf[s]=max(suf[s],(PI){v[s]-w[i].d[k-1],w[i].id});
}
printf("%d %d\n%d\n",x,y,ans);
return 0;
}

[WC2005]友好的生物的更多相关文章

  1. 洛咕 P4131 [WC2005]友好的生物

    洛咕 P4131 [WC2005]友好的生物 首先可以发现\(C\)是没有用的,可以乘进所有的权值里面做 考虑没有最后一维的限制,那么两个生物的友好值就是 \(\sum_{i=1}^k|a_i-b_i ...

  2. Luogu4131 WC2005 友好的生物 状压DP

    传送门 首先$C_i$是没有意义的,因为可以直接让$d_i \times= C_i$,答案也是一样的 所以我们现在考虑求$(\sum_{i=1}^{K-1} |d_{p,i}-d_{q,i}|) - ...

  3. bzoj5068: 友好的生物

    题目链接 bzoj5068: 友好的生物 题解 最大化这个东西\(\sum_{i=1}^{k-1} | a_{x,i}-a_{y,i} | - | a_{x,k}-a_{y,k} |\) 去掉绝对值号 ...

  4. [WC 2005]友好的生物

    Description $W$ 星球是一个和地球一样气候适宜.物种聚集的星球.经过多年的研究,外星生物学家们已经发现了数万种生物,而且这个数字还在不断增大. $W$ 星球上的生物很有趣,有些生物之间很 ...

  5. bzoj 5068: 友好的生物

    大意: n个生物, 每个生物有k种属性, 友好度通过下式计算. , C为给定非负数组, 求友好度最大值. k比较小, 求的是最大值并且$C_i$非负, 所以可以暴力枚举正负情况去绝对值号. #incl ...

  6. BZOJ.5068.友好的生物(思路)

    题目链接 \(Description\) 求\[\max\{\sum_{i=1}^{k-1}(C_i*|a_{x,i}-a_{y,i}|)-C_k*|a_{x,k}-a_{y,k}|\}\] \(So ...

  7. BZOJ5068: 友好的生物(状压 贪心)

    题意 题目链接 Sol 又是一道神仙题??.. 把绝对值拆开之后状压前面的符号?.. 下界显然,但是上界为啥是对的呀qwq.. #include<bits/stdc++.h> using ...

  8. NOIp2018集训test-9-23

    这个NOI模拟题怕是比你们的NOIp模拟题要简单哦.. 友好的生物 应该是一道简单题,但是机房只有辉神一个人想到正解似乎. 被我kd-tree水过去了(这不是kd-tree的裸题吗???(不是)) / ...

  9. [Z] 北大一牛人生物转申CS的经历

    http://www.bdwm.net/bbs/bbscon.php?board=CIS&file=M.1367038121.A&num=626&attach=0&di ...

随机推荐

  1. zabbix经常报警elasticsearch节点TCP连接数过高问题

    单服务器最大tcp连接数及调优汇总 单机最大tcp连接数 网络编程 在tcp应用中,server事先在某个固定端口监听,client主动发起连接,经过三路握手后建立tcp连接.那么对单机,其最大并发t ...

  2. Oracle锁表处理

    最近系统连续出现好几次锁表,昨晚又发生一次锁表,11点钟跑到客户现场,进过跟踪发现导致这次锁表的机器和上一次是同一台,花了近半小时解锁.之后到科室找到那台机器看看情况,发现那台机器速度超慢,保存一份病 ...

  3. Bing wallpaper api

    list: http://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=zh-cn idx:-1为明天,1为 ...

  4. Java开发工程师(Web方向) - 04.Spring框架 - 第3章.AOP技术

    第3章--AOP技术 Spring框架 - AOP概述 笔记https://my.oschina.net/hava/blog/758873Spring框架 - AOP使用 笔记https://my.o ...

  5. leetcode-累加数(C++)

    累加数是一个字符串,组成它的数字可以形成累加序列. 一个有效的累加序列必须至少包含 3 个数.除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和. 给定一个只包含数字 '0'-'9'  ...

  6. [HNOI2017]影魔

    题意: 给定 \(n\) 个数的排列,\(m\) 次询问,每次询问询问一个区间内所有子区间的贡献. 每个区间如果两个端点分别是最大值和次大值,我们就算 \(P1\) 的贡献. 如果两个端点一个是最大值 ...

  7. 饥饿的小易(枚举+广度优先遍历(BFS))

    题目描述 小易总是感觉饥饿,所以作为章鱼的小易经常出去寻找贝壳吃.最开始小易在一个初始位置x_0.对于小易所处的当前位置x,他只能通过神秘的力量移动到 4 * x + 3或者8 * x + 7.因为使 ...

  8. LogisticRegression Algorithm——机器学习(西瓜书)读书笔记

    import numpy as np from sklearn.datasets import load_breast_cancer import sklearn.linear_model from ...

  9. 系统滴答定时器(SysTick)中断配置

    系统滴答定时器(SysTick)中断配置 在STM32标准库中是通过SysTick_Config()函数配置时钟中断的,然后SysTick_Handler()函数自动定时触发其中的函数. if(Sys ...

  10. Java经典问题

    1.JAVA初学者都应该搞懂的问题 对于这个系列里的问题,每个学Java的人都应该搞懂.当然,如果只是学Java玩玩就无所谓了.如果你认为自己已经超越初学者了,却不很懂这些问题,请将你自己重归初学者行 ...