[WC2005]友好的生物
description
洛谷
求
\]
data range
\]
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]友好的生物的更多相关文章
- 洛咕 P4131 [WC2005]友好的生物
洛咕 P4131 [WC2005]友好的生物 首先可以发现\(C\)是没有用的,可以乘进所有的权值里面做 考虑没有最后一维的限制,那么两个生物的友好值就是 \(\sum_{i=1}^k|a_i-b_i ...
- Luogu4131 WC2005 友好的生物 状压DP
传送门 首先$C_i$是没有意义的,因为可以直接让$d_i \times= C_i$,答案也是一样的 所以我们现在考虑求$(\sum_{i=1}^{K-1} |d_{p,i}-d_{q,i}|) - ...
- bzoj5068: 友好的生物
题目链接 bzoj5068: 友好的生物 题解 最大化这个东西\(\sum_{i=1}^{k-1} | a_{x,i}-a_{y,i} | - | a_{x,k}-a_{y,k} |\) 去掉绝对值号 ...
- [WC 2005]友好的生物
Description $W$ 星球是一个和地球一样气候适宜.物种聚集的星球.经过多年的研究,外星生物学家们已经发现了数万种生物,而且这个数字还在不断增大. $W$ 星球上的生物很有趣,有些生物之间很 ...
- bzoj 5068: 友好的生物
大意: n个生物, 每个生物有k种属性, 友好度通过下式计算. , C为给定非负数组, 求友好度最大值. k比较小, 求的是最大值并且$C_i$非负, 所以可以暴力枚举正负情况去绝对值号. #incl ...
- 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 ...
- BZOJ5068: 友好的生物(状压 贪心)
题意 题目链接 Sol 又是一道神仙题??.. 把绝对值拆开之后状压前面的符号?.. 下界显然,但是上界为啥是对的呀qwq.. #include<bits/stdc++.h> using ...
- NOIp2018集训test-9-23
这个NOI模拟题怕是比你们的NOIp模拟题要简单哦.. 友好的生物 应该是一道简单题,但是机房只有辉神一个人想到正解似乎. 被我kd-tree水过去了(这不是kd-tree的裸题吗???(不是)) / ...
- [Z] 北大一牛人生物转申CS的经历
http://www.bdwm.net/bbs/bbscon.php?board=CIS&file=M.1367038121.A&num=626&attach=0&di ...
随机推荐
- LeetCode: 29. Divide Two Integers (Medium)
1. 原题链接 https://leetcode.com/problems/divide-two-integers/description/ 2. 题目要求 给出被除数dividend和除数divis ...
- sqlite helper
//-------------------------------------------------------------------------- // // Copyright (c) BUS ...
- linux常用的命令之一chmod
用权限 : 所有使用者 使用方式 : chmod [-cfvR] [--help] [--version] mode file... u 表示该档案的拥有者,g 表示与该档案的拥有者属于同一个群体(g ...
- Shader Forge学习
最近学习了一下shader forge,一个屌屌哒插件用来生成shader.尽管其降低了制作shader的难度,但是真的想做出满意的shader的话还是得有一定的shader基础.但是仅仅是做出一些简 ...
- win 下通过dos命令格式化磁盘
该命令可以解决好多问题,比如: 1.u盘作为启动后,如何恢复成正常的u盘 1.win + r ->cmd 进入dos模式 2.输入diskpart后回车,点击确定,进入diskpart命令的交互 ...
- 使用JavaScript判断手机是处于横屏还是竖屏
移动端的浏览器一般都支持window.orientation这个参数,通过这个参数可以判断出手机是处在横屏还是竖屏状态.从而根据实际需求而执行相应的程序.通过添加监听事件onorientationch ...
- LeetCode - 442. Find All Duplicates in an Array - 几种不同思路 - (C++)
题目 题目链接 Given an array of integers, 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and ...
- leetcode个人题解——#5 Container with most water
class Solution { public: string longestPalindrome(string s) { int length = s.length(); ) return s; ; ...
- JQuery文本框验证
<" CODEPAGE="936"%><!--#include file="conncon.asp"--><!--#in ...
- 【转】NodeJS on Nginx: 使用nginx反向代理处理静态页面
最近OurJS后台已经从纯node.js迁移到了Nginx+NodeJS上来了,感觉性能提升了不少,特与大家分享. Nginx ("engine x") 是一个高性能的 HTTP ...