标签:new force 如何快速 处理 根据 你知道 code 是你 oid
题意:有一个由数字1~n构成的序列,现在给你这个序列所有相邻3个数的值,他们不一定按顺序。现在要根据这些值输出原序列。有多解输出其中一个。如,具体见下图样例。
分析:
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MA=1e5+15;
int n,p1,p2,New;
int a[MA],b[MA],c[MA];
vector<int>index[MA];
vector<int>ans;
int vis[MA];
void in()
{
scanf("%d",&n);
for(int i=1;i<=n-2;++i){
scanf("%d%d%d",&a[i],&b[i],&c[i]);
index[a[i]].push_back(i);
index[b[i]].push_back(i);
index[c[i]].push_back(i);
}
for(int i=1;i<=n;++i){
if(index[i].size()==1){
p1=i;
New=index[i][0];
break;
}
}
}
void findp2()
{
int i=index[p1][0];
if(a[i]==p1){
if(index[b[i]].size()==2){
p2=b[i];
}
else {
p2=c[i];
}
}
if(b[i]==p1){
if(index[a[i]].size()==2){
p2=a[i];
}
else {
p2=c[i];
}
}
if(c[i]==p1){
if(index[a[i]].size()==2){
p2=a[i];
}
else {
p2=b[i];
}
}
}
void update_New(int x)
{
for(int i=0;i<index[x].size();++i){
int idx=index[x][i];
if(!vis[idx]){
New=idx;
break;
}
}
}
int main()
{
in(); //输入并确定p1
ans.push_back(p1);
findp2(); //确定p2
ans.push_back(p2);
for(int i=3;i<=n;++i){
int other=a[New]+b[New]+c[New]-ans[i-3]-ans[i-2]; //由ans[i-3],ans[i-2],确定ans[i-1]
vis[New]=1; //标记用过的下标
update_New(ans[i-2]); //更新New
ans.push_back(other);
}
for(int i=0;i<ans.size();++i){
if(i==n-1) printf("%d\n",ans[i]);
else printf("%d ",ans[i]);
}
return 0;
}
标签:new force 如何快速 处理 根据 你知道 code 是你 oid
原文地址:https://www.cnblogs.com/A-sc/p/12128348.html