首页 > 其他分享 >Atcoder Regular Contest 061 题解

Atcoder Regular Contest 061 题解

时间:2024-11-22 10:09:44浏览次数:1  
标签:061 Atcoder int 题解 LL vis kv MAXM find

ARC061C. Many Formulas *1089

首先预处理出原数区间 \([i,j]\) 所代表的真实数字。然后注意到 \(|s| \leq 10\),所以直接爆搜回溯最后判断即可。或者状压枚举也可以,反正非常简单。

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
string s;
LL Sum[11][11], n, ans = 0;
bool vis[11];
void DFS(LL step)
{
	if(step == n)
	{
		LL last = 1;
		for(LL i = 1; i < n; i ++) 
		{
			if(!vis[i]) continue; 
			ans += Sum[last][i];
			last = i + 1;
		}
		ans += Sum[last][n];
		return;
	} 
	vis[step] = true;
	DFS(step + 1);
	vis[step] = false;
	DFS(step + 1);
	return;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	cin >> s; n = s.length(); s = ' ' + s;
	for(LL i = 1; i <= n; i ++)
	{
		Sum[i][i] = (s[i] - '0');
		for(LL j = i + 1; j <= n; j ++) 
			Sum[i][j] = Sum[i][j - 1] * 10 + (s[j] - '0');
	}
	DFS(1);
	cout << ans << '\n';
	return 0;
} 

ARC061D. Snuke's Coloring *1682

注意到我们可以先不管 \(0\) 有多少个。最后可以容斥原理计算出一个染色格子都不包含的个数。注意到一个染色格子只会影响到相邻 \(9\) 个 \(3\times 3\) 方格。我们枚举每个格子 \(i\),枚举这相邻的 \(9\) 个 \(3\times 3\) 方格,然后计算对答案的贡献。

但是这样子会算重。我们考虑怎么重。显然,包含染色格子个数为 \(i\) 的 \(3\times 3\) 方格的答案会是真实答案的 \(i\) 倍。因为里面的每个染色格子都会把它计算一遍。

然后最后容斥算出不包含染色个数的格子数量即可。形式化的说,就是 \((H-2)\times (W-2) - \sum ans_i\)。然后就做完了。

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL MAXN = 100005;
LL H, W, n, ans[10], X[MAXN], Y[MAXN];
map<pair<LL, LL>, bool> mp;
void Solve(LL sx, LL sy, LL ex, LL ey)
{
	if(sx <= 0 || sy <= 0 || ex > H || ey > W) return;
	LL cnt = 0;
	for(LL i = sx; i <= ex; i ++)
		for(LL j = sy; j <= ey; j ++)
			if(mp.count(make_pair(i, j))) cnt ++;
	ans[cnt] ++;
	return;	
} 
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	cin >> H >> W >> n;
	for(LL i = 1; i <= n; i ++)
	{
		cin >> X[i] >> Y[i];
		mp[make_pair(X[i], Y[i])] = true;
	}
	for(LL i = 1; i <= n; i ++)
	{
		Solve(X[i] - 2, Y[i] - 2, X[i], Y[i]);
		Solve(X[i] - 2, Y[i] - 1, X[i], Y[i] + 1);
		Solve(X[i] - 2, Y[i], X[i], Y[i] + 2);
		Solve(X[i] - 1, Y[i] - 2, X[i] + 1, Y[i]);
		Solve(X[i] - 1, Y[i] - 1, X[i] + 1, Y[i] + 1);
		Solve(X[i] - 1, Y[i], X[i] + 1, Y[i] + 2);
		Solve(X[i], Y[i] - 2, X[i] + 2, Y[i]);
		Solve(X[i], Y[i] - 1, X[i] + 2, Y[i] + 1);
		Solve(X[i], Y[i], X[i] + 2, Y[i] + 2);
	}
	for(LL i = 1; i <= 9; i ++) ans[i] /= i;
	ans[0] = (H - 2) * (W - 2);
	for(LL i = 1; i <= 9; i ++) ans[0] -= ans[i];
	for(LL i = 0; i <= 9; i ++) cout << ans[i] << '\n';
	return 0;
}

ARC061E. Snuke's Subway Trip *2502

不知道为什么洛谷评了绿,感觉题还挺有质量的。

考虑虚点建图。对于同一颜色连通块的点是可以免费互相到达的。所以我们可以考虑将它们连向一个虚点,进去的边权为 \(0\),出来的边权为 \(1\),因为切换连通块需要代价。这个可以过程用并查集维护。

然后我们发现我们建出了一个只含有 \(0/1\) 边权的图。我们要跑最短路。于是我们在新图上跑 \(0/1\) BFS,答案就是 \(dist_n\),然后我们就做完了。实现过程有点复杂。

