专栏文章

题解:CF2153C Symmetrical Polygons

CF2153C题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@minm207s
此快照首次捕获于
2025/12/02 04:37
3 个月前
此快照最后确认于
2025/12/02 04:37
3 个月前
查看原文
来不及写就被我妈要求回去睡觉了。

考虑对称图形的性质:
  • 3\ge 3 条边。
  • 边两两配对,只剩下 0/1/20/1/2 条边。
只剩下 00 条边是好处理的,但是要注意必须至少有两对相等边。
剩下 11 条边需要使其小于其他边的总和。
剩下 22 条边要求较长边小于其他边的总和(包括另外一条剩余边)。
用 map 实现的,时间复杂度 O(nlogn)O(n\log n)
CPP
#include<bits/stdc++.h>
#define ll long long
#define mp(a,b) make_pair(a,b)
using namespace std;

inline ll read(){
	ll a=0,b=1;
	char c=getchar();
	while(!isdigit(c)){
		if(c=='-')	b=-1;
		c=getchar();
	}
	while(isdigit(c)){
		a=(a<<1)+(a<<3)+(c-'0');
		c=getchar();
	}
	return a*b;
}
inline void write(ll x){
	if(x<0)	putchar('-'),x=-x;
	if(x>=10)	write(x/10);
	putchar(x%10+48);
}
inline void write1(ll x){
	write(x),putchar(' ');
} 
inline void write2(ll x){
	write(x),putchar('\n');
}
ll n;
ll a[5*114514]; 
ll b[5*114514];
map<ll,ll> c;
void solve(){
	ll tag=0;
	n=read();
	ll include13=0;
	for(ll i=1;i<=n;i++){
		a[i]=read();
		c[a[i]]++;
		if(c[a[i]]==2){
			include13+=a[i]*2;
			tag++;
			c[a[i]]=0;	//解除效应!  
		}
	}
	ll idx=0;
	for(ll i=1;i<=n;i++){
		if(c[a[i]]){
			b[++idx]=a[i];
			c[a[i]]=0;
		}
	} 
	sort(b+1,b+idx+1);
	ll include13_fAKe=include13;	//include13_fAKe 才是真正的最后答案  
	if(tag<=1)	include13_fAKe=0;
	for(ll i=1;i<=idx;i++){
		if(b[i]<include13){
			include13_fAKe=max(include13+b[i],include13_fAKe);
		} 
		if(i!=idx){
			if(b[i+1]-b[i]<include13){
				include13_fAKe=max(include13+b[i+1]+b[i],include13_fAKe);
			}
		}
	}
	write2(include13_fAKe);
} 
int main(){
	ll T=read();
	while(T--)	solve();
	putchar('\n');
	return 0;
} //还是不习惯你不在 这身份转变太快   

评论

0 条评论,欢迎与作者交流。

正在加载评论...