Codeforces Round 922 (Div. 2)
A. Brick Wall
模拟、贪心
不需要竖着的砖块,全部为横着的砖块即可。
如果发现一行填不满,只需要将一个位置换成 1x3的砖块即可
其余的都填1x2的砖块
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
int main(){
int t;
cin>>t;
while(t--){
int n,m;
cin>>n>>m;
ll ans=0;
if(m&1){
m-=3;
ans+=n;
}
ans+= n*(m/2);
cout<<ans<<endl;
}
}
B.Minimize Inversions
思维,模拟
每次选中两个下标,进行交换。一共有三种情况。
1、选中的下标里有一对逆序对,那么交换后,仍然是一对
2、选中的下标里有两对逆序对,交换后变成0对
3、选择的下标里有0对逆序对,交换后变成2对
只要我们把一个数组排好序,那么不管怎么交换,都不会减少逆序对的数量。
#include<bits/stdc++.h>
using namespace std;
#define ios ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
const int N = 1e6 + 7;
typedef long long ll;
class arr {
public:
int a, b;
};
bool cmp(arr v, arr t) {
return v.a < t.a;
}
int main() {
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
vector<arr> v(n);
for (int i = 0; i < n; i++)cin >> v[i].a;
for (int i = 0; i < n; i++)cin >> v[i].b;
sort(v.begin(), v.end(), cmp);
for (auto c : v)cout << c.a << ' ';
cout << endl;
for (auto c : v)cout << c.b << ' ';
cout << endl;
}
}
C.XOR-distance
二进制,位运算,贪心
思路:
异或是相同为0,不同为1
二进制有这样一个规律:
第x位为1大于 0~x-1 的所有位为1的值
a=916721749674600979
110010111000110110011001001100000111001110101010101000010011
b=735268590557942972
101000110100001100101110001100110010101101010101010010111100
找到a中第一个与b不同的位,且a在这位上是1.
让x在这位上必须为0.
此后,所有的a与b不同的位,x都与a相同即可
#include<iostream>
#include<fstream>
#include<string>
#include<algorithm>
#include<map>
#include<vector>
#include<set>
#include<stack>
using namespace std;
#define ios ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
#define lson pos<<1
#define rson (pos<<1)|1
const int N = 1e6 + 7;
typedef long long ll;
int main() {
ios;
int t;
cin >> t;
while (t--) {
ll a, b, r;
cin >> a >> b >> r;
if (a < b)swap(a, b); //始终保证a>b
vector<ll> v1, v2;
ll t1 = a, t2 = b;
while (t1) {
v1.push_back(t1 % 2);
t1 /= 2;
}
while (t2) {
v2.push_back(t2 % 2);
t2 /= 2;
}
v2.resize(v1.size());
ll x = 0;
bool is_yes = 0;
for (int i = v1.size() - 1; i >= 0; i--) {
if (v1[i] != v2[i]) {
if (v1[i] == 1) {
if (is_yes == 0) { //第一次不同时,x的第i位为0
is_yes = 1;
continue;
}
else {//后续v1,v2只要有一位不同,那x就尽可能与v1的该位相同
if (x + (1ll << i) <= r) {
x = x + (1ll << i);
}
}
}
}
}
a = a ^ x;
b = b ^ x;
if (a < b)swap(a, b);
cout << a - b << endl;
}
}
}
}
}
}
}
a = a ^ x;
b = b ^ x;
if (a < b)swap(a, b);
cout << a - b << endl;
}
}