首页 > 其他分享 >AtCoder Snuke21 J. Drink Bar 部分分题解

AtCoder Snuke21 J. Drink Bar 部分分题解

时间:2024-10-24 09:49:09浏览次数:1  
标签:AtCoder Bar 二元 特征值 int 题解 最大值 三元组 Subtask

这里将每一个三元组 \((a_i,b_i,c_i)\) 称为一组数。


Subtask 1

暴力枚举所有的非空子集即可。

枚举方式可以采用类似状压 DP 的二进制枚举或者直接 DFS。

时间复杂度 \(O(N \times 2^N)\)。


Subtask 2

性质:此时的特征值最多由两个有效组组成,原因可见 Subtask 3。

因为 \(a_i=b_i\),所以三元组 \((a_i,b_i,c_i)\) 实际上可以压缩为二元组 \((a_i,c_i)\),对其进行二维偏序。

我这里采用的是排序后树状数组的写法,具体地说:

将所有二元组按照 \(a\) 排序后扫描所有二元组,可以保证对于当前二元组 \(i\) ,之前组 \(j\) 的 \(a_j\) 一定小于 \(a_i\)。

此时如果之前某二元组 \(j\) 有 \(c_j\) 比当前的 \(c_i\) 大,那么这两个二元组就可以合成一个特征值 \((a_i,c_j)\),组 \(i\) 贡献了 \(a_i\),组 \(j\) 贡献了 \(c_j\)。

如此,我们构造权值树状数组,每次找当前 \(c_i\) 的后缀和就是之前 \(c_j>c_i\) 的 \(j\) 的数量。

注意,我代码里面是先加入 \(c_i\) 再查找,并且查找的是 \(c_j \ge c_i\) 的 \(j\) 的数量,这是为了确保 \(j\) 能够取到 \(i\),表示自己与自己组合,即自己单独构成一个特征值。

点击查看代码
namespace BinaryIndexTree{

struct BIT_R{
	int c[N];
	#define lowbit(x) ((x)&-(x))
	void clear()
	{
		for(int i=1;i<=n;i++)
			c[i]=0;
		return;
	}
	void add(int x,int y)
	{
		for(;x;x-=lowbit(x))
			c[x]+=y;
		return;
	}
	int query(int x)
	{
		long long res=0;
		for(;x<=n;x+=lowbit(x))
			res+=c[x];
		return res;
	}
	#undef lowbit
}; //反向树状数组(后缀和)

} //namespace BinaryIndexTree

namespace Subtask_2{

pair<int,int> p[N];
void Prework()
{
	for(int i=1;i<=n;i++)
		p[i]={a[i],c[i]}; //a[i]=b[i]
	sort(p+1,p+n+1);
	return;
}

BinaryIndexTree::BIT_R bit;
void Solve()
{
	Prework();
	long long ans=0;
	for(int i=1;i<=n;i++)
	{
		bit.add(p[i].second,1);
		ans+=bit.query(p[i].second);
	}
	printf("%lld\n",ans);
	bit.clear();
	return;
}

} //namespace Subtask_2

Subtask 3

首先,一个特征值包括三个最大值,其组成有以下三种情况:

  1. 一组数贡献了所有的最大值,即它的 \(a_i,b_i,c_i\) 都是最大的,此时其它的组可有可无,可以忽略。
  2. 某一组数贡献了两个最大值,另一组数贡献了剩下的一个最大值,此时其他组可有可无,可以忽略。
  3. 三个最大值分别由三组构成,剩下的组可有可无,可以忽略。

综上所述,构成一个特征值有效的三元组最多只有三个,直接 \(O(N^3)\) 枚举这三/二/一个三元组即可。

点击查看代码
namespace Subtask_3{

const int N_3=505;
bitset<N_1_3> flag[N_1_3][N_1_3];

void ClearData()
{
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			flag[i][j]&=0;
	return;
}

void Solve()
{
	int ans=0;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=i;j++)
			for(int k=1;k<=j;k++)
			{
				int x=max({a[i],a[j],a[k]});
				int y=max({b[i],b[j],b[k]});
				int z=max({c[i],c[j],c[k]});
				if(!flag[x][y][z])
				{
					ans++;
					flag[x][y][z]=true;
				}
			}
	printf("%d\n",ans);
	ClearData();
	return;
}

}

Subtask 4

标签:AtCoder,Bar,二元,特征值,int,题解,最大值,三元组,Subtask
From: https://www.cnblogs.com/jerrycyx/p/18498882

