首页 > 其他分享 >Codeforces Round 952 (Div. 4)

Codeforces Round 952 (Div. 4)

时间:2024-06-13 11:59:32浏览次数:27  
标签:int LL 952 cin Codeforces re num tie Div

link

赛时过了 ABCD,rank 15270,我嘞个豆啊,虽然菜成 shi 了,但是打得很开心,凌晨一点多还兴奋得不得了。

就是网络好差,比赛开始好几分钟了还被关在外边。

A - Creating Words
B - Maximum Multiple Sum

签到题,略

C - Good Prefixes

想到用前缀和,一开始写成每次往后一位后缀,只对最后一位数字考察,显然每次拓展一位要重新考察整个数列是否存在 Good Prefixes

但即使用了前缀和,这样直接暴力枚举做,复杂度也要 \(O(n^2)\)

后来又拿起样例想了想,发现一个很重要的性质:对于一个数列,是否存在 Good Prefixes 有且仅有 其中的最大值可能满足

这是显然的,一个数要满足刚好等于数列中其他数的和。

所以每次考察一个新的数列,只要考察其最大值即可,

我用了 priority_queue 实现,复杂度就降到了 \(O(n\log n)\)

code
#include <bits/stdc++.h>
#define re register int 

using namespace std;
typedef long long LL;
const int N = 2e5 + 10;

int T, n;
LL a[N], sum[N];

priority_queue<LL> q;

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	
	cin >> T;
	while (T --)
	{
		cin >> n;
		
		while (!q.empty()) q.pop();
		
		for (re i = 1; i <= n; i ++) 
		{
			cin >> a[i];
			sum[i] = sum[i - 1] + a[i];
		}
		int res = 0;
		for (re i = 1; i <= n; i ++)
		{
			q.push(a[i]);
			
			LL t = q.top();
			if (sum[i] - t == t) 
			{
				res ++;
			}
		}
		cout << res << '\n';
	}
	
	return 0;
}

D - Manhattan Circle

题目屁话好像有点多,根据样例就能推出做法了

找到两条对角线(也就是最长的)所在的坐标,就是这什么 manhattan circle 的圆心坐标

code
#include <bits/stdc++.h>
#define re register int 

using namespace std;
const int N = 2e5 + 10;

int T, n, m, num_x[N], num_y[N];

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	
	cin >> T;
	
	while (T --)
	{
		cin >> n >> m;
		
		for (re i = 1; i <= n; i ++) num_x[i] = 0;
		for (re i = 1; i <= m; i ++) num_y[i] = 0;
		
		int max_x = -1, max_y = -1, x, y;
		for(re i = 1; i <= n; i ++)
			for (re j = 1; j <= m; j ++) 
			{
				char c; cin >> c;
				
				if (c == '#')
				{
					num_x[i] ++;
					num_y[j] ++;
					
					if (num_x[i] > max_x)
						max_x = num_x[i], x = i;
					
					if (num_y[j] > max_y)
						max_y = num_y[j], y = j;
				}
			}
		cout << x << ' ' << y << '\n';
	}
	
	return 0;
}

E - Secret Box

首先对于任意长方体 (a, b, c),在空间 (x, y, z) 中可能存在的不同的摆放位置数量是:\((x-a+1)(y-b+1)(z-c+1)\)

主要是选 (a, b, c) 且满足 a * b * c = k 的最优策略

赛时我只能想到暴力枚举三维取 max,赛后才发现居然可以只用枚举两维就够了?

我去,我真的是个傻缺,k 知道了,a,b知道了,干嘛还去枚举 c 啊,解个一元一次方程就行了呀,哎

code
#include <bits/stdc++.h>
#define re register int
#define max(x, y) (x > y ? x : y) 

using namespace std;
typedef long long LL;

int T, x, y, z;
LL k;

inline LL solve(int a, int b, LL c)
{
	return (LL)((x - a + 1) * (y - b + 1) * (z - c + 1));
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	
	cin >> T;
	while (T --)
	{
		cin >> x >> y >> z >> k;
		LL res = 0;
		
		for (re a = 1; a <= x; a ++)
			for (re b = 1; b <= y; b ++)
			{
				LL c = k / a / b;
				if (a * b * c != k || c > z) continue;
				
				res = max(res, solve(a, b, c));
			}
		cout << res << '\n';
	}
	
	return 0;
}

F - Final Boss

