https://vjudge.net/problem/UVA-12657
A数组开始表示编号k的位置,后面表示最后编号的顺序
#include<iostream>
#include<cstring>
using namespace std;
#pragma warning(disable:4996)
struct node {
int data;
int l, r;
};
node all[100500];
bool _reverse=false;
int n, m, k;
int A[100500];
void one(int X, int Y) {
if (all[Y].l == X) return;
all[all[X].l].r = all[X].r, all[all[X].r].l = all[X].l;
all[all[Y].l].r = X,all[X].l = all[Y].l;
all[Y].l=X, all[X].r = Y;
}
void two(int X, int Y) {
if (all[Y].r == X) return;
all[all[X].l].r = all[X].r, all[all[X].r].l = all[X].l;
all[all[Y].r].l = X,all[X].r = all[Y].r;
all[Y].r=X, all[X].l = Y;
}
long long int Prin_sum() {
long long int sum = 0,top=0,i;
for (i = all[0].r; all[i].r != n + 2; i = all[i].r)
A[++top] = all[i].data;
i = (_reverse&& n % 2==0) ? 2 : 1;
for (; i <= n; i += 2)
sum += A[i];
return sum;
}
int main() {
#ifdef _DEBUG
freopen("in", "r", stdin);
freopen("out", "wb", stdout);
#endif // _DEBUG
int X, Y,cnt=0,tt;
while (cin>>n>>m) {
all[0].r = 1; _reverse = false;
for (int i = 1; i <= n + 1; ++i)//all[k].r==n+1表示结束
all[i].l = i - 1, all[i].r = i + 1, all[i].data = i, A[i] = i;
while (m--) {
cin >> k;
switch (k)
{
case 1:
cin >> X >> Y;
if (_reverse) two(A[X], A[Y]);
else one(A[X], A[Y]);
break;
case 2:
cin >> X >> Y;
if (_reverse) one(A[X], A[Y]);
else two(A[X], A[Y]);
break;
case 3:
cin >> X >> Y;
swap(all[A[X]].data, all[A[Y]].data);
swap(A[X], A[Y]);
break;
case 4: _reverse = !_reverse;
break;
default:
break;
}
}
printf("Case %d: %lld\n", ++cnt, Prin_sum());
}
}