#include <bits/stdc++.h>
using namespace std;
const int MAXM = 1000001;
int n, m, fa[MAXM], cnt, tmp[MAXM], Dist[MAXM];
bool vis[MAXM];
vector<pair<int, int> > E[MAXM];
struct Edge
{
	int v, w;
};
vector<Edge> Adj[MAXM];
int find(int x)
{
	if(fa[x] == x) return x;
	return fa[x] = find(fa[x]);
}
void BFS01()
{
	vis[1] = true;
	deque<int> q;
	q.push_front(1);
	while(!q.empty())
	{
		int u = q.front();
		q.pop_front();
		for(int i = 0; i < (int)Adj[u].size(); i ++)
		{
			int v = Adj[u][i].v, w = Adj[u][i].w;
			if(vis[v]) continue;
			if(w == 0)
			{
				vis[v] = true;
				Dist[v] = Dist[u];
				q.push_front(v);
			}
			else
			{
				vis[v] = true;
				Dist[v] = Dist[u] + 1;
				q.push_back(v);
			}
		}
	}
	return;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	cin >> n >> m; cnt = n;
	for(int i = 1; i <= m; i ++)
	{
		int u, v, w;
		cin >> u >> v >> w;
		E[w].push_back(make_pair(u, v));
	}
	for(int i = 1; i < MAXM; i ++)
	{
		set<int> s;
		for(int j = 0; j < (int)E[i].size(); j ++) 
		{
			s.insert(E[i][j].first);
			s.insert(E[i][j].second);
		}
		for(auto kv : s) fa[kv] = kv;
		for(int j = 0; j < (int)E[i].size(); j ++)
		{
			int fu = find(E[i][j].first), fv = find(E[i][j].second);
			fa[fu] = fv;
		}
		for(auto kv : s) if(find(kv) == kv) tmp[kv] = ++ cnt;
		for(auto kv : s) 
		{
			Adj[kv].push_back(Edge{tmp[find(kv)], 0});
			Adj[tmp[find(kv)]].push_back(Edge{kv, 1});
		}
	}
	BFS01();
	if(vis[n]) cout << Dist[n] << '\n';
	else cout << -1 << '\n';
	return 0;
}

这场 F 也是巨大不可做题,不补了。

标签:061,Atcoder,int,题解,LL,vis,kv,MAXM,find
From: https://www.cnblogs.com/FracturedAngel/p/18562139

相关文章

  • 2024考前集训测试37 错峰旅行 题解
    题目描述小Z终于迎来了自己的大学生活最后的时刻,他决定用自己的积蓄来一场说走就走的毕业旅行,并且不玩的开心不上班。然而,他很快就发现这个决定并非那么简单。由于是暑假,假期人多,他既不想错过旅行的最佳时期,又不想在人群中挣扎,预测旅游热门城市的拥挤时段,就像是一道难题摆在他......
  • ybtoj 高效进阶题解索引
    密码:sunxuhetai2009--------------------云落的分割线--------------------基础算法第1章-递推算法第2章-贪心算法--------------------云落的分割线--------------------图论第1章-并查集第4章-强连通分量--------------------云落的分割线--------------------......
  • Winform跨线程访问报错问题解决
    `usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Threading;usingSystem.Threading.Tasks;usingSystem.Windows.Forms;namespaceWinf......
  • [JOI 2022 Final] 让我们赢得选举 (Let's Win the Election) 题解
    [JOI2022Final]让我们赢得选举(Let'sWintheElection)/選挙で勝とう(Let'sWintheElection)首先由\[\min\left(\fracab,\fraccd\right)\le\frac{a+c}{b+d}\le\max\left(\fracab,\fraccd\right)\]得出,集中力量办大事,得到的支持者一定要和本人在同一州进行演讲。......
  • [COCI2015-2016#6] PAROVI | 互质覆盖 题解
    前言不能在同一个坑上栽第三次!题目链接:原题;加强版。题意简述\(1\simn\)数轴,你可以使用若干条线段\([l,r]\)来覆盖,其中要满足\(\gcd(l,r)=1\)。问你能够完全覆盖数轴的方案数,对\(M\)取模。\(2\leqn\leq10^4\),\(2\leqM\leq10^9+7\)。不保证\(M\)为质数。......
  • 【题解】AT_joisc2007_mall ショッピングモール (Mall)
    原题传送门温馨提示:岛国题要换行!需要求一个矩阵的和,考虑二维前缀和。题目中不允许矩阵中有负数,结合求和的最小值,我们把负数赋为最大值不就行了吗。接下来就是求二维前缀和了。基于容斥原理,二维前缀和有如下递推关系:\[sum_{i,j}=sum_{i-1,j}+sum_{i,j-1}-sum_{i-1,j-1}+c_{i......
  • 【题解】AT_agc011_b [AGC011B] Colorful Creatures
    原题传送门我们知道,要想使一个生物能活到最后,那么它进行的每一次吸收前,它的大小应当尽可能大,所以我们考虑贪心,对生物的大小从小到大排序,每个生物都从小的开始吸收,看能不能活到最后,时间复杂度\(\mathcal{O(n^2)}\)。我们还知道,排序后,生物\(i\)能活到最后,则生物\(i+1\simn\)......
  • P7906 [Ynoi2005] rpxleqxq 题解
    P7906[Ynoi2005]rpxleqxq题解题目大意给定一个长度为\(n\)的序列\(A\),和一个常数\(k\)。有\(m\)次询问,每次给定一个区间\([l,r]\),询问有多少二元组\((i,j)\),满足:\(1\leqi<j\leqn\);\((A_i\oplusA_j)\leqk\)。Solve前置知识:莫队二次离线。对于普通莫队,端......
  • [CSP-S2019]Emiya 家今天的饭 题解
    题意分析给出一个矩阵,要求每行只能选一个节点,每列选的节点不能超过所有选的节点的一半,不能不选,给出每个节点的选择方案数,求总方案数考场思路考虑暴力枚举每一个点的选择情况,最后统计答案。对于行:但是因为有每一行只能选择一个的限制,所以考虑当前行选择一个后直接转跳到下一行......
  • [NOIP2016 提高组] 蚯蚓 题解
    考场思路考虑要动态维护最大值,可以直接使用优先队列进行维护,但是,考虑到我们并不好直接修改优先队列中的每一个元素,所以决定使用vector先排一遍序,再使用冒泡排序进行动态维护,时间复杂度\(O(mn)\),可以拿35pts。代码#include<iostream>#include<vector>#include<algorithm>......