首页 > 其他分享 >AtCoder Beginner Contest 328

AtCoder Beginner Contest 328

时间:2024-05-30 22:24:27浏览次数:18  
标签:AtCoder Beginner int cin stk i64 using 328 dis

A - Not Too Hard

#include <bits/stdc++.h>

using namespace std;


using i32 = int32_t;
using i64 = long long;

#define int i64

using vi = vector<int>;

i32 main() {
	ios::sync_with_stdio(false), cin.tie(nullptr);
	int n, x;
	cin >> n >> x;
	int res = 0;
	for (int i = 1, s; i <= n; i ++) {
		cin >> s;
		if (s <= x)
			res += s;
	}
	cout << res << "\n";
	return 0;
}

B - 11/11

#include <bits/stdc++.h>

using namespace std;


using i32 = int32_t;
using i64 = long long;

#define int i64

using vi = vector<int>;

i32 main() {
	ios::sync_with_stdio(false), cin.tie(nullptr);
	int n;
	cin >> n;

	int cnt = 0;
	for(int i = 1, d, x, y; i <= n; i ++) {
		cin >> d;
		x = i % 10, y = i;
		while(y) {
			if(y % 10 == x) y /= 10;
			else x = -1, y = 0;
		}
		if(x == -1) continue;
		for( int j = x; j <= d; j = j * 10 + x)
			cnt ++;
	}
	cout << cnt << "\n";
	return 0;
}

C - Consecutive

#include <bits/stdc++.h>

using namespace std;


using i32 = int32_t;
using i64 = long long;

#define int i64

using vi = vector<int>;

i32 main() {
	ios::sync_with_stdio(false), cin.tie(nullptr);
	int n, q;
	cin >> n >> q;

	string s;
	cin >> s, s = " " + s;

	vi a(n);
	for(int i = 1; i < n; i ++) 
		a[i] = (s[i] == s[i+1]) + a[i-1];

	for(int l, r; q; q --) {
		cin >> l >> r, r --;
		cout << a[r] - a[l-1] << "\n";
	}
	return 0;
}

D - Take ABC

用栈模拟一下,每次判断最后三个是不是ABC

#include <bits/stdc++.h>

using namespace std;


using i32 = int32_t;
using i64 = long long;

#define int i64

using vi = vector<int>;

i32 main() {
	ios::sync_with_stdio(false), cin.tie(nullptr);
	string s;
	cin >> s;
	
	vector<char> stk;

	for(auto i : s) {
		stk.push_back(i);
		while(stk.size() >= 3 and stk[stk.size() - 3] == 'A' and stk[stk.size() - 2] == 'B' and stk[stk.size() - 1] == 'C')
			stk.pop_back(), stk.pop_back(), stk.pop_back();
	}
	for(auto i : stk)
		cout << i;
	return 0;
}

E - Modulo MST

因为\(n\)很小,所以我们可以用一个二进制数来表示那些点与\(1\)联通,如果一条边可以被选择,这一定是一个点与 1 联通,另一个店不联通。然后我们可以用set记录下每种状态所有选边的权重之和。剩下的就是简单的bfs。

#include <bits/stdc++.h>

using namespace std;


using i32 = int32_t;
using i64 = long long;

#define int i64

using vi = vector<int>;

i32 main() {
	ios::sync_with_stdio(false), cin.tie(nullptr);
	int n, m, k;
	cin >> n >> m >> k;

	vector<array<int,3>> edge(m);
	for(auto &[u, v, w] : edge) cin >> u >> v >> w, u --, v --;

	vector<set<int>> f(1 << n);
	queue<int> q;

	f[1].insert(0),	q.push(1);
	
	vi vis(1 << n);
	while(not q.empty()) {
		int x = q.front();
		q.pop();
		if(vis[x]) continue;
		vis[x] = 1;
		for(const auto &[u, v, w] : edge){
			if(((x >> u) & 1) == ((x >> v) & 1)) continue;
			int y = x | (1 << u) | (1 << v);
			for(auto i : f[x])
				f[y].insert((i + w) % k);
			q.push(y);
		}
	}	
	cout << *f[(1 << n) - 1].begin() << "\n";
	return 0;
}	

F - Good Set Query

我们可以把一个条件当做是一条从\(a\)到\(b\)的有向有权边,边权为\(d\)。同时建立一个反向边,\(-d\)。然后我们加入条件就可以转换为向生成树上建边。这样的话,我们维护出dis[i]表示从跟到\(i\)的路径长度,这样生成树两点\(x,y\)之间的距离就是\(dis[x]-dis[y]\)。

对于一条边,加入有两种情况。

  1. \(a,b\)点不联通,此时说明两个之间没有任何限制条件。直接加入就好了。
  2. \(a,b\)点联通,则我们这条边加入不会影响连通性,但是我们判断这条加入是否会冲突,也就是判断\(d\)是否等于\(dis[x]-dis[y]\)

上述内容都可以使用带权并查集来维护。

#include <bits/stdc++.h>

using namespace std;


using i32 = int32_t;
using i64 = long long;

