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也不怎么好像到