首页 > 其他分享 >洛谷 P9020 - [USACO23JAN] Mana Collection P

洛谷 P9020 - [USACO23JAN] Mana Collection P

时间:2023-07-20 12:44:13浏览次数:48  
标签:洛谷 法力 pt int sum P9020 USACO23JAN MAXN dp

显然,每个法力池最终能收集到的法力只与这个法力池最终被收集到的时间有关。

对于一组询问 \((s,e)\),假设我们经过了 \(k\) 个法力池,我们钦定最终被收集到的时间从后到前分别是 \(e=a_1,a_2,\cdots,a_k\),那么最大法力值为 \(\sum\limits_{i=1}^kc_{a_i}·\sum\limits_{j=2}^i(s-dis(a_j,a_{j-1}))\),当然,由于只有 \(s\) 秒的限制,所以要求 \(\sum\limits_{i=2}^kdis(a_i,a_{i-1})\le s\),但是我们发现这个限制其实没有用,因为减到零以下对答案贡献为负数,肯定不优。因此我们抛开 \(s\) 的限制直接状压 \(dp\):\(dp_{S,t}\) 表示目前包含了 \(S\) 中的法力池,当前在 \(t\) 的最大收益,那么有 \(dp_{S,t}-sumc_S·dis(x,t)\to dp_{S\cup x,x}\),其中 \(sumc_S\) 表示 \(S\) 中的法力值的 \(c_i\) 之和,最终答案即为 \(\max_{e\in S}\max_{x\in S}\{sumc_S·s+dp_{S,x}\}\),初始值 \(dp_{\{e\},e}=0\),其他全为 \(-\infty\)。然后你发现这个 DP 过程只与 \(e\) 有关,与 \(s\) 无关,所以对每个 \(e\) 做遍 DP 然后建个凸包即可。

时间复杂度 \(O(n^3+2^nn^2+q\log q)\)。

typedef __int128_t i128;
const int MAXN=18;
const int MAXP=262144;
const int MAXM=2e5;
int n,m,a[MAXN+5];vector<pii>g[MAXN+5],qv[MAXN+5];
i128 sum[MAXP+5],dp[MAXP+5][MAXN+5],dis[MAXN+5][MAXN+5],res[MAXM+5];
ld slope(pair<i128,i128>x,pair<i128,i128> y){return 1.0*(y.se-x.se)/(y.fi-x.fi);}
void _print(i128 x){if(!x)return;_print(x/10);putchar(x%10+'0');}
void print(i128 x){if(!x)putchar('0');else _print(x);}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
	memset(dis,63,sizeof(dis));for(int i=1;i<=n;i++)dis[i][i]=0;
	for(int i=1,u,v,w;i<=m;i++){scanf("%d%d%d",&u,&v,&w);chkmin(dis[u][v],w);}
	for(int k=1;k<=n;k++)for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)
		chkmin(dis[i][j],dis[i][k]+dis[k][j]);
	for(int i=0;i<(1<<n);i++)for(int j=1;j<=n;j++)if(i>>(j-1)&1)sum[i]+=a[j];
	memset(dp,63,sizeof(dp));
	for(int i=1;i<=n;i++)dp[1<<i-1][i]=0;
	for(int i=0;i<(1<<n);i++)for(int j=1;j<=n;j++)if(i>>(j-1)&1)
		for(int k=1;k<=n;k++)if((~i>>(k-1)&1)&&dis[j][k]!=dis[0][0])
			chkmin(dp[i|(1<<k-1)][k],dp[i][j]+1ll*dis[j][k]*sum[i]);
	int qu;scanf("%d",&qu);
	for(int i=1,x,y;i<=qu;i++){scanf("%d%d",&x,&y);qv[y].pb(mp(x,i));}
	for(int i=1;i<=n;i++){
		vector<pair<i128,i128> >vec,nvec,pt;
		for(int j=0;j<(1<<n);j++)if((j>>(i-1)&1)&&dp[j][i]!=dp[0][0])
			vec.pb(mp(sum[j],dp[j][i]));
		sort(vec.begin(),vec.end());
		for(int l=0,r;l<vec.size();l=r){
			i128 mn=dp[0][0];r=l;
			while(r<vec.size()&&vec[r].fi==vec[l].fi)chkmin(mn,vec[r].se),++r;
			nvec.pb(mp(vec[l].fi,mn));
		}
		for(auto p:nvec){
			while(pt.size()>=2&&slope(pt[pt.size()-2],pt.back())>slope(pt.back(),p))pt.ppb();
			pt.pb(p);
		}
		sort(qv[i].begin(),qv[i].end());int cur=0;
		for(pii p:qv[i]){
			while(cur+1<pt.size()&&slope(pt[cur],pt[cur+1])<p.fi)++cur;
			res[p.se]=pt[cur].fi*p.fi-pt[cur].se;
		}
	}
	for(int i=1;i<=qu;i++)print(res[i]),putchar('\n'); 
	return 0;
}

