首页 > 其他分享 >Codeforces Global Round 20 D F1 F2/more

Codeforces Global Round 20 D F1 F2/more

时间:2022-11-03 22:00:32浏览次数:78  
标签:F1 F2 20 ... int mxv low mx ct

https://codeforc.es/contest/1672

F1

https://www.luogu.com.cn/blog/AlexWei/solution-cf1672f1

  1. 将置换分解为若干轮换(环),悲伤值越大 \(\Rightarrow\) 环越少(设环为 \(k\) 个,一个环只需要交换 \(sz-1\) 次,所以总共交换 \(n-k\) 次,显然环越少,悲伤值越大)

  2. 根据其置换的最优性,2 个相同的元素不可能同时出现在一个环。
    考虑 \(p_1\to p_2\to ... \to p_i\to p_{i+1}\to ... \to p_j \to p_{j+1}\to ... \to p_1\),其中 \(p_i\) 与 \(p_j\) 的权值相等。显然可以拆成 2 个环,\(p_1\to p_2\to ... \to p_i \to p_j+1\to p_1\),\(p_{i+1}\to ... \to p_j \to p_{i+1}\) 这一部分是因为你交换 2 个数要交换到哪里,由于这两个元素一样,所以并不会影响正确性。由于环更多了,显然会成这样。得证。

  3. 根据 2,显然环的下界个数是 \(mx\) 个,\(mx\) 为众数出现次数。

于是把众数的元素分到每一个环即可。

#include <bits/stdc++.h>
//#define int long long
#define pb push_back
using namespace std;
const int N=(int)(2e5+5);
//pair<int,int>vec[N];
map<int,vector<int> >mp;
int n,a[N],ct[N],vec[N];
void sol() {
	mp.clear();
	cin>>n; int mx=0,mxv=0;
	for(int i=1;i<=n;i++) {
		cin>>a[i]; ++ct[a[i]];
		if(ct[a[i]]>mxv) mx=a[i],mxv=ct[a[i]];
	}
	for(int i=1;i<=n;i++) {
//		if(a[i]!=mx) {
			mp[a[i]].pb(i);
//		}
	}
	for(int i=0;i<mxv;i++) {
		int tot=0;
		vec[++tot]=mp[mx][i];
		for(auto it=mp.begin();it!=mp.end();) {
//			cout<<i<<'\n';
			if((*it).first==mx) {
				++it; continue ;
			}
			vec[++tot]=(*it).second.back();
			(*it).second.pop_back();
			if((*it).second.empty()) {
				mp.erase(it++);
			} else ++it;
		}
		int qwq=a[vec[tot]];
		for(int j=tot-1;j>=1;j--) {
			a[vec[j+1]]=a[vec[j]];
		}
		a[vec[1]]=qwq;
	}
	for(int i=1;i<=n;i++) ct[a[i]]=0;
	for(int i=1;i<=n;i++) cout<<a[i]<<' ';
	cout<<'\n';
}

signed main() {
	cin.tie(0); ios::sync_with_stdio(false);
	int T; cin>>T; while(T--) sol();
	return 0;
}

F2

image

#include <bits/stdc++.h>
//#define int long long
#define pb push_back
using namespace std;
const int N=(int)(4e5+5);
bool vis[N];
int n,a[N],b[N],dfn[N],low[N],ct[N],fir[N],tjtot;
bool ok;
vector<int>st,vec[N],g[N];

void tarjan(int x) {
	dfn[x]=low[x]=++tjtot;
	vis[x]=1; st.pb(x);
	for(int y:g[x]) {
		if(!dfn[y]) {
			tarjan(y);
			low[x]=min(low[x],low[y]);
		} else if(vis[y]) low[x]=min(low[x],dfn[y]);
	}
	if(low[x]==dfn[x]) {
		int qwq=0,sz=0;
		while(1) {
			qwq=st.back(); st.pop_back(); ++sz; vis[qwq]=0;
			if(qwq==x) break ;
		}
		if(sz>1) {
			ok=0; return ;
		}
	}
}

