CSP模拟-6

逆天!!!!!为什么我天天读不懂题,T1直接当红题冒泡打我真是。。。。。逆天

T1

//签到题?????? 可做 
//nm 读错题了,不可做 
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <bits/stdc++.h>

using namespace std;

int n, a[5210], val[1314], cnt, p[5210], pos[1314];
vector < pair<int, int> > ans;

void Work(int p1, int p2) {
	pos[a[p1]] = p2;
	pos[a[p2]] = p1;
	swap(a[p1], a[p2]);
	ans.push_back(make_pair(p1, p2));
	return; 
}

int main() {
	cin >> n;
	for (int i = 1; i <= n; ++ i) {
		cin >>a[i]; 
		val[++ cnt] = a[i];
	}
	sort(val + 1, val + cnt + 1);
	cnt = unique(val + 1, val + cnt + 1) - (val + 1);
	int x = 0;
	for (int v = 1; v <= cnt; ++ v) {
		for (int i = 1; i <= n; ++ i) {
			if (a[i] == val[v]) {
				p[i] = ++x;
			}
		}
	}
	for (int i = 1; i <= n; ++ i) {
		a[i] = p[i];

	} 
	for (int i = 1; i <= n; ++ i) {
		pos[a[i]] = i;
	} 
	for (int i = n; i >= 1; -- i) {
		for (int j = a[i] + 1; j <= i; ++ j) {

			Work(pos[j], i);
		}
	}
	cout << ans.size() << endl;
	for (int i = 0; i < ans.size(); ++ i) {
		cout << ans[i].first << " " << ans[i].second << endl;
	} 
	return 0;
}//100 -> 0 

T2

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>

using namespace std;

long long n;
long long cnt, a[5211314 << 1], b[5211314 << 1], c[5211314 << 1];

struct Get {
	long long maxn, sum;
};

Get GetMaxBit(int x) {
	Get tem;
	int pos = 1, maxn = 1, sum = 0;
	while (x != 0) {
		if ((x & 1) == 1) {
			maxn = pos;
			sum ++;
		}
		pos ++;
		x >>= 1;
	}
	tem.maxn = maxn, tem.sum = sum;
	return tem;
}

void Work() {
	Get temp = GetMaxBit(n);
	long long MaxBit = temp.maxn, sum = temp.sum;
	long long x = n, y = n, z, w, v, u, s;
	for (int i = 1; i <= MaxBit - 1; ++ i) {
		cnt ++, a[cnt] = 1, b[cnt] = y, c[cnt] = y;
		y <<= 1;
	}
	cnt ++, a[cnt] = 2, b[cnt] = y, c[cnt] = x, z = x ^ y;
	cnt ++, a[cnt] = 1, b[cnt] = y, c[cnt] = z, w = y + z;
	cnt ++, a[cnt] = 1, b[cnt] = y, c[cnt] = y, s = y << 1;
	cnt ++, a[cnt] = 1, b[cnt] = s, c[cnt] = x, s = s + x;
	cnt ++, a[cnt] = 2, b[cnt] = w, c[cnt] = s, v = w ^ s;
	while (sum != 1) {
		if ((y & v) != 0) 
			cnt ++, a[cnt] = 2, b[cnt] = y, c[cnt] = v, y = y ^ v, sum --;
		cnt ++, a[cnt] = 1, b[cnt] = v, c[cnt] = v, v <<= 1;
	}
	cnt ++, a[cnt] = 2, b[cnt] = y, c[cnt] = x, n = x ^ y;
	return;
}

int main()
{
	cin>>n;
	while (n != 1) {
		Work();
	}
	cout << cnt << endl;
	for (int i = 1; i <= cnt; ++ i) {
		cout << a[i] << " " << b[i] << " " << c[i] << endl;
	}
	return 0;
}

T3 T4 不会,咕

本次出的题还是有难度的T1不好读题,T2也不怎么好像到

posted @ 2023-07-28 20:42  觉清风  阅读(8)  评论(0编辑  收藏  举报