相关文章

  • P7074 [CSP-J2020] 方格取数 题解
    动态规划dp方格取数类似于数字三角形,均可以使用动态规划直接秒杀.但此题有$3$个方向:上、右、下.所以可以定义一个三维数组dp数组.假设$f_{i,j,1}$是从右、上方到达$(i,j)$的和的最大值.又有$f_{i,j,0}$是从右、下方到达$(i,j)$的和的最大值.我们可以先确定......
  • P7912 [CSP-J 2021] 小熊的果篮 题解
    是模拟吗?其实是的,虽然$1\len\le2\times10^5$,但是队列是个好东西.我们定义一个结构体,来存放每一个块的信息,包括类型、起点、终点,将它们放入队列当中,再使用基于广搜的思想,先处理,再合并,所以需要用到$2$个队列.注意点数据中可能会有块的类型全是$1$,或者全是$0$的情况......
  • P7071 [CSP-J2020] 优秀的拆分 题解
    二进制"优秀的拆分"如果存在,则代表$n$的二进制最低位不是$1$.$\because2^0=1$$\therefore$当$n$的二进制最低位为$1$时,不存在优秀的拆分.即$n$不是奇数.上述条件判断完后,就可以从$2$的$30$次方开始模拟(int的上限是$2^{31}-1$).代码#include<iostream>......
  • P7072 [CSP-J2020] 直播获奖 题解
    暴力使用$\Theta(n^2)$的时间复杂度来解决这题大约能拿到$60pts$.即枚举$p$,再枚举每个选手的分数.正解桶是个好东西.我们开一个桶,记录当前分数有多少人.然后计算获奖人数,分数从大到小进行枚举,直到当前人数$\ge$获奖人数.代码#include<iostream>#include<cstdio>#i......
  • [CSP-J2020] 表达式 题解
    短路这道题目中所含的运算符只有3个:与、或、非.在与运算和或运算中有2个性质.进行与运算时,若其中有一个值为0,则这个运算的结果就为0,即无需判断另1个数是否是0或1.进行或运算时,若其中有一个值为1,则这个运算的结果就为1,也无需判断另一个数是否是0或1.表达式树根据短路的性......
  • 题解 SS241023D【数颜色】/ ZROI3029【静态邻域数颜色】
    静态邻域数颜色-题目-ZhengruiOnlineJudge题目描述静态树上邻域数颜色。给一棵\(n\)个点的无根树,第\(i\)个点颜色为\(a_i\)。有\(q\)次询问,每次询问如下:给定\(x,d\),考虑所有距离\(x\)不超过\(d\)的点,求有多少种不同的颜色。形式化地,给定\(x,d\),求\(|\{a......
  • 题解 P5326【[ZJOI2019] 开关】/ SS241023B【判断题】
    已经沦落为可以随便搬进模拟赛的模板题了。。。题目描述当前有\(n\)道判断题,初始全选的错。初始给出每道题的正确答案,设\(0\)表示错,\(1\)表示对。每道题有一个参数\(p_i\),每轮会以\(\frac{p_i}{\sum_{j=1}^{n}p_j}\)的概率选择第\(i\)道题并修改(flip)这道题的答......
  • [COCI2009-2010#4] PALACINKE 题解
    前言题目链接:洛谷。题意简述\(n\)个点,\(m\)条边。每条边上有商店,经过一条边花费\(1\)单位时间,如果在边上的商店购物,额外花费\(1\)单位时间。需要购买\(4\)种物品,每个商店售出\(1\sim4\)种物品不等。请问,在\(T\)个单位时间内,从\(1\)出发购物,得到这\(4\)种物品......
  • AtCoder Beginner Contest 375 C题 (python解)
    PanasonicProgrammingContest2024(AtCoderBeginnerContest375)C-SpiralRotation(python解)**原题链接:[(https://atcoder.jp/contests/abc375/tasks/abc375_c)]题目简述:这道题要求对一个NxN的网格进行特定的螺旋旋转操作,而这个N总是偶数。在这里,网格中的每个单元......
  • AtCoder Beginner Contest 376
    A-CandyButton#include<bits/stdc++.h>usingnamespacestd;usingi32=int32_t;usingi64=longlong;usingvi=vector<int>;usingpii=pair<int,int>;i32main(){ ios::sync_with_stdio(false),cin.tie(nullptr); intn,c; ci......