社区讨论

求调!!!

P14030 【MX-X20-T4】「FAOI-R7」连接时光 I参与者 2已保存回复 1

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@mhja2ljx
此快照首次捕获于
2025/11/03 23:11
4 个月前
此快照最后确认于
2025/11/03 23:11
4 个月前
查看原帖
CPP
// 确保图联通 > 求最大值 
#include<bits/stdc++.h>

using  namespace  std;

const  int  N = 2e5 + 10;

typedef long long LL;

int T;

int  main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin >> T;
	while(T --)
	{
		int n;
		cin >> n;
		vector<int> aa(n + 1);
		vector<int> group_id(n + 1);// 标记分组
		vector<int> A_pos, B_pos, C_pos; // 记录索引(下标) 
		
		// 进行分组 
		for(int i = 0; i < n; i ++)
		{
			cin >> aa[i];
			if(aa[i] < 0)
			{
				group_id[i] = 0;
				A_pos.push_back(i);
			}
			else if(aa[i] > 0)
			{
				group_id[i] = 1;
				B_pos.push_back(i);
			}
			else
			{
				group_id[i] = 2;
				C_pos.push_back(i);	
			} 
		} 
		
		int a = A_pos.size();
		int b = B_pos.size();
		int c = C_pos.size();
		vector<int> A_elems, B_elems, C_elems; // 分配的元素 (存的p[]的值) 
		vector<int> p(n);
		
		LL res = 0;
		int cnt = 1;
		
		if(b == 0)
		{
			if(a > 0)
			{
				p[0] = n;
				vector<int> fix_a;
				for(int i = 1; i < n; i ++)
				{
					fix_a.push_back(i);
				}
				sort(fix_a.begin(), fix_a.end(), [&](int i, int j){return aa[i] > aa[j];});
				
				for(auto i : fix_a)
				{
					p[i] = cnt ++;
				}
				for(int i = 1; i <= n; i ++)
				{
					res += aa[i];
				}
			}
			else // 全为0 
			{
				for(int i = 0; i < n; i ++)
				{
					p[i] = n - i;	
				}	
				res = 0;
			}	
			cout << res << "\n";
			for(int i = 0; i < n; i ++)
			{
				cout << p[i] << " ";	
			} 
			cout << "\n";
			continue; // 跳过后续 
		} else
		{
			// 有B组 
			if(b > 0) 
			{
				B_elems.resize(b + 1);
				for(int i = 0; i < b; i ++)
				{
					B_elems[i] = b - i;
				}	
			} 
			if(a > 0)
			{
				A_elems.resize(a + 1);
				if(b > 0)  
				{
					for(int i = 0; i < a; i ++)
					{
						A_elems[i] = n - i;
					}
				}
			}
			if (c > 0) 
			{
	            int start = b + 1;  
	            int end = n - a;    
	            C_elems.resize(c + 1);
	            for (int i = 0; i < c; ++i) {
	                C_elems[i] = end - i;  // 递减排列
	            }
        	}
		} 
        
        int a_point = 0, b_point = 0, c_point = 0;
        for(int i = 0; i < n; i ++)
        {
        	if(group_id[i] == 1)
        	{
        		p[i] = B_elems[b_point ++];
			}
			else if(group_id[i] == 0)
			{
				p[i] = A_elems[a_point ++];	
			} 
			else
			{
				p[i] = C_elems[c_point ++];
			}
		}
		
		if(b > 0)
		{
			int a_cnt = 0;
			for(int i = 0; i < n; i ++)
			{
				if(group_id[i] == 1)
				{
					res += (LL)i * aa[i];
				}
				else if(group_id[i] == 0)
				{
					res += (LL)a_cnt * aa[i];
					a_cnt ++;
				}
			}
		}
		
		cout << res << endl;
		for(int i = 0; i < n; i ++)
		{
			cout << p[i] << " ";
		}
		cout << "\n";
	}
    return  0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...