首页 > 其他分享 >CF1955H The Most Reckless Defense

CF1955H The Most Reckless Defense

时间:2024-04-17 16:34:39浏览次数:21  
标签:ch const int cdot Most Defense calc Reckless define

给敌人加血可以看成是减少防御塔的攻击力,那么一个塔对敌人能造成的最大伤害即为 \(500\pi r^2-3^r\),注意到 \(r=12\) 时已经小于 \(0\) 了,所以半径不会很大,又因为每个 \(r\) 只能选一次,所以有效的塔很少,考虑状压 \(dp\)。

具体地,我们设 \(f_{i,S}\) 表示前 \(i\) 个塔中,被选到的塔的半径集合为 \(S\),所造成的伤害(攻击力)为多少。显然最后答案就等于最大的伤害。有转移方程:

\[f_{i,S}=\max(f_{i-1,S},f_{i-1,S\oplus r}+p_i\times calc(i,r)-3^r) \]

含义很简单,就是当前选或不选。\(calc(i,r)\) 表示第 \(i\) 座塔半径为 \(r\) 时能攻击到几次敌人。预处理 \(calc\) 的复杂度为 \(\mathcal{O}(k\cdot R^3)\),\(dp\) 的复杂度为 \(\mathcal{O}(k\cdot R\cdot 2^R)\),总复杂度 \(\mathcal{O}(k\cdot R\cdot (R^2+2^R))\)。

其实也可以最后一起减去 \(\sum 3^r\) 的,两种都对。一开始我不理解为啥两种写法是等价的,想了想,大概是因为每次取 \(\max\) 的两项只差一个 \(r\),所以要么都减了,要么都没减,不影响相对大小,也就不影响结果。

其实这题还能费用流。每个塔作为左部点,\(12\) 个半径作为右部点,边权或者说费用就是 \(p_i\times calc(i,r)-3^r\),跑一遍二分图带权最大匹配,也就是最大费用最大流即可。不过我没写,听 @cuiyulin 口胡的。

\(dp\) 代码:

#include<bits/stdc++.h>
#define FOR(i,a,b) for(register int i=(a);i<=(b);++i)
#define ROF(i,a,b) for(register int i=(a);i>=(b);--i)
#define mp(a,b) make_pair(a,b)
#define pll pair<long long,long long>
#define pii pair<int,int>
#define fi first
#define se second
#define eb emplace_back
#define ep emplace
using namespace std;
inline int read();
typedef long long ll;
typedef double db;
const int N=50+5;
const int inf=0x3f3f3f3f;
const int INF=0x7f7f7f7f;
const int R=12;
int sqr(int x){return (x)*(x);}
int n,m,k;
char s[N][N];
struct tower{
    int x,y,p;
}a[N*N];
int f[N*N][1<<R];
int calc[N*N][R+1];
int Calc(int x,int y,int r){
    int res=0;
    FOR(i,max(x-r,1),min(n,x+r))
        FOR(j,max(y-r,1),min(m,y+r))
            if(s[i][j]=='#'&&sqr(x-i)+sqr(y-j)<=sqr(r))
            	res++;
    return res;
}
void work(){
    n=read(),m=read(),k=read();
    FOR(i,1,n) scanf("%s",s[i]+1);
    FOR(i,1,k) a[i]={read(),read(),read()};
    FOR(i,1,k){
        int x=a[i].x,y=a[i].y;
        FOR(r,1,R) calc[i][r]=Calc(x,y,r);
    }
    memset(f,-0x3f,sizeof f);
    f[0][0]=0;
    FOR(i,1,k){
    	for(int S=0;S<(1<<R);++S){
    		f[i][S]=f[i-1][S];
    		FOR(r,1,R)
    			if(S>>(r-1)&1) 
					f[i][S]=max(f[i][S],f[i-1][S^(1<<r-1)]+a[i].p*calc[i][r]-(int)pow(3,r));
		}
	}
	int ans=0;
	FOR(i,1,k)
		FOR(S,0,(1<<R)-1)
			ans=max(ans,f[i][S]);
	printf("%d\n",ans);
}
int main()
{
    int T=read();
    while(T--) work();
	return 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<<3)+(x<<1)+(ch^48);ch=getchar();}
	return f*x;
}

