模拟题:有一个推送器和一个盒子,推送器会给出松针片,松针下面的片一定要比上面的大,看能组合成一些什么样的松针
感觉没什么特别的地方,模拟就行了,但是赛时写拉了,只拿了19分
#include
using namespace std;
#define int long long
#define ll __int128
#define PII pair
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
int ls(int p){ return (p << 1) ;}
int rs(int p){ return (p << 1 | 1) ;}
inline int lowbit(int x) { return x & (-x) ;}
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 1e9 + 7;
const int N = 2e5 + 6;
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};
void solve(){
int n ,m ,k;
cin >> n >> m >> k;
queue q;
stack s;
for (int i = 0; i < n; i ++ ){
int x;
cin >> x;
q.push(x);
}
while(1){
vector v;
bool ok = 0;
while(1){
if (v.empty()){
if (!s.empty()){
v.push_back(s.top());
s.pop();
}else if (!q.empty()){
v.push_back(q.front());
q.pop();
}else break;
}else{
if (!s.empty() and s.top() <= v.back()){
v.push_back(s.top());
s.pop();
}else{
while (!q.empty() and s.size() <= m){
auto t = q.front();
if (t <= v.back()){
q.pop();
v.push_back(t);
break;
}else{
if (s.size() == m){
ok = 1;
break;
}else{
s.push(t);
q.pop();
}
}
}
if (q.empty() and (s.empty() or s.top() > v.back())) break;
}
}
if (ok or v.size() == k) break;
}
for (int i = 0 ; i < v.size() ; i ++){
if (i != v.size() - 1){
cout << v[i] << ' ';
}else{
cout << v[i] << endl;
}
}
if(s.empty() && q.empty()) break;
}
}
signed main(){
IOS
int O_O = 1;
// cin >> O_O;
while(O_O--) solve();
}
给出一棵树,这是龙龙送外卖的路径,每条路的长度为1,现在要在原有的点多送一份外卖,看最短距离为多少 ,我的思路是先算出每个点的深度,然后对于新增的点他所走的所有路径之和,然后减去最大深度就是答案
#include
using namespace std;
#define int long long
#define PII pair
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
int ls(int p){ return (p << 1) ;}
int rs(int p){ return (p << 1 | 1) ;}
inline int lowbit(int x) { return x & (-x) ;}
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 998244353;
const int N = 1e5 + 6;
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};
vector g[N];
int d[N];
bool vis[N];
void dfs(int u){
for(auto v:g[u]){
d[v] = d[u] + 1;
dfs(v);
}
}
void solve(){
int n ,m ,j;
cin >> n >> m;
vector a(n + 1);
for(int i = 1 ; i <= n ; i++){
cin >> a[i];
if(a[i] == -1) j = i;
else g[a[i]].push_back(i);
}
dfs(j);
int dis = 0 ,mx = 0;
while(m--){
int x;
cin >> x;
mx = max(mx ,d[x]);
while(!vis[x] and x != j){
vis[x] = 1;
dis += 2;
x = a[x];
}
cout << dis - mx << endl;
}
}
signed main(){
IOS
int O_O = 1;
// cin >> O_O;
while(O_O--) solve();
}
直接输出b c c
#include
using namespace std;
#define int long long
#define PII pair
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
int ls(int p){ return (p << 1) ;}
int rs(int p){ return (p << 1 | 1) ;}
inline int lowbit(int x) { return x & (-x) ;}
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 998244353;
const int N = 1e5 + 6;
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};
void solve(){
int a ,b ,c ,d;
cin >> a >> b >> c >> d;
cout << b << " " << c << " " << c << endl;
}
signed main(){
IOS
int O_O = 1;
cin >> O_O;
while(O_O--) solve();
}
模拟,一直除二加十直到减十操作能满足
#include
using namespace std;
#define int long long
#define PII pair
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
int ls(int p){ return (p << 1) ;}
int rs(int p){ return (p << 1 | 1) ;}
inline int lowbit(int x) { return x & (-x) ;}
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 998244353;
const int N = 1e5 + 6;
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};
void solve(){
int x ,n ,m;
cin >> x >> n >> m;
if(m * 10 >= x){
cout << "YES" << endl;
return;
}
while(n > 0){
x = x / 2 + 10;
if(m * 10 >= x){
cout << "YES" << endl;
return;
}
n--;
}
if(m * 10 >= x){
cout << "YES" << endl;
return;
}
cout << "NO" << endl;
}
signed main(){
IOS
int O_O = 1;
cin >> O_O;
while(O_O--) solve();
}
试了很多种结果,最后发现就是深度减子树数量最大的前k个
#include
using namespace std;
#define int long long
#define PII pair
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
int ls(int p){ return (p << 1) ;}
int rs(int p){ return (p << 1 | 1) ;}
inline int lowbit(int x) { return x & (-x) ;}
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 998244353;
const int N = 2e5 + 6;
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};
vector g[N];
bool vis[N];
int d[N] ,chi[N];
priority_queue q;
int dfs(int u){
vis[u] = 1;
chi[u] = 1;
for(auto x : g[u]){
if(x == 1 or vis[x]) continue;
vis[x] = 1;
d[x] = d[u] + 1;
chi[u] += dfs(x);
}
q.push(d[u] - chi[u] + 1);
return chi[u];
}
void solve(){
int n ,k;
cin >> n >> k;
for(int i = 1 ; i < n ; i++) {
int u ,v;
cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}
dfs(1);
int ans = 0 ,num = 0;
// for(int i = 1 ; i <= n ; i++){
// cout << i << " : " << d[i] << " " << chi[i] << endl;
// }
for(int i = 1 ; i <= k ; i++){
ans+=q.top();
q.pop();
}
cout << ans << endl;
}
signed main(){
IOS
int O_O = 1;
// cin >> O_O;
while(O_O--) solve();
}
固定一个值然后二分查找满足条件的,不过r g b 之间的优先级是看题解才知道的
#include
using namespace std;
#define int long long
#define ll __int128
#define PII pair
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
int ls(int p){ return (p << 1) ;}
int rs(int p){ return (p << 1 | 1) ;}
inline int lowbit(int x) { return x & (-x) ;}
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 1e9 + 7;
const int N = 2e5 + 6;
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};
int ans = LLONG_MAX;
int cal(int x){return x * x;}
void check(vector a ,vector b ,vector c){
for(auto x : a){
auto u = lower_bound(b.begin(),b.end(),x);
auto v = upper_bound(c.begin(),c.end(),x);
if(u == b.end() or v == c.begin()) continue;
v--;
ans = min(ans ,cal(x - *u) + cal(*u - *v) + cal(*v - x));
}
}
void solve(){
int nr ,ng ,nb;
cin >> nr >> ng >> nb;
vector r(nr) ,g(ng),b(nb);
for(int i = 0 ; i < nr ; i++) cin >> r[i];
for(int i = 0 ; i < ng ; i++) cin >> g[i];
for(int i = 0 ; i < nb ; i++) cin >> b[i];
sort(r.begin(),r.end());
sort(g.begin(),g.end());
sort(b.begin(),b.end());
ans = LLONG_MAX;
check(r, g, b); check(r, b, g);
check(g, b, r); check(g, r, b);
check(b, r, g); check(b, g, r);
cout << ans << endl;
}
signed main(){
IOS
int O_O = 1;
cin >> O_O;
while(O_O--) solve();
}
按照题意输出答案即可
#include
using namespace std;
#define int long long
#define PII pair
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
int ls(int p){ return (p << 1) ;}
int rs(int p){ return (p << 1 | 1) ;}
inline int lowbit(int x) { return x & (-x) ;}
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 998244353;
const int N = 2e5 + 6;
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};
void solve(){
int x ,y ,z ,a ,b ,c;
cin >> x >> y >> z >> a >> b >> c;
cout << max(max(x * a , y * b) , c * z) << endl;
}
signed main(){
IOS
int O_O = 1;
cin >> O_O;
while(O_O--) solve();
}
贪心
#include
using namespace std;
#define int long long
#define PII pair
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
int ls(int p){ return (p << 1) ;}
int rs(int p){ return (p << 1 | 1) ;}
inline int lowbit(int x) { return x & (-x) ;}
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 998244353;
const int N = 2e5 + 6;
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};
void solve(){
int n;
cin >> n;
string s;
cin >> s;
int ans = 0 ,num = 0 ,cnt = 0;
for(int i = 0 ; i < n ; i++){
string c = s.substr(i,8);
if(i <= n - 7 and c == "uwawauwa" and cnt and num){
ans += cnt;
if(s[i - 1] == 'u') ans--;
}
if(cnt) num++;
if(s[i] == 'u') cnt++;
if(i == n - 7) break;
}
cout << ans << endl;
}
signed main(){
IOS
int O_O = 1;
cin >> O_O;
while(O_O--) solve();
}
求出往左下后和右下两个方向的前缀和,然后对于每个点加上两个前缀和减去本身的值取最大值
#include
using namespace std;
#define int long long
#define PII pair
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
int ls(int p){ return (p << 1) ;}
int rs(int p){ return (p << 1 | 1) ;}
inline int lowbit(int x) { return x & (-x) ;}
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 998244353;
const int N = 2e5 + 6;
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};
int mp[1005][1005];
void solve(){
int n ,m;
cin >> n >> m;
for(int i = 1 ; i <= n ; i++){
for(int j = 1 ; j <= m ; j++){
cin >> mp[i][j];
}
}
vector> sum1(n + 2,vector(m + 2 ,0));
vector> sum2(n + 2,vector(m + 2 ,0));
for (int i = 1 ; i <= n ; i++){
for (int j = 1 ; j <= m ; j++) {
if(i > 1 and j > 1) sum1[i][j] = mp[i][j] + sum1[i - 1][j - 1];
else sum1[i][j] = mp[i][j];
}
}
for (int i = 1 ; i <= n ; i++){
for (int j = 1 ; j <= m ; j++){
if(i > 1 and j < m) sum2[i][j] = mp[i][j] + sum2[i - 1][j + 1];
else sum2[i][j] = mp[i][j];
}
}
int ans = 0;
for (int i = 1 ; i <= n ; i++){
for (int j = 1 ; j <= m ; j++){
int res = 0 ,y = j - 1 ,x = i + y;
if(x > n){
x = n - i;
y = max(1ll,j - x);
res += sum2[n][y];
}else res += sum2[x][1];
y = m - j , x = i + y;
if(x > n){
x = n - i;
y = min(j + x,m);
res += sum1[n][y];
}else res += sum1[x][m];
res -= mp[i][j];
ans = max(ans ,res);
}
}
cout << ans << endl;
}
signed main(){
IOS
int O_O = 1;
cin >> O_O;
while(O_O--) solve();
}
easy版的可以用二进制枚举暴力解决,但是我一开始是直接在找规律,发现对于每个字符串,只要前后两个字符相同,贡献就是n - 2 ,不同就是2,但是前几发判断条件写的有点问题,后面用二进制枚举解决的
#include
using namespace std;
#define int long long
#define PII pair
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
int ls(int p){ return (p << 1) ;}
int rs(int p){ return (p << 1 | 1) ;}
inline int lowbit(int x) { return x & (-x) ;}
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 1e9 + 7;
const int N = 2e5 + 6;
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};
void solve(){
int n;
cin >> n;
string s;
cin >> s;
int z = 0;
vector idx;
for(int i = 0 ; i < n ; i++) if(s[i] == '?') z++ ,idx.push_back(i);
int ans = 0;
for(int i = 0 ; i < (1 << z) ; i++){
string c = s;
for(int j = 0 ; j < z ; j++){
if(i & (1 << j)) c[idx[j]] = '1';
else c[idx[j]] = '0';
}
for(int j = 0 ; j < n ; j++){
int x = 0 ,y = 0;
string ss = c;
if(ss[j] == '0') ss[j] = '1';
else ss[j] = '0';
for(int k = 0 ; k < n - 1; k++){
if(ss[k] == '0' and ss[k + 1] == '1') x++;
else if(ss[k] == '1' and ss[k + 1] == '0') y++;
}
if(x == y) ans++;
ans %= mod;
}
}
cout << ans % mod << endl;
}
signed main(){
IOS
int O_O = 1;
cin >> O_O;
while(O_O--) solve();
}
这个hard版就要用到刚才的规律了,另外他的数值有点大,开128才过,WA了几发是因为取模没有写规范,除法取模应该要直接算z - 1次方,而不是算z次方除2,这样会丢精度
#include
using namespace std;
#define ll __int128
#define PII pair
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
int ls(int p){ return (p << 1) ;}
int rs(int p){ return (p << 1 | 1) ;}
inline int lowbit(int x) { return x & (-x) ;}
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 1e9 + 7;
const int N = 2e5 + 6;
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};
inline void print(ll n){
if(n<0){
putchar('-');
n*=-1;
}
if(n>9) print(n/10);
putchar(n % 10 + '0');
}
ll qmi(ll x,int y){
ll res = 1;
while(y){
if(y & 1) res = ((res % mod) * x) % mod;
x = (x * x) % mod;
y >>= 1;
}
return res % mod;
}
void solve(){
int n;
cin >> n;
string s;
cin >> s;
int z = 0;
for(int i = 0 ; i < n ; i++) if(s[i] == '?') z++;
ll x = qmi(2,z);
ll ans = 0;
if(n == 1){
if(z == 1) cout << 2 << endl;
else cout << 1 << endl;
return;
}
if(n == 2){
if(z == 2) cout << 4 << endl;
else if(z == 1){
if(s[1] == '1') cout << 2 << endl;
else cout << 2 << endl;
}else {
if(s == "01" or s == "10") cout << 2 << endl;
else cout << 0 << endl;
}
return;
}
if(s[n - 1] == s[0] and s[0] != '?') ans = ((x % mod) * ((n - 2) % mod)) % mod;
else if(s[n - 1] != s[0] and s[0] != '?' and s[n - 1] != '?') ans = ((x % mod) * 2) % mod;
else {
x = qmi(2 ,z - 1);
x %= mod;
ans = (x * n) % mod;
}
ans %= mod;
print(ans);
printf("\n");
}
signed main(){
// IOS
int O_O = 1;
cin >> O_O;
while(O_O--) solve();
}
贪心,但是赛时一直没找对方向,导致没过,其实对与两个字符串,把能匹配的找出来,剩下的就是不匹配的了
#include
using namespace std;
#define int long long
#define ll __int128
#define PII pair
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
int ls(int p){ return (p << 1) ;}
int rs(int p){ return (p << 1 | 1) ;}
inline int lowbit(int x) { return x & (-x) ;}
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 1e9 + 7;
const int N = 2e5 + 6;
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};
void solve(){
int n, m;
cin >> n >> m;
string a, b;
cin >> a >> b;
if(n < m){
swap(n,m);
swap(a,b);
}
map mp;
for(auto x : a) mp[x]++;
int sum1 = 0 ,sum2 = 0;
for(auto x : b){
if(mp[x]) mp[x]--;
else sum1++;
}
for(auto x : mp)if(x.second & 1) sum2++;
if(sum2 > sum1) {
sum2 -= sum1;
sum2 /= 2;
sum2 += sum1;
cout << sum2 << endl;
}
else cout << sum1 << endl;
}
signed main(){
IOS
int O_O = 1;
cin >> O_O;
while(O_O--) solve();
}
这一场家里有点事耽误了,赛后看了看感觉思维题居多,而我对于思维题感觉还是不太会写,要多做点CF锻炼下思维才行了
#include
using namespace std;
#define int long long
#define PII pair
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
int ls(int p){ return (p << 1) ;}
int rs(int p){ return (p << 1 | 1) ;}
inline int lowbit(int x) { return x & (-x) ;}
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 1e9 + 7;
const int N = 2e5 + 6;
void solve(){
int x;
char c;
cin >> x >> c;
if(c == '+'){
cout << 1 << " " << x-1 << endl;
return;
}if(c == '-'){
cout << x+1 << " " << 1 << endl;
return;
}if(c == '*'){
cout << x << " " << 1 << endl;
return;
}
}
signed main(){
IOS
int O_O = 1;
// cin >> O_O;
while(O_O--) solve();
}
模拟
#include
using namespace std;
#define int long long
#define ll __int128
#define PII pair
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
int ls(int p){ return (p << 1) ;}
int rs(int p){ return (p << 1 | 1) ;}
inline int lowbit(int x) { return x & (-x) ;}
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 1e9 + 7;
const int N = 2e5 + 6;
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};
void solve(){
int n;
cin >> n;
string s;
cin >> s;
int t = 0 ,res = 0 ,ans = 0 ,cnt = 0;
vector num;
for(int i = 0 ; i < n ; i++){
if(t > 0){
t--;
res += num[cnt];
cnt++;
}
if(s[i] == '0') res += 10;
else if(s[i] == '1') res = max(res - 5 ,0ll);
else{
t++;
num.push_back(min(10ll ,res));
res -= min(10ll ,res);
}
ans += res;
}
cout << ans << endl;
}
signed main(){
IOS
int O_O = 1;
// cin >> O_O;
while(O_O--) solve();
}
插空,但是要注意的就是最多只能分k+1段
#include
using namespace std;
#define int long long
#define ll __int128
#define PII pair
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
int ls(int p){ return (p << 1) ;}
int rs(int p){ return (p << 1 | 1) ;}
inline int lowbit(int x) { return x & (-x) ;}
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 1e9 + 7;
const int N = 2e5 + 6;
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};
void solve(){
int n ,t ,k;
cin >> n >> t >> k;
n -= k;
cout << min(n / t ,k+1) << endl;
}
signed main(){
IOS
int O_O = 1;
cin >> O_O;
while(O_O--) solve();
}
思维题,n变到m只要n和m不是零都能实现
#include
using namespace std;
#define int long long
#define ll __int128
#define PII pair
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
int ls(int p){ return (p << 1) ;}
int rs(int p){ return (p << 1 | 1) ;}
inline int lowbit(int x) { return x & (-x) ;}
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 1e9 + 7;
const int N = 2e5 + 6;
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};
void solve(){
int n ,m;
cin >> n >> m;
if(n == m){
cout << "Yes" << endl;
return;
}
if(n == 0 or m == 0){
cout << "No" << endl;
return;
}
cout << "Yes" << endl;
}
signed main(){
IOS
int O_O = 1;
cin >> O_O;
while(O_O--) solve();
}
分类讨论,如果空着的地方为5 ,7 ,9,此时是必胜的,而对于其他情况就要判断连着的两个是否是空着的,是就必胜,没有满足条件的就是不能必胜。
#include
using namespace std;
#define int long long
#define ll __int128
#define PII pair
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
int ls(int p){ return (p << 1) ;}
int rs(int p){ return (p << 1 | 1) ;}
inline int lowbit(int x) { return x & (-x) ;}
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 1e9 + 7;
const int N = 2e5 + 6;
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};
char mp[3][3];
void solve(){
int a[3] = {0},b[3] = {0};
int l = 0 ,r = 0;
for(int i = 0 ; i < 3 ; i++){
for(int j = 0 ; j < 3 ; j++){
cin >> mp[i][j];
}
}
int cnt = 0;
for(int i = 0 ; i < 3 ; i++){
for(int j = 0 ; j < 3 ; j++){
if(mp[i][j] == 'G') cnt++;
if(mp[i][j] == 'O'){
a[i] = 1 ,b[j] = 1;
if(i == j) l = 1;
if(i + j == 2) r = 1;
}
}
}
if(cnt == 9 or cnt == 7 or cnt == 5){
cout << "Yes" << endl;
return;
}
for(int i = 0 ; i < 3 ; i++){
for(int j = 0 ; j < 3 ; j++){
if(mp[i][j] == 'X'){
if(a[i] == 0 or b[j] == 0 or (i == j and l == 0) or ((i + j==2) and r == 0)){
cout << "Yes" << endl;
return;
}
}
}
}
cout << "No" << endl;
}
signed main(){
IOS
int O_O = 1;
cin >> O_O;
while(O_O--) solve();
}
构造题,又是思维方面的题,想要满足条件,要对3进行考虑,对于连续的六个数,设最小的为 x ,那么 x, x + 1, x + 3 与 x + 2, x + 4, x + 5 一定符合条件,因为 x + 3 与 x + 1 都是偶数,不互质,x 与 x + 1 互质, x + 3 与 x 相差 3 ,但它们都不是 3 的倍数,故互质。x + 2 与 x + 5 都是 3 的倍数,故不 互质,x + 4 与 x + 5 互质,x + 4 与 x + 2 是相邻的奇数,互质。故符合条件。
#include
using namespace std;
#define int long long
#define ll __int128
#define PII pair
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define Pi acos(-1.0)
#define ull unsigned long long
int ls(int p){ return (p << 1) ;}
int rs(int p){ return (p << 1 | 1) ;}
inline int lowbit(int x) { return x & (-x) ;}
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 1e9 + 7;
const int N = 2e5 + 6;
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};
void solve(){
int n;
cin >> n;
if(n < 4){
cout << 0 << endl;
}
else if(n < 6){
cout << 1 << endl;
cout << "2 3 4" << endl;
}
else if(n == 6){
cout << 2 << endl;
cout << "1 2 4" << endl;
cout << "3 5 6" << endl;
return;
}
else if(n == 9){
cout << "3" << endl;
cout << "1 3 9" << endl;
cout << "2 4 5" << endl;
cout << "6 7 8" << endl;
return;
}
else if(n/3 % 2){
cout << n/3 << endl;
cout << "1 3 9" << endl;
cout << "2 4 5" << endl;
cout << "6 7 8" << endl;
for(int i = 10 ; i <= n - 5 ; i += 6){
cout << i + 3 << ' ' << i + 5 << ' ' << i + 2 << endl;
cout << i + 4 << ' ' << i + 1 << ' ' << i << endl;
}
}
else{
cout << n / 3 << endl;
for(int i = 1 ; i <= n - 5 ; i += 6){
cout << i + 5 << ' ' << i + 4 << ' ' << i + 2 << endl;
cout << i + 3 << ' ' << i + 1 << ' ' << i << endl;
}
}
}
signed main(){
IOS
int O_O = 1;
cin >> O_O;
while(O_O--) solve();
}
本周是春节假期后的第一周训练,感觉还是没有从放假的状态里回过神来,牛客的训练营也缺了一场,补题貌似也有点少,后面还是要把状态调一调才行。
从这周的训练来看,对于许多没用过的老算法似乎有点不熟悉了,例如牛客第四场的B,一开始只想着找规律,把二进制枚举给忘了,后面想起来已经WA了四发,这四发罚时本来不应该吃的;其次,对于一些小细节的处理也不到位,取模忘记了精度问题也导致了不少的罚时;还有就是天梯赛的模拟题,这种模拟题一般题目很长,代码量也比较大,这就非常考验代码功夫了,像这周天梯训练里的大模拟,就是写拉了一点导致还有6分没拿到,最后总分没到175。
所以在后两周的训练里应该多写一些模拟题,练练码力,还有就是对于任何一个题都要仔细斟酌,考虑周全,减少罚时。