社区讨论
求调!!!
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 条回复,欢迎继续交流。
正在加载回复...