F-项链
数组模拟双向循环链表 然后开始。。。模拟 opt1和opt2 opt1 opt2 应该可以合起来写一个操作,,我试了 不知道为啥wa了
双向循环链表。。。
然后用k表示操作三次数 如果k 为偶数 就是next输出 否则 prev输出
并且在opt操作的时候注意k的奇偶性,,,具体看代码 挺详细的应该
#define _CRT_SECURE_NO_WARNINGS
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define ri register int
#define rll register long long
#define fp(i,a,b) for(int i=a;i<=b;++i)
#define IOS std::ios::sync_with_stdio(false)
#define L(a) a<<1
#define R(a) a<<1|1
#define P pair<int,int>
#define pii pair<ll,ll>
#define re(x) read(x)
#define lowbit(x) ((x)&-(x))
#define all(x) (x).begin(),(x).end()
#define Pi 3.1415926
#define rg register
#define gcd(x,y) __gcd(x,y)
#define unq(x) x.erase(unique(x.begin(), x.end()), x.end())
#define mem(x,k) memset(x,k,sizeof x)
// #define TIME
template<typename T>
inline void read(T& t) {
t = 0; int f = 1; char ch = getchar(); while (!isdigit(ch)) { if (ch == '-') f = -1; ch = getchar(); }while (isdigit(ch)) { t = t * 10 + ch - '0'; ch = getchar(); }t *= f;
}
namespace my{
void TEST() { cout << "OK!!!" << endl; }
template<typename T>
void Check(T a[],int n){
for(int i=1;i<=n;i++) cout<<a[i]<<" ";
cout<<endl;
}
template<typename T>
void printans(T a[],int n){
for(int i=1;i<=n;i++) cout<<a[i]<<" ";
cout<<endl;
}
}
const int dx[8]={0,1,0,-1,1,-1,1,-1};
const int dy[8]={1,0,-1,0,-1,1,1,-1};
const int inf = 0x3f3f3f3f;
const ll mod=1e9+7;
//const ll inf=9e18;
const double eps = 1e-5;
const int maxn = 1e5+10;
struct node{
int next;
int prev;
}p[maxn];
// stack<int> s;
void opt1(int x,int y){
// if(p[x].next==y) return;
p[p[x].next].prev=p[x].prev;
p[p[x].prev].next=p[x].next;
p[p[y].next].prev=x;
p[x].next=p[y].next;
p[x].prev=y;
p[y].next=x;
}
void opt2(int x,int y){
// if(p[y].next==x) return;
// if(x==head) head=p[x].next;
// if(y==head) head=x;
// if(x==tail) tail=p[x].prev;
p[p[x].next].prev=p[x].prev;
p[p[x].prev].next=p[x].next;
p[p[y].prev].next=x;
p[x].prev=p[y].prev;
p[y].prev=x;
p[x].next=y;
}
int main() {
// freopen("1.in", "r", stdin);
// freopen("ans.out", "w", stdout);
#ifdef TIME
clock_t start = clock();
#endif
//------------------------------------------------------------------------------------------------
int n,m;
re(n);re(m);
fp(i,1,n-1) p[i].next=i+1;
for(int i=n;i>1;i--) p[i].prev=i-1;
p[1].prev=n;
p[n].next=1;//双向循环链表的建立
int k=0;
while(m--){
int opt;
re(opt);
if(opt==1){
int x,y;
re(x);re(y);
if(k%2==0) opt1(x,y);
else opt2(x,y);
}
else if(opt==2){
int x,y;
re(x);re(y);
if(k%2==0) opt2(x,y);
else opt1(x,y);
}
else if(opt==3) k++;
else{
if(k&1){
int tmp=1;
int k=0;
while(k<n){
cout<<tmp<<" ";
k++;
tmp=p[tmp].prev;
}
}
else{
int tmp=1;
int k=0;
while(k<n){
cout<<tmp<<" ";
tmp=p[tmp].next;
k++;
}
}
cout<<endl;
}
}
//-----------------------------------------------------------------------------------------------
#ifdef TIME
clock_t end = clock();
cout << "Runing Time: " << (double)(end - start) / CLOCKS_PER_SEC * 1000 << "ms" << endl;
#endif
return 0;
}
京公网安备 11010502036488号