Solution Set -「ARC 124」

「ARC 124A」LR Constraints

Link.

我们可以把 \(1\sim n\) 个盒子里能放的球的编号集合全部求出来。然后就直接来。

注意题目已经给出了 \(k\) 个球的位置,所以「Note that for each integer \(i\) from \(1\) through \(K\), there must be at least one card on which we write \(i\).」这个限制不用管。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define int ll
#define len(x) ((int)(x).size())
#define all(x) (x).begin(),(x).end()
const int N=1100,MOD=998244353;
int n,k,ts[N],tek[N],fin[N],Rs[N];
set<int> rs[N];
signed main() {
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr),cout.tie(nullptr);
	cin>>n>>k,memset(fin,-1,sizeof fin);
	for(int i=1; i<=k; ++i) {
		char c; cin>>c;
		ts[i]=(c=='R');
		cin>>tek[i];
		Rs[tek[i]]=ts[i];
	}
	for(int i=1; i<=k; ++i) {
		if(~fin[tek[i]]) return puts("0"),0;
		fin[tek[i]]=i;
	}
	for(int i=1; i<=n; ++i) {
		if(~fin[i]) rs[i].emplace(fin[tek[i]]);
		else {
			auto &s=rs[i];
			for(int j=1; j<=k; ++j) s.emplace(j);
			int tmp=0;
			for(int j=i+1; j<=n; ++j) {
				if(!Rs[j]) s.erase(fin[j]);
			}
			for(int j=1; j<i; ++j) {
				if(Rs[j]) s.erase(fin[j]);
			}
		}
	}
	int res=1;
	for(int i=1; i<=n; ++i) res*=len(rs[i]),res%=MOD;
	cout<<res<<"\n";
	return 0;
}

「ARC 124B」XOR Matching 2

Link.

预处理出 \(s(i,j)=a_{i}\oplus b_{j}\),以及 \(pos(i,x)\) 表示第 \(i\) 层值 \(x\) 的出现集合,用 std::map 均摊 \(\mathcal{O}(n^{2})\) 空间。然后我们在第一层逐列考虑,对于第一层的每一种异或值,找出在每一行出现的位置集合,如果某一行没有出现就不行。最后就看集合大小是否等于 \(n\)。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define all(x) (x).begin(),(x).end()
#define int ll
const int N=2100;
int a[N],b[N],xr[N][N],n;
multimap<int,int> mp[N];
signed main() {
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr),cout.tie(nullptr);
	cin>>n;
	for(int i=1; i<=n; ++i) cin>>a[i];
	for(int i=1; i<=n; ++i) cin>>b[i];
	for(int i=1; i<=n; ++i) for(int j=1; j<=n; ++j) xr[i][j]=(a[i] xor b[j]),mp[i].insert({xr[i][j],j});
	vector<int> res;
	for(int j=1; j<=n; ++j) {
		bool ok=0;
		set<int> S;
		for(int i=1; i<=n; ++i) {
			auto rg=mp[i].equal_range(xr[1][j]);
			if(mp[i].find(xr[1][j])!=mp[i].end()) {
				for(auto it=rg.first; it!=rg.second; ++it) {
					S.emplace(it->second);
				}
			}
			else {
				ok=1;
				break;
			}
		}
		if(ok) continue;
		if(S.size()==n) {
			res.push_back(xr[1][j]);
		}
	}
	sort(all(res));
	res.erase(unique(all(res)),res.end()); 
	cout<<res.size()<<"\n";
	for(int x:res) cout<<x<<"\n";
	return 0;
}

「ARC 124C」LCM of GCDs

Link.

考场做法复杂度有问题啊,虽然屮过去了。有空来补 official editorial 做法。

// Oops, something went wrong.

「ARC 124D」Yet Another Sorting Problem

Link.

你看 ARC 又考置换群了。震撼围观吴老师精确押题。

套路题,连边 \(i\rightarrow p_{i}\) 后一堆环摆出来。答案是

\[n+m-(\text{the number of cycles in the graph})+\\ 2\times\max\{\text{the number of cycles of size of 2 or greater consisting of vertice numbered through }1\text{ to }n,\\ \text{the number of cycles of size of 2 or greater consisting of vertice numbered through }n+1\text{ to }n+m\} \]

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define all(x) (x).begin(),(x).end()
const int N=200100;
int n,m,p[N],vis[N];
signed main() {
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr),cout.tie(nullptr);
	cin>>n>>m; int x0=0,x1=0,res=n+m,ls=0;
	for(int i=1; i<=n+m; ++i) cin>>p[i];
	for(int i=1; i<=n+m; ++i) {
		if(vis[i]) continue;
		int now=i,len=0,qwq=0,qaq=0;
		while(!vis[now]) {
			++len;
			if(now<=n) qwq=1;
			else qaq=1;
			vis[now]=1;
			now=p[now];
		}
		if(!qaq&&len>=2) ++x0;
		if(!qwq&&len>=2) ++x1;
		--res;
	}
	cout<<res+2*max(x0,x1)<<"\n";
	return 0;
}

「ARC 124E」Pass to Next

Link.


「ARC 124F」Chance Meeting

Link.


上一篇:刷题-Leetcode-101. 对称二叉树(二叉树-属性)


下一篇:206. 反转链表