首页 > 其他分享 >AGC005 题解

AGC005 题解

时间:2024-10-09 19:49:18浏览次数:7  
标签:10 return AGC005 int 题解 ll st num

目录

A - STring

用栈模拟一下即可,具体的,当栈顶出现形如 ST 时,将其弹出。

#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll Read() {
	int sig = 1;
	ll num = 0;
	char c = getchar();
	while(!isdigit(c)) {
		if(c == '-') {
			sig = -1;
		}
		c = getchar();
	}
	while(isdigit(c)) {
		num = (num << 3) + (num << 1) + (c ^ 48);
		c = getchar();
	}
	return num * sig;
}
void Write(ll x) {
	if(x < 0) {
		putchar('-');
		x = -x;
	}
	if(x >= 10) {
		Write(x / 10);
	}
	putchar((x % 10) ^ 48);
}

int main() {
	string s;
	cin >> s;
	stack<char> st;
	int i, n = s.size();
	for(i = 0; i < n; i++) {
		if(s[i] == 'T' && !st.empty() && st.top() == 'S') {
			st.pop();
		}
		else {
			st.emplace(s[i]);
		}
	}
	Write(st.size());
	return 0;
}

B - Minimum Sum

考虑将每个数的贡献拆开,从最小的数开始考虑,包括这个最小数的区间的最小值一定是该数,而剩下的区间正好被最小值拆成两半,可以递归地去做。
具体的,用 ST 表维护区间内最小值的位置,设这个最小值的位置为第 \(x\) 位,当前区间为 \([l, r]\),则贡献为 \(a_x \cdot (r - x + 1) \cdot (x - l + 1)\),再递归区间 \([l, x - 1]\) 及 \([x + 1, r]\)。

#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll Read() {
	int sig = 1;
	ll num = 0;
	char c = getchar();
	while(!isdigit(c)) {
		if(c == '-') {
			sig = -1;
		}
		c = getchar();
	}
	while(isdigit(c)) {
		num = (num << 3) + (num << 1) + (c ^ 48);
		c = getchar();
	}
	return num * sig;
}
void Write(ll x) {
	if(x < 0) {
		putchar('-');
		x = -x;
	}
	if(x >= 10) {
		Write(x / 10);
	}
	putchar((x % 10) ^ 48);
}

const int N = 200005, lgN = 20;
int n, a[N], lg[N];
void Init_lg() {
	int i;
	for(i = 2; i < N; i++) {
		lg[i] = lg[i >> 1] + 1;
	}
}
struct ST_Table {
	int f[lgN][N], g[lgN][N];
	void Init() {
		int i, j;
		for(i = 1; i <= n; i++) {
			f[0][i] = a[i], g[0][i] = i;
		}
		for(i = 1; i <= lg[n]; i++) {
			for(j = 1; j + (1 << i) - 1 <= n; j++) {
				if(f[i - 1][j] < f[i - 1][j + (1 << (i - 1))]) {
					f[i][j] = f[i - 1][j], g[i][j] = g[i - 1][j];
				}
				else {
					f[i][j] = f[i - 1][j + (1 << (i - 1))], g[i][j] = g[i - 1][j + (1 << (i - 1))];
				}
			}
		}
	}
	int Query(int l, int r) {
		int len = lg[r - l + 1];
		int x = f[len][l], y = f[len][r - (1 << len) + 1];
		return x < y ? g[len][l] : g[len][r - (1 << len) + 1];
	}
}st;
ll Solve(int l, int r) {
	if(l > r) {
		return 0;
	}
	int x = st.Query(l, r);
	return Solve(l, x - 1) + Solve(x + 1, r) + 1ll * (x - l + 1) * (r - x + 1) * a[x];
}
int main() {
	int i;
	n = Read();
	for(i = 1; i <= n; i++) {
		a[i] = Read();
	}
	Init_lg(), st.Init();
	Write(Solve(1, n));
	return 0;
}

C - Tree Restoring

回忆直径的定义,注意到 \(\max a_i\) 即为直径长度 \(d\),因此我们先建出这个直径。
设直径的两个端点为 \(u, v\),根据直径的性质,\(a_x = \max\{\operatorname{dis}(u, x), \operatorname{dis}(v, x)\}\)。
对于 \(d\) 的奇偶性分类讨论,对于 \(k\) 是偶数的情况,需要 \(\frac{d}{2} + 1 \sim d\) 的 \(a_i\) 各两个,\(\frac{d}{2}\) 的 \(a_i\) 一个;对于 \(k\) 是奇数的情况,需要 \(\frac{d + 1}{2} \sim d\) 的 \(a_i\) 各两个。于是 \(a_i\) 不够可以直接判无解。
对于剩下的点,我们可以在直径上挂着,可以证明,当 \(k\) 是偶数时,挂的点 \(a_i\) 的取值范围为 \([\frac{d}{2} + 1, d]\);当 \(k\) 是奇数时,挂的点 \(a_i\) 的取值范围为 \([\frac{d + 3}{2}, d]\)。
注意特判 \(d = 1\) 的情况。

#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll Read() {
	int sig = 1;
	ll num = 0;
	char c = getchar();
	while(!isdigit(c)) {
		if(c == '-') {
			sig = -1;
		}
		c = getchar();
	}
	while(isdigit(c)) {
		num = (num << 3) + (num << 1) + (c ^ 48);
		c = getchar();
	}
	return num * sig;
}
void Write(ll x) {
	if(x < 0) {
		putchar('-');
		x = -x;
	}
	if(x >= 10) {
		Write(x / 10);
	}
	putchar((x % 10) ^ 48);
}