直接模拟会超时,那么可取的复杂度一般是 \(O(n)\)、\(O(n\log n)\) 等线性做法(这也是一种技巧,综合考虑复杂度选择合适的算法 link

发现轮数越多,击败的可能性是不降的

也就是说,如果当前轮数为 x,满足可以击败 boss,那么 [x, r] 越多的轮数则一定可以击败 boss

满足单调性,可以对轮数进行 二分,每个技能的贡献就是 \(\large\lceil \frac{mid}{c[i]} \rceil * a[i]\)

新学的小技巧:向上取证可以写做 ceil((double)a/b) 等价于 (a+b-1)/b

#include <bits/stdc++.h>
#define re register int 

using namespace std;
typedef long long LL;
const int N = 2e5 + 10;

int T, h, n, a[N], c[N];

inline bool check(LL mid)
{
	LL res = 0;
	for (re i = 1; i <= n; i ++)
	{
		res += ceil((double)mid / c[i]) * a[i];
//		res += ((mid + c[i] - 1) / c[i]) * a[i];
		
		if (res >= h) return true;
	}
	return false;
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	
	cin >> T;
	while (T --)
	{
		cin >> h >> n;
		for (re i = 1; i <= n; i ++) cin >> a[i];
		for (re i = 1; i <= n; i ++) cin >> c[i];
		
		LL l = 0, r = 1e11;
		while (l < r)
		{
			LL mid = (l + r) / 2;
			if (check(mid)) r = mid;
			else l = mid + 1;
		}
		cout << l << '\n';
	}
	
	return 0;
}

标签:int,LL,952,cin,Codeforces,re,num,tie,Div
From: https://www.cnblogs.com/wenzieee/p/18244971

相关文章

  • 如何对嵌套 div 表格进行排序?
    我正在寻找一种解决方案,以便能够根据一个"列"中的值对div表格进行排序。在下面的示例中,排序列的div类为"text-fl"。交互式排序,在这种排序中,数据最初是按照代码中的方式加载的,但如果用户选择按值排序,他们可以点击列标题。由于我的数据不在列表中,因此我认为我无......
  • Codeforces Round 952 (Div. 4)
    A.CreatingWordsvoidsolve(){ stringa,b; cin>>a>>b; swap(a[0],b[0]); cout<<a<<''<<b<<'\n';}B.MaximumMultipleSum总结:作为一个等差数列,快速的找到最高次系数,以及快速求和..C=n/x,sum=(c*x+......
  • 【结构识别】Reconstructing propagation networks with natural diversity and ident
    摘要从数据中重构复杂网络结构和动力学的能力是理解和控制复杂系统集体动力学的基础。尽管最近在这方面取得了进展,但利用随机动态过程的有限时间序列重建网络仍然是一个尚未解决的问题。我们提出了一个基于压缩感知的框架去重构发生随机扩散动力学的复杂网络。我们将该方法应用于......
  • Codeforces Problem 1980B Choosing cubes(基本排序)
    timelimitpertest1secondmemorylimitpertest256megabytesinputstandardinputoutputstandardoutputDmitryhas n......
  • LeetCode 974 Subarray Sums Divisible by K All In One
    LeetCode974SubarraySumsDivisiblebyKAllInOneLeetCode974能被K整除的子数组之和errosfunctionsubarraysDivByK(nums:number[],k:number):number{//-5/0/5letcount:number=0;//单个元素for(leti=0;i<nums.length;i++){......
  • 动物静态HTML网页作业作品 大学生野生动物保护网页设计制作成品 简单DIV CSS布局网站
    ......
  • 如何提升自己的Codeforces分数
    如何提升自己的Codeforces分数此篇为XiaoMo247对原文的总结,原文是MasatakaYoneda/E869120的AWaytoPracticeCompetitiveProgramming(FromRating1000to2400+)目前只读了1000-1400和1400-1900,等作者codeforces分数到了1900再更新后面的。首先是作者对三......
  • Codeforces Round 837题解(A、B)
    A.HossamandCombinatorics\(|a_i-a_j|\)最大的就是最大值和最小值,注意要开longlong。intn;inta[N];voidsolve(){cin>>n;intmin_v=INF,max_v=0;for(inti=1;i<=n;i++){cin>>a[i];min_v=min(min_v,a[i......
  • Codeforces 800-1300 刷题笔记
    CF1946BMaximumSum这道题是一道贪心题。对于第\(1\)次操作,选择的话肯定是选最大的好,所以我们会找出原序列的最大子段和进行插入,为了使下一次的插入子段更大,所以我们一定会插入原序列的最大子段和中。进行\(m\)次操作,执行\(m\)次上述操作即可。直接模拟的话肯定不行,我们......
  • Codeforces Global Round 26 (A - D)
    CodeforcesGlobalRound26A如果\(a_1=a_n\),无解。如果\(a_2=a_n\),\(a_1,a_2\)涂成红色,否则只把\(a_1\)涂成红色。voidsolve(){ cin>>n; for(inti=1;i<=n;++i)cin>>a[i]; if(a[1]==a[n]){ cout<<"NO\n"; re......