标签:洛谷,法力,pt,int,sum,P9020,USACO23JAN,MAXN,dp
From: https://www.cnblogs.com/tzcwk/p/luogu-P9020.html

相关文章

  • 洛谷 P1122 最大子树和 题解
    一道入门的树形DP。首先我们对于数据进行有序化处理,这便于我们利用数据结构特点(可排序性)来发觉数据性质(有序、单调、子问题等等性质),以便于后续的转化、推理和处理。有序化可以“转化和创造”性质首先将视角从无根树切换为有根树,这样我们就可以得到一个带有最优子结构、无后效性......
  • 洛谷 P2458 [SDOI2006] 保安站岗 - 树形DP
    P2458保安站岗思路:树形DP三个状态:dp[i][0]:节点i位置放保安的最小花费dp[i][1]:节点i位置不放保安,但被子节点的保安看守dp[i][2]:节点i位置不放保安,但被父节点的保安看守状态转移:dp[i][0]:节点i位置放保安,那么它可以合并子节点任何状态的最小值;dp[i][1]:节点i位......
  • 洛谷 P8923 -『MdOI R5』Many Minimizations
    怎么ARC还能撞题的?只能说Kubic牛逼。首先显然没法保序回归。考虑用类似于凸壳优化DP的做法解决原问题(也就是P4331):设\(dp_{i,j}\)表示考虑前\(i\)位,\(x_i=j\)的最小代价,显然有\(dp_{i,j}=\min_{k\lej}\{dp_{i-1,k}+|j-a_i|\}\)\(dp\)值显然是一个折线,用堆维护斜......
  • 洛谷-P9455 题解
    写在前面:本题蒟蒻给出两种做法,一种乱搞贪心(只是目前能过,若能被Hack请和我说),一种正解二分。正文1最坏时间复杂度:\(\mathcal{O}(n+\logV)(V=10^9)\)这个做法是很简单的,在此不多讲。只需要二分超频电压mid即可,若当前mid可行,则令右边界缩小至mid,否则令左边界扩大至mid。......
  • 洛谷 Luogu P1038 [NOIP2003 提高组] 神经网络
    这题看着很吓人实则很简单。求输出层,正着求很麻烦,因为知不道谁连向这个点,所以可以反向建边,反着求。拓扑+dfs,时间复杂度\(\text{O(n+m)}\)#include<iostream>#include<cstdio>#include<queue>#defineN105#defineM(N*N/2+114)structE{intv,w;......
  • 洛谷P1219 [USACO1.5] 八皇后 Checker Challenge
    写在前面我又回来了!偷了几天懒,还认识我吗?甭管认识不认识,还是要自我介绍一番:本人是初学c++的初中生,还是个蒟蒻,最要命的是没有脑子。今天,还请允许我浪费您一点时间,叨叨上几句。本题目来自于洛谷,网址https://www.luogu.com.cn/problem/P1219,建议在洛谷上看一下。本题解非盈利,无恶......
  • 洛谷 P4931 [MtOI2018] 情侣?给我烧了!(加强版)
    洛谷传送门设\(f_i\)为\(i\)对情侣完全错位的方案数,那么答案为:\[\binom{n}{k}\frac{n!}{(n-k)!}2^kf_{n-k}\]分别代表选择\(k\)对情侣,选择它们的位置,情侣可以换位。\(f_i\)有递推公式:\[f_i=4i(i-1)(f_{i-1}+2(i-1)f_{i-2})\]考虑选出两个人,另外......
  • How to ak 【LGR-145-Div.4】洛谷入门赛 #14?
    A数字判断#include<bits/stdc++.h>#include<ext/pb_ds/assoc_container.hpp>#include<ext/pb_ds/tree_policy.hpp>#include<ext/pb_ds/hash_policy.hpp>#definereregister#definelll__int128#definegcgetchar#defineptputchar#definei......
  • 洛谷 P6667 [清华集训2016] 如何优雅地求和
    洛谷传送门点值不好搞。考虑把它搞成系数一类的东西。由二项式反演,\(f(x)=\sum\limits_{i=0}^x\binom{x}{i}b_i\Leftrightarrowb_i=\sum\limits_{j=0}^i\binom{i}{j}(-1)^{i-j}f(j)\)。然后我们要求:\[\sum\limits_{k=0}^n\sum\limits_{i=0}^ms_i\bino......
  • 洛谷 P3372 【模板】线段树 1
    题目传送门题目描述如题,已知一个数列,你需要进行下面两种操作:1.将某一个数加上x2.求出某区间每一个数的和输入格式第一行包含两个整数N、M,分别表示该数列数字的个数和操作的总个数。第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值。接下来M行每行包含3......