const int N = 105;
int n, a[N], cnt[N];

int main() {
	int i, d = 0;
	n = Read();
	for(i = 1; i <= n; i++) {
		int a = Read();
		d = max(d, a);
		cnt[a]++;
	}
	if(d == 1) {
		printf(n > 2 ? "Impossible" : "Possible");
		return 0;
	}
	for(i = d; i > d / 2; i--) {
		if(cnt[i] < 2) {
			printf("Impossible");
			return 0;
		}
	}
	if(d % 2 == 0 && cnt[d / 2] != 1) {
		printf("Impossible");
		return 0;
	}
	if(d & 1 && cnt[(d + 1) / 2] != 2) {
		printf("Impossible");
		return 0;
	}
	for(i = 1; i < (d + 1) / 2; i++) {
		if(cnt[i]) {
			printf("Impossible");
			return 0;
		}
	}
	printf("Possible");
	return 0;
}

标签:10,return,AGC005,int,题解,ll,st,num
From: https://www.cnblogs.com/IncludeZFR/p/18455022

相关文章

  • [NOIP2006 提高组] 作业调度方案 题解
    题目描述我们现在要利用 m 台机器加工 n 个工件,每个工件都有 m 道工序,每道工序都在不同的指定的机器上完成。每个工件的每道工序都有指定的加工时间。每个工件的每个工序称为一个操作,我们用记号 j-k 表示一个操作,其中 j 为 1 到 n 中的某个数字,为工件号;k 为 ......
  • NewStar CTF 2024 week1 题解
    1.base题目给了以下内容:Thisisabasequestion!4C4A575851324332474E324547554B494A5A4446513653434E564D444154545A4B354D45454D434E4959345536544B474D5134513D3D3D3D观察给出的字符串发现,字符串由数字0-9以及字母A-F组成,于是推测这可能是一个base16编码,于是将其解码,......
  • 2023牛客OI赛前集训营-提高组(第三场) - 题解汇总
    空位与数(game)贪心即可,因为正正得正,负负也得正,所以将两个数组分别按照正负性分开,然后让正数里面大的配上大的,负数里面绝对值大的配上绝对值大的,这样可以让正积总和尽量大。剩下不足的(必须要一正一负相乘的)让绝对值大的配绝对值小的,这样可以让负积总和尽量小。#include<cstdio>#i......
  • webapi发布---问题解决
    一.127.0.0.1是回路地址,来检验本机TCP/IP协议栈,实际使用过程中服务端不在本机,是外部地址,要用IP地址测试。外部用户采用IP+端口号访问,如下图浏览器访问不了,400错误。解决方案:因为IIS7采用了更安全的web.config管理机制,默认情况下会锁住配置项不允许更改。以管理员身份运......
  • 题解:SP6517 JOCHEF - Farmer Sepp
    一眼简单悬线法,而且有多倍经验,感觉这题被遗忘了,那我就拿下这个水紫吧!我们用a数组表示能向上延伸能到达的最大距离,依次遍历每一行,如果该位置为F,他可以从上一行转移过来,将a数组增加一,如果该位置为C,意味着这个位置不能成矩形,将a数组变为0。接下来进行悬线法的标准操作,设l......
  • 使用宝塔快速搭建配置Openai api接口代理+502 Bad Gateway网关错误问题解决
    本教程提供了一种简便快捷的方法,无需复杂步骤,极易操作,实现零代码、零部署的快速接入。实现准备1.服务器,这里使用阿里香港轻量服务器)2.OpenAI官方的模型apikey3.使用第三方系统或插件进行测试关于第三方网站系统或插件:《SparkAI系统介绍文档-渐进式AIGC系统》开......
  • P10673 【MX-S1-T2】催化剂 题解
    要解决这个问题,我们需要高效地处理动态更新的糖果种类数量,并在每次询问时快速计算最小的愤怒值总和。以下是详细的解决方案和实现步骤:问题分析糖果的种类和数量:每个糖果有一个类型,代表不同的种类。我们需要跟踪每种类型的糖果数量,以便在分配时计算重复的糖果数量,从而确定愤......
  • AT_abc374_c [ABC374C] Separated Lunch 题解
    题目传送门右侧可以传送到原题位置。题目大意题目描述由于KEYENCE总部的员工越来越多,他们决定将总部各部门分成两组,错开午休时间。KEYENCE总部有NNN个部门,第......
  • 弹珠 题解
    题意求\(n\)个一样的球放到\(k\)个盘子里的方案数(每个盘子至少一个)。题解考虑记\(f(i,j)\)为结果。我们可以一次性只加一个球(新放到一个盘子里),也就是可以从\(f(i-1,j-1)\)转移过来。也可以用已有的盘子每个盘子放一个球,就是从\(f(i-j,j)\)转移过来。为......
  • [AGC064D] Red and Blue Chips 题解
    Description你有\(N\)个字符串,初始情况下每个字符串只有一个字符,是\(\texttt{R}\)或\(\texttt{B}\),保证第\(N\)个字符串是\(\texttt{B}\)。你需要对每个\(i=1,2,\cdots,n-1\)执行以下操作:选择一个整数\(j\)使得\(i<j\len\),且第\(j\)个字符串的最后一个字符......