2026夏组队训练赛第八场
A. Matrix Equation
cpp
#pragma GCC optimize("O2")
#include <bits/stdc++.h>
#include <complex>
using namespace std;
#define int long long
#define i64 int64_t
#define db long double
#define pii pair<int, int>
#define tiii tuple<int, int, int>
#define ull unsigned long long
#define vi vector<int>
using i128 = __int128;
#define vpii vector<pii>
#define vvpii vector<vector<pii>>
#define vvi vector<vi>
#define pqpii priority_queue<pii, vector<pii>, greater<pii>>
#define pqi priority_queue<int, vi, greater<int>>
#define f first
#define s second
#define all(x) (x).begin(), (x).end()
#define pb push_back
#define eb emplace_back
#define sz(x) (x).size()
#define mp make_pair
#define bit bitset<N>
#define endl '\n'
void pr(vector<int> a) {
for (auto i : a)
cout << i << ' ';
cout << '\n';
}
const int mod = 998244353;
const int INF = 1e18;
// const int N = 5e5 + 5;
const int N = 205;
int work(vector<bitset<N>> &a) {
int n = a.size();
for (int i = 0; i < n; ++i) {
int p = i, t = N;
for (int j = i; j < n; ++j) {
for (int k = 0; k < n; ++k) {
if (a[j][k]) {
if (k < t) {
t = k;
p = j;
}
break;
}
}
}
if (t == N) return i;
swap(a[p], a[i]);
for (int j = i + 1; j < n; ++j) {
if (a[j][t]) a[j] ^= a[i];
}
}
return n;
}
void init() {
}
int qp(int a,int b){
int res=1;
while(b){
if(b&1)res=res*a%mod;
a=a*a%mod;
b/=2;
}
return res;
}
void solve() {
int n;
cin>>n;
vvi a(n,vi(n,0)),b(n,vi(n,0));
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin>>a[i][j];
}
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin>>b[i][j];
}
}
int ans=1;
for(int i=0;i<n;i++){
vector<bit>bt(n);
for(int j=0;j<n;j++){
for(int k=0;k<n;k++){
bt[j][k]=a[j][k];
}
if(b[j][i]){
if(bt[j][j])bt[j][j]=0;
else bt[j][j]=1;
}
}
ans=ans*qp(2,n-work(bt))%mod;
}
cout<<ans<<endl;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
init();
int t = 1;
// cin >> t;
while (t--)
solve();
return 0;
}C. Stone Game
cpp
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
ll ans = 0;
ll a, b, c;
cin >> a >> b >> c;
ll need = min(a, b);
a -= need;
b -= need;
ans += need * 2;
if (a) {
ll t = a / 3;
ans += t * 3;
a %= 3;
if (a == 2) ans ++;
}
if (b) {
ll t = b / 3;
ans += t * 6;
b %= 3;
if (b == 2) ans += 4;
}
cout << ans;
}D. Fight against involution
cpp
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int n;
cin >> n;
vector<pair<ll, ll>> a(n);
for (int i = 0; i < n; i ++) cin >> a[i].first >> a[i].second;
sort(a.begin(), a.end(), [&](pair<ll, ll> &x, pair<ll, ll> &y){
return x.second < y.second;
});
ll ans = 0;
ll mx_l = a[0].first, r = a[0].second, cnt = 1;
for (int i = 1; i < n; i ++) {
if (a[i].second == r) {
mx_l = max(mx_l, a[i].first);
cnt ++;
} else {
ans += mx_l * cnt;
mx_l = max(mx_l, a[i].first), r = a[i].second, cnt = 1;
}
}
ans += cnt * mx_l;
cout << ans;
}G. Xor Transformation
cpp
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
LL a, b;
cin >> a >> b;
int h1, h2;
for (int i = 61; i >= 0; --i) {
if (a >> i & 1) {
h1 = i;
break;
}
}
for (int i = 61; i >= 0; --i) {
if (b >> i & 1) {
h2 = i;
break;
}
}
vector<LL> res;
if (h1 > h2) {
if (!(a >> h2 & 1)) {
res = {1LL << h2};
a ^= 1LL << h2;
}
LL t = 0;
for (int i = h1; i > h2; --i) {
t |= a & 1LL << i;
}
a ^= t;
res.emplace_back(t);
}
res.emplace_back(a ^ (1LL << h2));
res.emplace_back(b ^ (1LL << h2));
cout << res.size() << '\n';
for (LL i : res) cout << i << ' ';
cout << '\n';
}J. Tree Constructer
cpp
#pragma GCC optimize("O2")
#include <bits/stdc++.h>
#include <complex>
using namespace std;
#define int long long
#define i64 int64_t
#define db long double
#define pii pair<int, int>
#define tiii tuple<int, int, int>
#define ull unsigned long long
#define vi vector<int>
using i128 = __int128;
#define vpii vector<pii>
#define vvpii vector<vector<pii>>
#define vvi vector<vi>
#define pqpii priority_queue<pii, vector<pii>, greater<pii>>
#define pqi priority_queue<int, vi, greater<int>>
#define f first
#define s second
#define all(x) (x).begin(), (x).end()
#define pb push_back
#define eb emplace_back
#define sz(x) (x).size()
#define mp make_pair
#define bit bitset<N>
#define endl '\n'
void pr(vector<int> a) {
for (auto i : a)
cout << i << ' ';
cout << '\n';
}
const int mod = 998244353;
const int INF = 1e18;
const int N = 129;
void init() {}
void solve() {
int n;
cin >> n;
vvi g(n + 1);
for (int i = 1; i < n; i++) {
int u, v;
cin >> u >> v;
g[u].pb(v);
g[v].pb(u);
}
vvi c(2);
auto dfs=[&](auto dfs,int u,int p,int d)->void{
c[d%2].pb(u);
for(auto i:g[u]){
if(i==p)continue;
dfs(dfs,i,u,d+1);
}
};
dfs(dfs,1,0,0);
if(sz(c[0])>sz(c[1]))swap(c[0],c[1]);
int full=(1ll<<60)-1;
vi ans(n+1);
for(int i=0;i<sz(c[0]);i++){
ans[c[0][i]]=full^(1ll<<i)^(1ll<<59);
}
for(int i=0;i<sz(c[1]);i++){
for(auto j:g[c[1][i]]){
ans[c[1][i]]^=(full^ans[j])^(1ll<<59);
}
ans[c[1][i]]^=(1ll<<59);
}
for(int i=1;i<=n;i++){
cout<<ans[i]<<" ";
}
cout<<endl;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
init();
int t = 1;
// cin >> t;
while (t--)
solve();
return 0;
}L. Bit Sequence
cpp
#pragma GCC optimize("O2")
#include <bits/stdc++.h>
#include <complex>
using namespace std;
#define int long long
#define i64 int64_t
#define db long double
#define pii pair<int, int>
#define tiii tuple<int, int, int>
#define ull unsigned long long
#define vi vector<int>
using i128 = __int128;
#define vpii vector<pii>
#define vvpii vector<vector<pii>>
#define vvi vector<vi>
#define pqpii priority_queue<pii, vector<pii>, greater<pii>>
#define pqi priority_queue<int, vi, greater<int>>
#define f first
#define s second
#define all(x) (x).begin(), (x).end()
#define pb push_back
#define eb emplace_back
#define sz(x) (x).size()
#define mp make_pair
#define bit bitset<N>
#define endl '\n'
void pr(vector<int> a) {
for (auto i : a)
cout << i << ' ';
cout << '\n';
}
const int mod = 998244353;
const int INF = 1e18;
const int N = 129;
int p[N], p2[N];
void init() {
for (int i = 0; i < N; i++) p[i] = __builtin_popcount(i) % 2;
p2[0] = 1;
for (int i = 1; i < 60; i++) p2[i] = p2[i - 1] * 2;
}
vi get(int n) {
vi res(4, 0);
int k = n / 2;
int c0 = k / 2, c1 = k / 2;
if (k % 2 == 0) {
if (__builtin_popcountll(k) % 2)
c1++;
else
c0++;
} else {
c0++;
c1++;
}
res[1] += c0;
res[2] += c1;
if (n >= 1) {
auto t = get((n - 1) / 2);
for (int i = 0; i < 4; i++) {
int x = i >> 1;
int y = i & 1;
res[((x ^ 1) << 1) | y] += t[i];
}
}
return res;
}
void solve() {
int n, l;
cin >> n >> l;
vi a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
int bs = 1, h = 0;
while (bs < n) bs *= 2, h++;
vector<vvi> dp(n, vvi(bs, vi(4, 0)));
for (int i = 0; i < bs; i++) {
int op = (i < n - 1);
for (int j = 0; j < 4; j++) {
int x = op ? (j & 1) : (j >> 1);
if ((x ^ p[i]) == a[n - 1]) {
dp[n - 1][i][j] = 1;
}
}
}
for (int i = n - 1; i >= 1; i--) {
for (int j = 0; j < bs; j++) {
int nj = (j - 1 + bs) % bs;
int op = (nj < i - 1);
for (int k = 0; k < 4; k++) {
if (!dp[i][j][k])
continue;
int x = op ? (k & 1) : (k >> 1);
if ((x ^ p[nj]) == a[i - 1]) {
dp[i - 1][nj][k] = 1;
}
}
}
}
int ans = 0;
for (int i = 0; i < bs; i++) {
if (i > l)
continue;
int g = (l - i) / bs;
auto c = get(g);
for (int j = 0; j < 4; j++) {
if (dp[0][i][j]) {
ans += c[j];
}
}
}
cout << ans << endl;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
init();
int t = 1;
cin >> t;
while (t--)
solve();
return 0;
}M. Cook Pancakes!
cpp
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int n, m;
cin >> n >> m;
n <<= 1;
cout << max(2, (n + m - 1) / m);
}其他没做的题
- Number Game
- Tree Transform
- Gcd Product
- Path Killer
- Random Walk On Tree
- Kth Query