#define int i64

using vi = vector<int>;

struct dsu {
	vi fa, dis;

	dsu(int n = 1) : fa(n + 1, -1) , dis(n + 1) {};

	int getfa(int x) {
		if(fa[x] == -1) return x;
		int f = fa[x];
		fa[x] = getfa(fa[x]),dis[x] = dis[f] + dis[x];
		return fa[x];
	}

	bool merge(int x, int y, int w) {
		int fx = getfa(x), fy = getfa(y);
		if(fx != fy){
			fa[fx] = fy;
			dis[fx] = - dis[x] + dis[y] + w;
			return true;
		}else{
			return dis[x] - dis[y] == + w;
		}
	}
};


i32 main() {
	ios::sync_with_stdio(false), cin.tie(nullptr);
	int n, q;
	cin >> n >> q;
	dsu d(n);
	for(int i = 1,x , y, w; i <= q ; i ++) {
		cin >> x >> y >> w;
		if(d.merge(x, y, w)) cout << i << " ";
	}
	cout << "\n";
	return 0;
}	

标签:AtCoder,Beginner,int,cin,stk,i64,using,328,dis
From: https://www.cnblogs.com/PHarr/p/18223356

相关文章

  • AtCoder Beginner Contest 124
    A-Buttons#include<bits/stdc++.h>usingnamespacestd;intmain(){ inta,b; cin>>a>>b; intres=0; if(a>b)res+=a,a--; elseres+=b,b--; if(a>b)res+=a,a--; elseres+=b,b--; cout<<res......
  • AtCoder abc325D
    原题链接ProblemStatementThereare\(N\)productslabeled\(1\)to\(N\)flowingonaconveyorbelt.AKeyenceprinterisattachedtotheconveyorbelt,andproduct\(i\)enterstherangeoftheprinter\(T_i\)microsecondsfromnowandleavesit......
  • AtCoder Beginner Contest 355(F - MST Query)
    很久没有见到这么好的题了。原题面用ChatGPT......
  • Tokio Marine & Nichido Fire Insurance Programming Contest 2024(AtCoder Beginner C
    A-WhoAtetheCake?题意:有三个嫌疑犯(1,2,3(号码))现在有两个证人他们指出谁不是嫌疑犯,你可以找到确定的那个罪人吗?找到输出这个人的号码没找到输出-1思路:如果两人指出的人是一个人则输出-1不是则输出6-a-b,因为1+2+3=6(sum)减去a,b肯定可以到达......
  • D - AtCoder Wallpaper(求图形面积)
    思路:求f(c,d)+f(a,b)-f(a,d)-f(c,b);代码:intf(intx,inty){if(y%2==0){y=y/2;intans=y*(x/4)*8;x%=4;if(x==1){ans+=y*3;}elseif(x==2){ans+=y*6......
  • Atcoder 题目选做(五)
    \(\text{ByDaiRuiChen007}\)1.[ARC159E]DifferenceSumQueryProblemLink给定\(n,m\),定义\(x\in[1,n]\)的深度\(f(x)\)为:初始\([l,r]=[1,n]\)。第\(i\)次操作求出\(l,r\)按\(a_{i\bmodm}:b_{i\bmodm}\)的比例的中点\(mid\)。如果\(x=mid\),那么......
  • Atcoder 题目选做(六)
    \(\text{ByDaiRuiChen007}\)1.[ARC162E]StrangeConstraintsProblemLink给定\(a_1\sima_n\),求有多少\(b_1\simb_n\)满足:\(b_i\in[1,n]\),且\(i\)和\(b_i\)的出现次数均不超过\(a_i\)。数据范围:\(n\le500\)。设\(\gek\)的\(a_i\)有\(c_k......
  • Atcoder 题目选做(四)
    \(\text{ByDaiRuiChen007}\)1.[AGC059C]GuessingPermutationforasLongasPossibleProblemLink给定\(\dfrac{n\times(n-1)}2\)个\([1,n]\)中的二元对的顺序,求有多少个\(n\)阶排列\(P\)使得按顺序询问到每个\((u,v)\)之前无法确定\(P_u,P_v\)大小关系......
  • ABC 354 (atcoder beginer 354) D、E、F
     D 检查:1.有可能是推导式有问题,比如-/+写错2.x,yA、B、C、D顺序可能搞反了不要盲目调试,先用人眼看一下代码的情况,找一下错误 很简单的找规律的题目。很不能理解过的人,就这些。x方向,y方向,都是4行/列,一个规律的循环。 求(0,0)到(x,y)中的黑色块:第0-3行分别求出黑色......
  • Godot Breakeys Godot Beginner Tutorial 游戏开发笔记
    目录前言资源下载添加人物节点运动状态机移动平台单向穿过奇怪的BugArea2DBodyEntered死亡区域全局类多线程安全TileMap处理TileMap分层前言这次来学习一下youtube的传奇Unity博主,Breakeys的Godot新手教程。Breakeys是从15岁左右就开始用unity做游戏并在youtube上面发布视频了。......