void sol() {
	cin>>n; tjtot=0; ok=1;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=n;i++) cin>>b[i];
	int mxv=0,mx=0;
	for(int i=1;i<=n;i++) {
		++ct[b[i]];
		if(ct[b[i]]>mxv) mxv=ct[b[i]],mx=b[i];
	}
	for(int i=1;i<=n;i++) vec[a[i]].pb(i);
	int tot=n;
	for(int i=1;i<=n;i++) {
		if(b[i]==mx) continue ;
		if(fir[b[i]]) {
			g[i].pb(fir[b[i]]); continue ;
		}
		fir[b[i]]=++tot;
		g[i].pb(fir[b[i]]);
		for(int x:vec[b[i]]) g[fir[b[i]]].pb(x);
	}
	for(int i=1;i<=tot;i++) {
		if(!dfn[i]) {
			while(!st.empty()) st.pop_back();
			tarjan(i);
		}
	}
	for(int i=1;i<=n;i++) ct[b[i]]=fir[b[i]]=0,vec[a[i]].clear();
	for(int i=1;i<=tot;i++) g[i].clear(),low[i]=dfn[i]=vis[i]=0;
	if(ok) {
		cout<<"AC\n";
	} else cout<<"WA\n";
}
 
signed main() {
	cin.tie(0); ios::sync_with_stdio(false);
	int T; cin>>T; while(T--) sol();
	return 0;
}

D

image

很奇妙的题目,比 F 难多了!

标签:F1,F2,20,...,int,mxv,low,mx,ct
From: https://www.cnblogs.com/xugangfan/p/16855961.html

相关文章

  • 【2022.11.3】luffy项目前期部署(1)
    内容概要1.企业项目类型2.企业项目开发流程3.路飞项目需求4.pip换源5.虚拟环境搭建5.1使用pytharm创建虚拟环境5.2通用方案创建虚拟环境6.luffy后台创建目录......
  • 2022-11-3学习内容
    1.在存储卡上读写图片文件1.1activity_image_write.xml<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/an......
  • Emre Aksan-2021-AnSpatio-temporalTransformer for 3D Human Motion Prediction-IEEE
    ASpatio-temporalTransformerfor3DHumanMotionPrediction#paper1.paper-info1.1MetadataAuthor::[[EmreAksan]],[[ManuelKaufmann]],[[PengCao]],[[......
  • 解决Server2012r2 服务器 中文乱码
    已解决,解决方法如下:我在输入chcp936时报错invalidpagecode,就按此处理,需要的人可自取现象:命令行中中文字符显示为问号,输入chcp936会提示invlalidpagecode.解决......
  • Contest 2050 and Codeforces Round #718 (Div. 1 + Div. 2) D
    D.ExplorerSpace我们考虑一个性质就是他最多就是找到一条k/2的最短路径然后回来这样是肯定是包含最优解的这个观察第二个样例我们将其改变一下要是我们一半的长度......
  • [2021N1CTF国际赛]Easyphp-Wp
    文章目录​​写在前面​​​​Wp​​​​简单分析​​​​小实验验证猜想可效性​​​​构造tar​​​​参考文章​​写在前面在各种带飞的情况下,web被带ak了,这里比较想写一......
  • Windows 10下基于Visual Studio 2019编译配置VTK 8.2.0
    参考:https://blog.csdn.net/weixin_42694889/article/details/1159645331、下载并安装VisualStudioCommunity2019、CMake3.19.0;2、下载VTK8.2.0并解压:https://vt......
  • 福建WC2014 路径权值(Kruskal重构树 + 树状数组)
    题目描述:给定一个带权树,树上任意两点间的路径权值\(d\left(x,y\right)\)定义为\(x,y\)这两个点之间路径上的最小值,树上任意一点x的权值定义为这个点到树上其他所有点......
  • hinkPadhinkPad F1按键常亮且喇叭无声音
    解决方案:1.win+r打开搜索框:输入:services.msc2.找到:lenovoHotkeyClientLoader服务3.重启该服务即可。......
  • 我为什么要辞掉20万的工作去读研?
    我为什么要辞掉20万的工作去读研?大家好,我是亓官劼(qíguānjié)。在【亓官劼】公众号GitHub、B站、华为开发者论坛等平台分享一些技术博文,时光荏苒,未来可期,一起加油~博主......