题目地址:Dashboard - Codeforces Round #843 (Div. 2) - Codeforces
一个不知名大学生,江湖人称菜狗
original author: jacky Li
Email : [email protected]Time of completion:2023.1.11
Last edited: 2023.1.11
目录
A1. Gardener and the Capybaras (easy version)
A2. Gardener and the Capybaras (hard version)
A1. Gardener and the Capybaras (easy version)
思路
简单版本的仅需要灵活运用字符串进行暴力搜索就行,因为每一个字符串最大仅有100个
PS:当然运用A2肯定也是可以过掉的。
参考代码
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <stack>
#include <map>
#include <cmath>
#include <cstring>
#include <unordered_map>
#include <unordered_set>
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#define IOS std::ios::sync_with_stdio(false)
#define inf 0x3f3f3f3f
#define YES cout << "YES" << endl
#define NO cout << "NO" << endl
#define int long long
#define x first
#define y second
//#define cmp [&](PII a, PII b){ return a.y < b.y; }
const int N = 5e5+10, mod = 1e9+7, M = 5e7+5, K = 2e5+10, Z = 1e5+7, X = 1.5 * 1e9;
using namespace std;
typedef long long LL;
typedef priority_queue<int> PQI;
typedef priority_queue <int, vector<int>, greater<>> PQGI;
typedef pair<int, int> PII;
void solve()
{
string ch; cin >> ch;
int n = ch.size();
// cout << "n : " << n << endl;
// cout << "substr(2, 1)" << str.substr(2, 1) << endl;
ch = ' ' + ch;
for(int i = 1; i < n; i ++)
for(int j = i + 1; j < n; j ++ )
{
string a = ch.substr(1, i), b = ch.substr(i + 1, j - i), c = ch.substr(j + 1, n - j);
if((a <= b && c <= b) || (a >= b && c >= b))
{
cout << a << ' ' << b << ' ' << c << endl;
return;
}
}
}
signed main()
{
IOS; int T = 1;
cin.tie(nullptr);
cout.tie(nullptr);
cin >> T;
while( T -- ) solve();
return 0;
}
A2. Gardener and the Capybaras (hard version)
思路
用A1 的方法也可以写但是由于困难版本的数据最大到达了2e5的一个程度,所以用A1的方法难免会tle
因此我们思考发现仅有两种情况
①xxxxx bxxxxx x
②xxxx a xxxxx
参考代码
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <cmath>
#include <cstring>
#include <unordered_map>
#include <unordered_set>
#define IOS std::ios::sync_with_stdio(false)
#define inf 0x3f3f3f3f
#define YES cout << "YES" << endl
#define yes cout << "yes" << endl
#define no cout << "no" << endl
#define NO cout << "NO" << endl
#define int long long
//#define x first
#define y second
//#define cmp [&](PII a, PII b){ return a.y < b.y; }
const int N = 5e5+10, mod = 1e9+7, M = 1e6+5, K = 1e5+10, Z = 2e5+7;
using namespace std;
typedef long long LL;
typedef priority_queue<int> PQI;
typedef priority_queue <int, vector<int>, greater<>> PQGI;
typedef pair<int, int> PII;
int n, m, t = 0, cnt;
char ch[5002], str[5002], a[5002];
bool flag = false;
void solve()
{
string ch; cin >> ch;
int t = ch.size();
ch = ' ' + ch;
string b;
for(int i = 2; i < t; i ++)
if(ch[i] == 'a')
{
b = ch[i];
cout << ch.substr(1, i - 1) << ' ' << b << ' ' << ch.substr(i + 1, t - i) << endl;
return;
}
for(int i = 2; i < t; i ++)
{
if(ch[i] == 'b')
{
cout << ch.substr(1, i - 1) << ' ' << ch.substr(i, t - i) << ' ' << ch[t] << endl;
return;
}
}
}
signed main()
{
IOS; int T = 1;
cin >> T;
while( T -- ) solve();
return 0;
}
B. Gardener and the Array
思路
存入一个map<int, int> 的一个东西,通过输出判断是否为0,博主 笨看代码吧
参考代码
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <stack>
#include <map>
#include <cmath>
#include <cstring>
#include <unordered_map>
#include <unordered_set>
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#define IOS std::ios::sync_with_stdio(false)
#define inf 0x3f3f3f3f
#define YES cout << "YES" << endl
#define NO cout << "NO" << endl
#define int long long
#define x first
#define y second
#define cmp [&](PII a, PII b){ return a.y < b.y; }
const int N = 5e5+10, mod = 1e9+7, M = 5e7+5, K = 2e5+10, Z = 1e5+7, X = 1.5 * 1e9;
using namespace std;
typedef long long LL;
typedef priority_queue<int> PQI;
typedef priority_queue <int, vector<int>, greater<>> PQGI;
typedef pair<int, int> PII;
vector<int> s[N];
void solve()
{
int n; cin >> n;
map<int, int> jym;
for(int i = 1; i <= n; i ++ ) s[i].clear();
for(int i = 1; i <= n; i ++ )
{
int a; cin >> a;
for(int j = 1; j <= a; j ++)
{
int x; cin >> x;
s[i].push_back(x);
jym[x] = jym[x] + 1;
}
}
for(int i = 1; i <= n; i ++)
{
bool lcq = true;
for(auto x : s[i])
if(jym[x] == true) {lcq = 0; break;}
if(lcq)
{
YES; return;
}
}
NO;
}
signed main()
{
IOS; int T = 1;
cin.tie(nullptr);
cout.tie(nullptr);
cin >> T;
while( T -- ) solve();
return 0;
}
C. Interesting Sequence
思路
首先如果模式串中有某一位2进制为0需要得到1,一定不可能
其次 n某一位为1,x某一位为0,把n变为x,n-m肯定有一位这位为0的,找到最小的这一位为0的,和其他的取max
参考代码
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <cmath>
#include <cstring>
#include <unordered_map>
#include <unordered_set>
#define IOS std::ios::sync_with_stdio(false)
#define inf 9e18
#define YES cout << "YES" << endl
#define yes cout << "yes" << endl
#define no cout << "no" << endl
#define NO cout << "NO" << endl
#define int long long
#define x first
#define y second
//#define cmp [&](PII a, PII b){ return a.y < b.y; }
const int N = 5e5+10, mod = 1e9+7, M = 1e6+5, K = 1e5+10, Z = 2e5+7, X = 9e18+2;
using namespace std;
typedef long long LL;
typedef priority_queue<int> PQI;
typedef priority_queue <int, vector<int>, greater<>> PQGI;
typedef pair<int, int> PII;
//bool check(int n, int x)
//{
// for(int i = 0; i < 60; i ++ )
// {
// int cnt_1 = (n >> i) & 1, cnt_2 = (x >> i) & 1;
// if(cnt_1 == 0 && cnt_2 == 1)
// return false;
// }
// return true;
//}
void solve()
{
int n, x; cin >> n >> x;
for(int i = 0; i < 60; i ++ )
{
int cnt_1 = (n >> i) & 1, cnt_2 = (x >> i) & 1;
if(cnt_1 == 0 && cnt_2 == 1)
{
cout << -1 << endl;
return;
}
}
// if(check(n, x) == false) cout << -1 << endl;
// else
// {
int jym_x = n, jym_n = X, ans1 = 0, ans2 = n;
for(int i = 60; i >= 0; i -- )
{
int cnt_1 = n >> i & 1, cnt_2 = x >> i & 1;
if(cnt_1 == 1 && cnt_2 == 0) jym_x = max(jym_x, ans1 + (1LL << i) * 2);
else if(cnt_1 == 1 && cnt_2 == 1) jym_n = min(jym_n, ans1 + (1LL << i) * 2);
if(n >> i & 1) ans1 += 1LL << i, ans2 -= 1LL << i;
}
if(jym_x >= jym_n) cout << -1 << endl;
else cout << jym_x << endl;
// }
}
signed main()
{
IOS; int T = 1;
cin.tie(nullptr);
cout.tie(nullptr);
cin >> T;
while( T -- ) solve();
return 0;
}
D. Friendly Spiders
思路
运用迪杰斯特拉算法,当最后还超过某一个巨大的数的时候则是-1
参考代码
// 参考的友友的
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <stack>
#include <map>
#include <cmath>
#include <cstring>
#include <unordered_map>
#include <unordered_set>
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#define IOS std::ios::sync_with_stdio(false)
#define inf 0x3f3f3f3f
#define YES cout << "YES" << endl
#define NO cout << "NO" << endl
#define int long long
#define x first
#define y second
#define cmp [&](PII a, PII b){return a.y < b.y;}
const int N = 5e5+10, mod = 1e9+7, M = 5e7+5, K = 2e5+10, Z = 1e5+7, X = 1.5 * 1e9;
using namespace std;
typedef long long LL;
typedef priority_queue<int> PQI;
typedef priority_queue <int, vector<int>, greater<>> PQGI;
typedef pair<int, int> PII;
int n, m, k;
int s, t;
vector<int> g[N], v[N], c;
int a[N], b[N];
int d[N], pre[N];
bool st[N];
void dijkstra()
{
for(int i = 1; i <= n; i ++ ) d[i] = 1e9;
deque<PII> q;
d[s] = 1;
q.push_front({1, s});
while(q.size())
{
PII t = q.front();
q.pop_front();
if(st[t.y]) continue;
st[t.y] = 1;
for(auto x : v[t.y])
{
int f = t.y <= k;
if(d[x] > t.x + f)
{
d[x] = t.x + f;
if(f) q.push_front({d[x], x});
else q.push_back({d[x], x});
pre[x] = t.y;
}
}
}
}
void print(int x)
{
if(x <= k) c.push_back(x);
if(x == s) return;
print(pre[x]);
}
void solve()
{
cin >> n;
k = n;
set<int> S;
for(int i = 1; i <= n; i ++ )
{
cin >> a[i];
int x = a[i];
for(int j = 2; j * j <= x; j ++ )
{
if(x % j == 0) g[i].push_back(j), S.insert(j);
while(x % j == 0) x /= j;
}
if(x > 1) g[i].push_back(x), S.insert(x);
}
cin >> s >> t;
for(auto x : S) b[x] = ++ n;
for(int i = 1; i <= n; i ++ )
{
for(auto x : g[i])
{
v[i].push_back(b[x]);
v[b[x]].push_back(i);
}
}
dijkstra();
if(d[t] >= 1e9 / 2) cout << -1 << endl;
else
{
cout << d[t] << endl;
print(t);
reverse(c.begin(), c.end());
for(auto x : c) cout << x << ' ';
}
}
signed main()
{
IOS; int T = 1;
cin.tie(nullptr);
cout.tie(nullptr);
cin >> T;
while( T -- ) solve();
return 0;
}
作者有言
如果感觉博主讲的对您有用,请点个关注支持一下吧,将会对此类问题持续更新……