Solution Set -「ARC 124」

cirnovsky /

☆ 「ARC 124A」LR Constraints

Link.

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

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

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

#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 又考置换群了。震撼围观吴老师精确押题。

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

n+m(the number of cycles in the graph)+2×max{the number of cycles of size of 2 or greater consisting of vertice numbered through 1 to n,the number of cycles of size of 2 or greater consisting of vertice numbered through n+1 to n+m}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.