标签:ch,const,int,cdot,Most,Defense,calc,Reckless,define
From: https://www.cnblogs.com/LHLeisus/p/18141079

相关文章

  • H. The Most Reckless Defense
    H.TheMostRecklessDefenseYouareplayingaverypopularTowerDefensegamecalled"Runnerfield2".Inthisgame,theplayersetsupdefensivetowersthatattackenemiesmovingfromacertainstartingpointtotheplayer'sbase.Youare......
  • CF1817A Almost Increasing Subsequence 题解
    题面。2023.5.18修正关于前缀和数组的说法,与代码适配的思路。题意给定长度为\(n\)一个序列\(a\)以及\(q\)次询问,每次询问给出\(l\)和\(r\),要求找出序列\(a\)在\([l,r]\)内最长的几乎递增子序列。对于几乎递增的定义:如果一个序列中不存在连续的三个数\(x\),\(y\)......
  • As a reader --> Apollon: A robust defense system against Adversarial Machine Lea
    ......
  • 论文阅读RangeDet: In Defense of Range View for LiDAR-based 3D Object Detection
    文章目录RangeDet:InDefenseofRangeViewforLiDAR-based3DObjectDetection问题笛卡尔坐标结构图Meta-KernelConvolutionRangeDet:InDefenseofRangeViewforLiDAR-based3DObjectDetection论文:https://arxiv.org/pdf/2103.10039.pdf代码:https://......
  • 洛谷 P9907 [COCI 2023/2024 #1] Mostovi 题解
    题目分析首先可以确定的是需要枚举断边,所以我们希望两次枚举之间能有些关联。不难想到类树形DP的套路,建DFS树,只不过这题除了讨论和父亲之间的边,还要考虑返租边。以下钦定以\(1\)为树根。树边先从简单的树边开始考虑。考虑不经过\(u\)和\(u\)的父亲\(v\),对答案是否产......
  • The most influential person
    Inthecenterofanemptystage,amanstoodwithabrownfedorahatandabrownwindbreaker,holdingaredmicrophone.Surroundinghimwasavastredseaoffans.Heslowlyraisedthemicrophone,breakingthesilenceaftertheprevioussongended."......
  • 构建空间场景轻应用,Mapmost Alpha来啦【文末赠书(10本)--第二期】
    文章目录:一、MapmostAlpha介绍二、MapmostAlpha应对数字孪生业务痛点解决之道2.1MapmostAlpha提供海量城市底板2.2MapmostAlpha提供便捷的配置管理工具2.3MapmostAlpha提供一键式部署发布和分享三、沉浸式体验MapmostAlpha3.1创建应用3.2新手指导3.3场......
  • most & least significant bit
    英语是程序员的核心竞争力介绍字节序的wiki中看到一个“mostsignificantbit”的概念,点进去一看还是有点小意思的:原文这里的most/leastsignificantbit从字面上翻译是:最重要的/最不重要的bit。但这个翻译一下子可能不太容易理解:为什么bit还有重要不重要之分?大家日常......
  • 初中英语优秀范文100篇-086The Person Who Has Influenced Me Most-对我影响最大的人
    PDF格式公众号回复关键字:SHCZFW086记忆树1Mymotheristhepersonwhohasinfluencedmemost.翻译我的母亲是对我影响最大的人简化记忆母亲句子结构主语Mymother作为主语,明确指出了影响说话者最大的人是“我的母亲系动词is系动词,用于连接主语和表语,表示主......
  • CF1730F Almost Sorted
    更好的阅读体验CF1730FAlmostSorted挺有意思的一道题。刚看到可能有好几种思路,按照\(p\)的大小填\(q\),或者按照下标顺序填等等。试了几次之后考虑按照\(i\)从小到大填入\(q_i\),设\(pos\)为当前填了的最大的\(p_{q_i}\),由于题目的要求,\(1\sim(pos-m-1)\)的所有数......