2021黑龙江省赛
A.And RMQ
hznu寒假集训补了的题,吉司机线段树(虽然我一直以为是泥头车线段树),结果蒟蒻本人只记得是要维护区间或值,完全忘记了是干什么用的,结果巨佬丽丽酱虽然寒假没补题,直接盲敲
题解:其实本质上还是每个取&运算,但是这道题维护区间或的目的就是为了当或值不变时,直接不进行取&运算达到节省时间的,但是呢,傻逼(define int long long)
#include<iostream>
#include<cstring>
#include<stack>
#include<queue>
#include<stdio.h>
#include<string>
#include<string.h>
#include <map>
#include<cstdio>
#include<set>
#include<stdlib.h>
#include<algorithm>
#include <math.h>
#include<cmath>
#include<list>
#include<time.h>
#include<set>
#include<vector>
#include<iomanip>
#include<fstream>
#include<cstdlib>
#include<sstream>
#include <random>
#include <functional>
#include<bits/stdc++.h>
using namespace std;
typedef double db;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 1e7+10;
const double pi = acos(-1.0);
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-8;
const double eps2 = 1e-2;
const ll mod = 1000003;
const double gold = (sqrt(5.0) - 1) / 2;
#define fast ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define edl(i,n) (i==n?'\n':' ')
#define sci(x) scanf("%d",&x)
#define scl(x) scanf("%lld",&x)
#define scd(x) scanf("%lf",&x)
//#define int long long
//#define endl "\n"
int gcd(int a, int b);
int lcm(int a, int b);
int qpow(int a, int n);
int qmul(int a, int b);
//template <typename T>
//inline void read(T& X);
// d::mt19937 rng((int)std::chrono::steady_clock::now().time_since_epoch().count());
struct node {
int l, r, maxx, val;
}tree[1600010];
int vl[400010];
void build(int id, int l, int r) {
tree[id].l = l, tree[id].r = r;
if (l == r) {
tree[id].maxx = vl[l];
tree[id].val = vl[l];
}
else {
int mid = (l + r) >> 1;
build(id << 1, l, mid);
build(id << 1 | 1, mid + 1, r);
tree[id].maxx = max(tree[id << 1].maxx, tree[id << 1 | 1].maxx);
tree[id].val = (tree[id << 1].val | tree[id << 1 | 1].val);
}
}
void query_and(int id, int l, int r, int x) {
if (tree[id].l == tree[id].r) {
tree[id].val = (tree[id].val & x);
tree[id].maxx = tree[id].val;
}
else if (tree[id].l >= l && tree[id].r <= r) {
if ((tree[id].val & x) == tree[id].val)return;
else {
query_and(id << 1, l, r, x);
query_and(id << 1 | 1, l, r, x);
tree[id].maxx = max(tree[id << 1].maxx, tree[id << 1 | 1].maxx);
tree[id].val = (tree[id << 1].val | tree[id << 1 | 1].val);
}
}
else {
int mid = (tree[id].l+tree[id].r) >> 1;
if (mid >= l)query_and(id << 1, l, r, x);
if (mid < r)query_and(id << 1 | 1, l, r, x);
tree[id].maxx = max(tree[id << 1].maxx, tree[id << 1 | 1].maxx);
tree[id].val = (tree[id << 1].val | tree[id << 1 | 1].val);
}
}
void query_upd(int id, int st, int x) {
if (tree[id].l == tree[id].r) {
tree[id].maxx = tree[id].val = x;
}
else {
int mid = (tree[id].l + tree[id].r) >> 1;
if (st <= mid)query_upd(id << 1, st, x);
else query_upd(id << 1 | 1, st, x);
tree[id].maxx = max(tree[id << 1].maxx, tree[id << 1 | 1].maxx);
tree[id].val = (tree[id << 1].val | tree[id << 1 | 1].val);
}
}
int query(int id, int l, int r) {
if (tree[id].l >= l && tree[id].r <= r)return tree[id].maxx;
else {
int mid = (tree[id].l + tree[id].r) >> 1;
if (mid >= r)return query(id << 1, l, r);
else if (mid < l)return query(id << 1 | 1, l, r);
else return max(query(id << 1, l, r), query(id << 1 | 1, l, r));
}
}
void resolve() {
int n, m; cin >> n >> m;
for (int i = 1; i <= n; i++)cin >> vl[i];
build(1, 1, n);
while (m--) {
char str[10];
cin >> str;
if (str[0] == 'A') {
int l, r, x;
cin >> l >> r >> x;
query_and(1, l, r, x);
}
else if (str[0] == 'U') {
int x, v;
cin >> x >> v;
query_upd(1, x, v);
}
else {
int l, r;
cin >> l >> r;
cout << query(1,l, r) << endl;
}
}
}
signed main() {
fast;
int _ = 1;
//cin >> _;
//sci(_);
// rand (time(NULL));
while (_--) {
resolve();
}
}
//template <typename T>
//inline void read(T& X) {
// X = 0; int w = 0; char ch = 0;
// while (!isdigit(ch)) { w |= ch == '-'; ch = getchar(); }
// while (isdigit(ch)) X = (X << 3) + (X << 1) + (ch ^ 48), ch = getchar();
// if (w) X = -X;
//}
int gcd(int a, int b) {
return b ? gcd(b, a % b) : a;
}
int lcm(int a, int b) {
return a * b / gcd(a, b);
}
int qpow(int a, int n) {
int ans = 1;
while (n) {
if (n & 1)
ans = ans * a % mod;
a = a * a % mod;
n >>= 1;
}
return ans;
}
int qmul(int a, int b) {
ll ans = 0;
while (b > 0) {
if (b & 1) ans = (ans + a) % mod;
a = (a + a) % mod;
b >>= 1;
}
return ans;
}
B.Bo Bing
待补
给大模拟恶心烂了,前前后后wa了9发
#include<iostream>
#include<cstring>
#include<stack>
#include<queue>
#include<stdio.h>
#include<string>
#include<string.h>
#include <map>
#include<cstdio>
#include<set>
#include<stdlib.h>
#include<algorithm>
#include <math.h>
#include<cmath>
#include<list>
#include<time.h>
#include<set>
#include<vector>
#include<iomanip>
#include<fstream>
#include<cstdlib>
#include<sstream>
#include <random>
#include <functional>
#include<bits/stdc++.h>
using namespace std;
typedef double db;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 1e6+10;
const double pi = acos(-1.0);
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-8;
const double eps2 = 1e-2;
const ll mod = 1000003;
const double gold = (sqrt(5.0) - 1) / 2;
#define fast ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define edl(i,n) (i==n?'\n':' ')
#define sci(x) scanf("%d",&x)
#define scl(x) scanf("%lld",&x)
#define scd(x) scanf("%lf",&x)
#define int long long
//#define endl "\n"
int gcd(int a, int b);
int lcm(int a, int b);
int qpow(int a, int n);
int qmul(int a, int b);
//template <typename T>
//inline void read(T& X);
// d::mt19937 rng((int)std::chrono::steady_clock::now().time_since_epoch().count());
// price
// 1 zhuangyuan 2 duitang a sanhong b sijin c erju d yixiu
int now, n, m, c[10], tot[10];
int z[5][maxn], last[maxn], ans[maxn][7];
bool nother,mul;
pair<int, pair<int, int>>maxx = { 0,{0,0} };
string s;
bool _4444ab() { return c[4] == 4; }
bool _aaaaab() {//mul
for (int i = 1; i <= 6; i++) {
if (i == 4)continue;
if (c[i] == 5)return 1;
}
return 0;
}
bool _44444a() { return c[4] == 5; }
bool _aaaaaa() {
for (int i = 1; i <= 6; i++) {
if (i == 4)continue;
if (c[i] == 6)return 1;
}
return 0;
}
bool _666666() { return c[6] == 6; }
bool _444444() { return c[4] == 6; }
bool _444411() {
if (c[4] == 4 && c[1] == 2)return 1;
else return 0;
}
void solvezy(int x) {
z[1][now] = x, z[2][now] = 0, z[3][now] = m;
if (x == 5 || x == 6)return;
if (x == 4) {//_aaaaaa compare a
for (int i = 1; i <= 6; i++) {
if (c[i] == 6) {
z[2][now] = i;
break;
}
}
}
if (x == 3) {//_44444a compare a
for (int i = 1; i <= 6; i++) {
if (c[i] == 1) {
z[2][now] = i;
break;
}
}
}
if (x == 2) {//_aaaaab compare a
int id = 0, ot = 0;
for (int i = 1; i <= 6; i++) {
if (c[i] == 5) {
id = i;
}
else if (c[i])ot = i;
}
z[2][now] = id * 10 + ot;
}
if (x == 1) {//_4444ab compare a+b
int sum = 0;
for (int i = 1; i <= 6; i++) {
if (i != 4) {
sum += c[i] * i;
}
}
z[2][now] = sum;
}
}
void init() {
for (int i = 0; i <= 6; i++) {
c[i] = 0;
}
nother = mul = 0;
}
void allblack() {
for (int i = 2; i <= 6; i++) {
ans[now][i] += tot[i];
tot[i] = 0;
}
}
void checkzy() {
if (_444411()) {
solvezy(6);
now = (now) % n + 1;
return;
}
if (_444444()) {
solvezy(5);
now = (now) % n + 1;
return;
}
if (_aaaaaa()) {
solvezy(4);
if(_666666())allblack();
now = (now) % n + 1;
return;
}
if (_44444a()) {
solvezy(3);
now = (now) % n + 1;
return;
}
if (_aaaaab()) {
solvezy(2);
mul = 1;//mul
//now = (now) % n + 1;
return;
}
if (_4444ab()) {
solvezy(1);
now = (now) % n + 1;
return;
}
nother = 1;//another
}
bool _123456() {
for (int i = 1; i <= 6; i++) {
if (c[i] != 1)return 0;
}
return 1;
}
bool _444abc() { return c[4] == 3; }
bool _aaaabc() {//mul
for (int i = 1; i <= 6; i++) {
if (i == 4)continue;
if (c[i] == 4)return 1;
}
return 0;
}
bool _44abcd() { return c[4] == 2; }
bool _4abcde() { return c[4] == 1; }
void solveoth(int x) {
if (!tot[x])return;
ans[now][x]++;
tot[x]--;
}
void checkoth() {
if (_123456()) {
solveoth(2);
now = (now) % n + 1;
return;
}
if (_444abc()) {
solveoth(3);
now = (now) % n + 1;
return;
}
if (!mul&&_aaaabc()) {// no mul
solveoth(4);
}
if (_44abcd()) {
solveoth(5);
now = (now) % n + 1;
return;
}
if (_4abcde()) {
solveoth(6);
now = (now) % n + 1;
return;
}
now = (now) % n + 1;
return;
}
void resolve() {
cin >> n >> m;
for (int i = 1; i <= 6; i++) {
if (i == 1 || i == 2) {
tot[i] = i;
}
else {
cin >> tot[i];
}
}
now = 1;
getline(cin, s);
while (m--) {
getline(cin, s);
if (last[now]) {// last appear 0
last[now] = 0;
now = (now) % n+1;
continue;
}
init();
for (int i = 1; i <= 11; i+=2) {
c[s[i] - '0']++;
}
if (c[0]) {
last[now] = 1;
now = (now) % n + 1;
continue;
}
checkzy();
if (!nother && !mul) {
//cout << endl;
continue;
}
checkoth();
}
int id = 0;
for (int i = 1; i <= n; i++) {
if (z[1][i] && make_pair(z[1][i], make_pair(z[2][i], z[3][i])) > maxx) {
maxx = make_pair(z[1][i], make_pair(z[2][i], z[3][i]));
id = i;
}
}
ans[id][1]++;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= 6; j++) {
cout << ans[i][j] << edl(j, 6);
}
}
}
signed main() {
fast;
int _ = 1;
//cin >> _;
//sci(_);
// rand (time(NULL));
while (_--) {
resolve();
}
}
//template <typename T>
//inline void read(T& X) {
// X = 0; int w = 0; char ch = 0;
// while (!isdigit(ch)) { w |= ch == '-'; ch = getchar(); }
// while (isdigit(ch)) X = (X << 3) + (X << 1) + (ch ^ 48), ch = getchar();
// if (w) X = -X;
//}
int gcd(int a, int b) {
return b ? gcd(b, a % b) : a;
}
int lcm(int a, int b) {
return a * b / gcd(a, b);
}
int qpow(int a, int n) {
int ans = 1;
while (n) {
if (n & 1)
ans = ans * a % mod;
a = a * a % mod;
n >>= 1;
}
return ans;
}
int qmul(int a, int b) {
ll ans = 0;
while (b > 0) {
if (b & 1) ans = (ans + a) % mod;
a = (a + a) % mod;
b >>= 1;
}
return ans;
}
C.Cookie
待补
D.Doin' Time
a这题的时候我大概率在搞筛法??丽丽酱来了句区间dp板子题,然后臭傻逼嘉晚饭冲到机上叭叭猛敲,我连题目还没读就结束了
放个队友的码
#include<iostream>
#include<cstring>
#include<stack>
#include<queue>
#include<stdio.h>
#include<string>
#include<string.h>
#include <map>
#include<cstdio>
#include<set>
#include<stdlib.h>
#include<algorithm>
#include <math.h>
#include<cmath>
#include<list>
#include<time.h>
#include<set>
#include<vector>
#include<iomanip>
#include<fstream>
#include<cstdlib>
#include<sstream>
#include <random>
#include <functional>
#include<bits/stdc++.h>
using namespace std;
typedef double db;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 3e2 + 7;
const double pi = acos(-1.0);
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-8;
const double eps2 = 1e-2;
const ll mod = 1000003;
const double gold = (sqrt(5.0) - 1) / 2;
#define fast ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define edl(i,n) (i==n?'\n':' ')
#define sci(x) scanf("%d",&x)
#define scl(x) scanf("%lld",&x)
#define scd(x) scanf("%lf",&x)
#define int long long
//#define endl "\n"
int gcd(int a, int b);
int lcm(int a, int b);
int qpow(int a, int n);
int qmul(int a, int b);
//template <typename T>
//inline void read(T& X);
// d::mt19937 rng((int)std::chrono::steady_clock::now().time_since_epoch().count());
int a[maxn][maxn];
int dp[maxn][maxn];
void resolve() {
int n; cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i][i];
}
for (int len = 1; len <= n - 1; len++) {
for (int i = 1; i <= n; i++) {
int j = min(i + len, n);
for (int k = i; k < j; k++) {
dp[i][j] = max(dp[i][j], dp[i][k] + dp[k+1][j] + (int)pow(a[i][k] - a[k + 1][j], 2));
a[i][j] = a[i][k] * a[k + 1][j] % mod;
}
}
}
cout << dp[1][n] << endl;
}
signed main() {
fast;
int _ = 1;
//cin >> _;
//sci(_);
// rand (time(NULL));
while (_--) {
resolve();
}
}
//template <typename T>
//inline void read(T& X) {
// X = 0; int w = 0; char ch = 0;
// while (!isdigit(ch)) { w |= ch == '-'; ch = getchar(); }
// while (isdigit(ch)) X = (X << 3) + (X << 1) + (ch ^ 48), ch = getchar();
// if (w) X = -X;
//}
int gcd(int a, int b) {
return b ? gcd(b, a % b) : a;
}
int lcm(int a, int b) {
return a * b / gcd(a, b);
}
int qpow(int a, int n) {
int ans = 1;
while (n) {
if (n & 1)
ans = ans * a % mod;
a = a * a % mod;
n >>= 1;
}
return ans;
}
int qmul(int a, int b) {
ll ans = 0;
while (b > 0) {
if (b & 1) ans = (ans + a) % mod;
a = (a + a) % mod;
b >>= 1;
}
return ans;
}
E.Elastic Search
待补
F.Function
一眼筛法题,但是呢,思考了半天,发现自己还没化简,化简完后总觉得哪里差点,先去敲发现连样例都没过,发现自己忘记弄多质数合数了,然后改了一下a了。赛后知道别的队有打表过的,人麻了
#include<iostream>
#include<cstring>
#include<stack>
#include<queue>
#include<stdio.h>
#include<string>
#include<string.h>
#include <map>
#include<cstdio>
#include<set>
#include<stdlib.h>
#include<algorithm>
#include <math.h>
#include<cmath>
#include<list>
#include<time.h>
#include<set>
#include<vector>
#include<iomanip>
#include<fstream>
#include<cstdlib>
#include<sstream>
#include <random>
#include <functional>
#include<bits/stdc++.h>
using namespace std;
typedef double db;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 1e7+10;
const double pi = acos(-1.0);
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-8;
const double eps2 = 1e-2;
const ll mod = 1000003;
const double gold = (sqrt(5.0) - 1) / 2;
#define fast ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define edl(i,n) (i==n?'\n':' ')
#define sci(x) scanf("%d",&x)
#define scl(x) scanf("%lld",&x)
#define scd(x) scanf("%lf",&x)
#define int long long
//#define endl "\n"
int gcd(int a, int b);
int lcm(int a, int b);
int qpow(int a, int n);
int qmul(int a, int b);
//template <typename T>
//inline void read(T& X);
// d::mt19937 rng((int)std::chrono::steady_clock::now().time_since_epoch().count());
int notPrime[maxn], tot, prime[maxn],f[maxn];
void init() {
f[1] = 1;
for (int i = 2; i < maxn; ++i){
if (!notPrime[i]){// one prime
prime[tot++] = i;
f[i] = 1;
}
for (int j = 0; j < tot && i * prime[j] < maxn; ++j){
notPrime[i * prime[j]] = 1;
if (i % prime[j] == 0) {
int x = i;
int cnt = 0;
while (x % prime[j]==0) {
x /= prime[j];
cnt++;
}
if (cnt & 1) {
f[i * prime[j]] = f[i] * prime[j];
}
else {
f[i * prime[j]] = f[i];
}
break;
}
f[i * prime[j]] = i;
}
}
}
void resolve() {
int n; cin >> n;
int sum = 0;
for (int i = 1; i <= n; i++)sum += f[i];
cout << sum << endl;
}
signed main() {
fast;
int _ = 1;
init();
//cin >> _;
//sci(_);
// rand (time(NULL));
while (_--) {
resolve();
}
}
//template <typename T>
//inline void read(T& X) {
// X = 0; int w = 0; char ch = 0;
// while (!isdigit(ch)) { w |= ch == '-'; ch = getchar(); }
// while (isdigit(ch)) X = (X << 3) + (X << 1) + (ch ^ 48), ch = getchar();
// if (w) X = -X;
//}
int gcd(int a, int b) {
return b ? gcd(b, a % b) : a;
}
int lcm(int a, int b) {
return a * b / gcd(a, b);
}
int qpow(int a, int n) {
int ans = 1;
while (n) {
if (n & 1)
ans = ans * a % mod;
a = a * a % mod;
n >>= 1;
}
return ans;
}
int qmul(int a, int b) {
ll ans = 0;
while (b > 0) {
if (b & 1) ans = (ans + a) % mod;
a = (a + a) % mod;
b >>= 1;
}
return ans;
}
G.Go? No
待补
H.Hack DSU!
这个时候蒟蒻本人在干嘛,我在因补过a题但是在赛场上没写出来被队友罚面壁??然后两个大腿你说一句我说一句对对对wa了一发,过了一会儿丽丽酱来了一句那反过来不就好了就a了,我还不知道发生了什么
#include<iostream>
#include<cstring>
#include<stack>
#include<queue>
#include<stdio.h>
#include<string>
#include<string.h>
#include <map>
#include<cstdio>
#include<set>
#include<stdlib.h>
#include<algorithm>
#include <math.h>
#include<cmath>
#include<list>
#include<time.h>
#include<set>
#include<vector>
#include<iomanip>
#include<fstream>
#include<cstdlib>
#include<sstream>
#include <random>
#include <functional>
#include<bits/stdc++.h>
using namespace std;
typedef double db;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 1e7+10;
const double pi = acos(-1.0);
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-8;
const double eps2 = 1e-2;
const ll mod = 1000003;
const double gold = (sqrt(5.0) - 1) / 2;
#define fast ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define edl(i,n) (i==n?'\n':' ')
#define sci(x) scanf("%d",&x)
#define scl(x) scanf("%lld",&x)
#define scd(x) scanf("%lf",&x)
#define int long long
//#define endl "\n"
int gcd(int a, int b);
int lcm(int a, int b);
int qpow(int a, int n);
int qmul(int a, int b);
//template <typename T>
//inline void read(T& X);
// d::mt19937 rng((int)std::chrono::steady_clock::now().time_since_epoch().count());
int notPrime[maxn], tot, prime[maxn],f[maxn];
void init() {
f[1] = 1;
for (int i = 2; i < maxn; ++i){
if (!notPrime[i]){// one prime
prime[tot++] = i;
f[i] = 1;
}
for (int j = 0; j < tot && i * prime[j] < maxn; ++j){
notPrime[i * prime[j]] = 1;
if (i % prime[j] == 0) {
int x = i;
int cnt = 0;
while (x % prime[j]==0) {
x /= prime[j];
cnt++;
}
if (cnt & 1) {
f[i * prime[j]] = f[i] * prime[j];
}
else {
f[i * prime[j]] = f[i];
}
break;
}
f[i * prime[j]] = i;
}
}
}
void resolve() {
int n, m; cin >> n >> m;
for (int i = n - 1; i >= 1; i--)cout << n << " " << i << endl;
cout << n << " " << n;
}
signed main() {
fast;
int _ = 1;
init();
//cin >> _;
//sci(_);
// rand (time(NULL));
while (_--) {
resolve();
}
}
//template <typename T>
//inline void read(T& X) {
// X = 0; int w = 0; char ch = 0;
// while (!isdigit(ch)) { w |= ch == '-'; ch = getchar(); }
// while (isdigit(ch)) X = (X << 3) + (X << 1) + (ch ^ 48), ch = getchar();
// if (w) X = -X;
//}
int gcd(int a, int b) {
return b ? gcd(b, a % b) : a;
}
int lcm(int a, int b) {
return a * b / gcd(a, b);
}
int qpow(int a, int n) {
int ans = 1;
while (n) {
if (n & 1)
ans = ans * a % mod;
a = a * a % mod;
n >>= 1;
}
return ans;
}
int qmul(int a, int b) {
ll ans = 0;
while (b > 0) {
if (b & 1) ans = (ans + a) % mod;
a = (a + a) % mod;
b >>= 1;
}
return ans;
}
I. ICU4C
在A题和H题都结束之后,队友也不让我面壁了,我干脆解放天性,直接冲最爱的博弈论,顺便带上了嘉晚饭,然后玩了半个多小时,出了好多样例,但是每一次就会有一个新的样例把我们自己的想法hack掉。然后三个b就瘫在那边了。然后我去看了一下自己的博弈论大礼包,赌怪辅助器(其实就是一堆博弈论题目的经典模型),??我拍了下嘉晚饭,这是不是和阶梯博弈模型一模一样,“嘶,好像” “要不冲一下” “可冲” ,然后又花了十几分钟时间把杂七杂八的东西给剥掉(其实就是将阶梯给搭起来),然后交了一发,wa了。
我就巨奇怪,这不可能wa啊,然后发现自己奇数忘记敲了(阶梯博弈其实就是本质是奇数位的Nim博弈),好像下午就没带脑子??然后就a了
#include<iostream>
#include<cstring>
#include<stack>
#include<queue>
#include<stdio.h>
#include<string>
#include<string.h>
#include <map>
#include<cstdio>
#include<set>
#include<stdlib.h>
#include<algorithm>
#include <math.h>
#include<cmath>
#include<list>
#include<time.h>
#include<set>
#include<vector>
#include<iomanip>
#include<fstream>
#include<cstdlib>
#include<sstream>
#include <random>
#include <functional>
#include<bits/stdc++.h>
using namespace std;
typedef double db;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 1e7+10;
const double pi = acos(-1.0);
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-8;
const double eps2 = 1e-2;
const ll mod = 1000003;
const double gold = (sqrt(5.0) - 1) / 2;
#define fast ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define edl(i,n) (i==n?'\n':' ')
#define sci(x) scanf("%d",&x)
#define scl(x) scanf("%lld",&x)
#define scd(x) scanf("%lf",&x)
#define int long long
//#define endl "\n"
int gcd(int a, int b);
int lcm(int a, int b);
int qpow(int a, int n);
int qmul(int a, int b);
//template <typename T>
//inline void read(T& X);
// d::mt19937 rng((int)std::chrono::steady_clock::now().time_since_epoch().count());
void resolve() {
int n; cin >> n;
int ans = 0;
for (int i = 1; i <= n; i++) {
map<int, int>mp;
int m, e; cin >> m >> e;
for (int j = 1; j <= m; j++) {
int x; cin >> x;
mp[e - x - m+j]++;//���յ㲽��
}
for (auto j : mp) {
if (j.first & 1) {
ans ^= j.second;
}
}
}
cout << (ans ? "Alice" : "Bob") << endl;
}
signed main() {
fast;
int _ = 1;
cin >> _;
//sci(_);
// rand (time(NULL));
while (_--) {
resolve();
}
}
//template <typename T>
//inline void read(T& X) {
// X = 0; int w = 0; char ch = 0;
// while (!isdigit(ch)) { w |= ch == '-'; ch = getchar(); }
// while (isdigit(ch)) X = (X << 3) + (X << 1) + (ch ^ 48), ch = getchar();
// if (w) X = -X;
//}
int gcd(int a, int b) {
return b ? gcd(b, a % b) : a;
}
int lcm(int a, int b) {
return a * b / gcd(a, b);
}
int qpow(int a, int n) {
int ans = 1;
while (n) {
if (n & 1)
ans = ans * a % mod;
a = a * a % mod;
n >>= 1;
}
return ans;
}
int qmul(int a, int b) {
ll ans = 0;
while (b > 0) {
if (b & 1) ans = (ans + a) % mod;
a = (a + a) % mod;
b >>= 1;
}
return ans;
}
J. JOJO's Factory
我和丽丽酱说:你的题,二分图。把他骗过去想半天,回来他告诉我“***,**思维”
#include<iostream>
#include<cstring>
#include<stack>
#include<queue>
#include<stdio.h>
#include<string>
#include<string.h>
#include <map>
#include<cstdio>
#include<set>
#include<stdlib.h>
#include<algorithm>
#include <math.h>
#include<cmath>
#include<list>
#include<time.h>
#include<set>
#include<vector>
#include<iomanip>
#include<fstream>
#include<cstdlib>
#include<sstream>
#include <random>
#include <functional>
#include<bits/stdc++.h>
using namespace std;
typedef double db;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 3e2 + 7;
const double pi = acos(-1.0);
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-8;
const double eps2 = 1e-2;
const ll mod = 1000003;
const double gold = (sqrt(5.0) - 1) / 2;
#define fast ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define edl(i,n) (i==n?'\n':' ')
#define sci(x) scanf("%d",&x)
#define scl(x) scanf("%lld",&x)
#define scd(x) scanf("%lf",&x)
#define int long long
//#define endl "\n"
int gcd(int a, int b);
int lcm(int a, int b);
int qpow(int a, int n);
int qmul(int a, int b);
//template <typename T>
//inline void read(T& X);
// d::mt19937 rng((int)std::chrono::steady_clock::now().time_since_epoch().count());
int nl[500010], nr[500010];
vector<int>vec1[500010], vec2[500010];
int vis1, vis2;
void resolve() {
int n, m; cin >> n >> m;
for (int i = 1; i <= m; i++) {
int l, r; cin >> l >> r;
nl[l]++, nr[r]++;
vec1[l].push_back(r);
vec2[r].push_back(l);
}
for (int i = 1; i <= n; i++) {
if (vec1[i].size() == n || vec2[i].size() == n) {
cout << n - 1 << endl;
return;
}
}
for (int i = 1; i <= n; i++) {
if (vec1[i].size() == n - 1) {
sort(vec1[i].begin(), vec1[i].end());
int ij = 1;
for (auto j : vec1[i]) {
if (ij != j) {
if (vis1 == 0) {
vis1 = ij;
break;
}
else {
vis2 = ij;
break;
}
}
ij++;
}
if (ij == n && vis1 == 0)vis1 = n;
else if (ij == n && vis2 == 0)vis2 = n;
}
}
//cout << vis1 << " " << vis2 << endl;
if (vis1 == vis2 && vis1 != 0) {
cout << n - 1 << endl;
return;
}
vis1 = vis2 = 0;
for (int i = 1; i <= n; i++) {
if (vec2[i].size() == n - 1) {
sort(vec2[i].begin(), vec2[i].end());
int ij = 1;
for (auto j : vec2[i]) {
if (ij != j) {
if (vis1 == 0) {
vis1 = ij;
break;
}
else {
vis2 = ij;
break;
}
}
ij++;
}
if (ij == n && vis1 == 0)vis1 = n;
else if (ij == n && vis2 == 0)vis2 = n;
}
}
//cout << vis1 << " " << vis2 << endl;
if (vis1 == vis2 && vis1 != 0) {
cout << n - 1 << endl;
return;
}
cout << n;
}
signed main() {
fast;
int _ = 1;
//cin >> _;
//sci(_);
// rand (time(NULL));
while (_--) {
resolve();
}
}
//template <typename T>
//inline void read(T& X) {
// X = 0; int w = 0; char ch = 0;
// while (!isdigit(ch)) { w |= ch == '-'; ch = getchar(); }
// while (isdigit(ch)) X = (X << 3) + (X << 1) + (ch ^ 48), ch = getchar();
// if (w) X = -X;
//}
int gcd(int a, int b) {
return b ? gcd(b, a % b) : a;
}
int lcm(int a, int b) {
return a * b / gcd(a, b);
}
int qpow(int a, int n) {
int ans = 1;
while (n) {
if (n & 1)
ans = ans * a % mod;
a = a * a % mod;
n >>= 1;
}
return ans;
}
int qmul(int a, int b) {
ll ans = 0;
while (b > 0) {
if (b & 1) ans = (ans + a) % mod;
a = (a + a) % mod;
b >>= 1;
}
return ans;
}
K. Keep Eating
签到题。也是写的很久的一道题,原因是大猪鼻嘉晚饭把题多错了,说只能吃一半,然后他就搁那不说话了,(估计叛逆期到了),
#include<iostream>
#include<cstring>
#include<stack>
#include<queue>
#include<stdio.h>
#include<string>
#include<string.h>
#include <map>
#include<cstdio>
#include<set>
#include<stdlib.h>
#include<algorithm>
#include <math.h>
#include<cmath>
#include<list>
#include<time.h>
#include<set>
#include<vector>
#include<iomanip>
#include<fstream>
#include<cstdlib>
#include<sstream>
#include <random>
#include <functional>
#include<bits/stdc++.h>
using namespace std;
typedef double db;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 2e5 + 7;
const double pi = acos(-1.0);
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-8;
const double eps2 = 1e-2;
const ll mod = 998244353;
const double gold = (sqrt(5.0) - 1) / 2;
#define fast ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define edl(i,n) (i==n?'\n':' ')
#define sci(x) scanf("%d",&x)
#define scl(x) scanf("%lld",&x)
#define scd(x) scanf("%lf",&x)
#define int long long
//#define endl "\n"
int gcd(int a, int b);
int lcm(int a, int b);
int qpow(int a, int n);
int qmul(int a, int b);
//template <typename T>
//inline void read(T& X);
// d::mt19937 rng((int)std::chrono::steady_clock::now().time_since_epoch().count());
int a[maxn];
void resolve() {
int sum = 0;
int n, k; cin >> n >> k;
for (int i = 1; i <= n; i++) {
cin >> a[i];
sum += a[i];
}
int ans=0;
if (sum >= k) {
sum -= k;
ans = sum + k / 2;
}
cout << ans << endl;
}
signed main() {
fast;
int _ = 1;
//cin >> _;
//sci(_);
// rand (time(NULL));
while (_--) {
resolve();
}
}
//template <typename T>
//inline void read(T& X) {
// X = 0; int w = 0; char ch = 0;
// while (!isdigit(ch)) { w |= ch == '-'; ch = getchar(); }
// while (isdigit(ch)) X = (X << 3) + (X << 1) + (ch ^ 48), ch = getchar();
// if (w) X = -X;
//}
int gcd(int a, int b) {
return b ? gcd(b, a % b) : a;
}
int lcm(int a, int b) {
return a * b / gcd(a, b);
}
int qpow(int a, int n) {
int ans = 1;
while (n) {
if (n & 1)
ans = ans * a % mod;
a = a * a % mod;
n >>= 1;
}
return ans;
}
int qmul(int a, int b) {
ll ans = 0;
while (b > 0) {
if (b & 1) ans = (ans + a) % mod;
a = (a + a) % mod;
b >>= 1;
}
return ans;
}
L. Labi-Ribi
hznu2021Oct. Training 5的时候写了,当时就是按照学长给的题解补的,今天就没写了,时间花博弈论上了,写博客的时候发现短短半年,码风截然不同(哭泣.jpg)
题意: 有\(n\)个关卡,需要你的攻击力大于等于\(BOSS\)的生命值才能过关,击败\(BOSS_i\)后你可以增加\(b_i\)的攻击力,其他剩余\(BOSS\)会增加 \(a_i\)生命值。问至少要多少初始生命值能全部通关。有\(q\)个询问,依次增加一个关卡,输出新增后需要的最低通关生命值。
思路: 怪的生命值\(h_i\) ,打一只怪可以得到\(b_i\)攻击力,但是其他怪会得到\(a_i\)命值,所以其实可以转化为打一只怪得到\(b_i-a_i\)攻击力。 那么对于\(b_i-a_i\)大于等于\(0\)的,我们肯定优先拿,拿取顺序可以直接按\(h_i\)小的贪心取,然后是对于\(b_i-a_i\)小于\(0\)的情况,令 \(c_i=b_i-a_i\),可以按\(h_i+c_i\)大的贪心拿取。对于第二种情况两个怪 ,先拿哪个,会有情况先打第一个,就打不了第二个,先打第二个可以打第一个。那么就有:
\(x+c_2>=h_1\)
\(x+c_1<h_2\)
所以有\(h_1-c_2<=x<h_2-c_1\),也就是\(h_1+c_1<h_2+c_2\)可知优先拿取\(h_i+c_i\)大的最优。 题目\(q=1000\),可以复杂度\(O(nq)\)做。
#include<iostream>
#include<cstring>
#include<stack>
#include<queue>
#include<stdio.h>
#include<string>
#include<string.h>
#include <map>
#include<cstdio>
#include<set>
#include<stdlib.h>
#include<algorithm>
#include <math.h>
#include<cmath>
#include<list>
#include<time.h>
#include<set>
#include<vector>
#include<iomanip>
#include<fstream>
#include<cstdlib>
#include<sstream>
//const int MAXN = 1e6 + 7;
const double pi = acos(-1.0);
const int inf = 0x3f3f3f3f;
const double eps = 1e-10;
typedef long long ll;
#define fast ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;
typedef unsigned long long ull;
const int maxn = 2e5;
using namespace std;
const double gold = (sqrt(5.0) - 1) / 2;
#define sci(x) scanf("%d",&x)
#define scI(x) scanf("%lld",&x)
const int mod = 1e9 + 7;
int n;
struct node {
ll num, a, b, limit;
node() {}
node(ll _num, ll _a, ll _b, ll _limit) {
num = _num;
a = _a;
b = _b;
limit = _limit;
}
bool operator<(const node& x)const {
if (limit >= 0 && x.limit >= 0)return num < x.num;
else if (limit < 0 && x.limit < 0)return num + limit > x.num + x.limit;
return limit > x.limit;
}
}no[maxn];
ll solve() {
ll cntnow = no[1].num + no[1].limit;
ll cnt = no[1].num;
for (int i = 2; i <= n; i++) {
if (cntnow >= no[i].num) {
cntnow += no[i].limit;
}
else {
cnt += no[i].num - cntnow;
cntnow = no[i].num;
cntnow += no[i].limit;
}
}
return cnt;
}
int main() {
sci(n);
for (int i = 1; i <= n; i++) {
ll x;
scI(x);
no[i].num = x;
}
for (int i = 1; i <= n; i++) {
ll x, y;
scI(x), scI(y);
no[i].a = x;
no[i].b = y;
no[i].limit = y - x;
}
sort(no + 1, no + 1 + n);
// for(int i=1;i<=n;i++){
// cout<<"no"<<i<<":"<<no[i].num<<" "<<no[i].a<<" "<<no[i].b<<" "<<no[i].limit<<endl;
// }
printf("%lld\n", solve());
int q;
sci(q);
while (q--) {
ll h, a, b;
scI(h), scI(a), scI(b);
node x;
x.num = h;
x.a = a;
x.b = b;
x.limit = b - a;
int pos = upper_bound(no + 1, no + n + 1, x) - no;
for (int i = n; i >= pos; i--) {
no[i + 1] = no[i];
}
no[pos] = x;
n++;
printf("%lld\n", solve());
}
}

浙公网安备 33010602011771号