1. 程式人生 > 其它 >Solution Set -「ARC 124」

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.