标签:签到 i++ http pre inf creat fir vector ram
签到。
Code
/*
* Author: heyuhhh
* Created Time: 2020/2/2 22:06:33
*/
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cmath>
#include <set>
#include <map>
#include <queue>
#include <iomanip>
#define MP make_pair
#define fi first
#define se second
#define sz(x) (int)(x).size()
#define all(x) (x).begin(), (x).end()
#define INF 0x3f3f3f3f
#define Local
#ifdef Local
#define dbg(args...) do { cout << #args << " -> "; err(args); } while (0)
void err() { std::cout << '\n'; }
template<typename T, typename...Args>
void err(T a, Args...args) { std::cout << a << ' '; err(args...); }
#else
#define dbg(...)
#endif
void pt() {std::cout << '\n'; }
template<typename T, typename...Args>
void pt(T a, Args...args) {std::cout << a << ' '; pt(args...); }
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
//head
const int N = 3000 + 5;
int n;
char s[N];
void run(){
cin >> n;
cin >> (s + 1);
int odd = 0, even = 0, f = 1;
vector <char> ans;
for(int i = 1; i <= n; i++) {
if((s[i] - '0') & 1) ++odd;
else ++even;
ans.push_back(s[i]);
if(odd == 2) {
f = 0;
break;
}
}
if(f) cout << -1 << '\n';
else {
for(auto it : ans) cout << it;
cout << '\n';
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cout << fixed << setprecision(20);
int T; cin >> T;
while(T--) run();
return 0;
}
分几种情况贪心一下即可。
Code
/*
* Author: heyuhhh
* Created Time: 2020/2/2 22:14:58
*/
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cmath>
#include <set>
#include <map>
#include <queue>
#include <iomanip>
#define MP make_pair
#define fi first
#define se second
#define sz(x) (int)(x).size()
#define all(x) (x).begin(), (x).end()
#define INF 0x3f3f3f3f
#define Local
#ifdef Local
#define dbg(args...) do { cout << #args << " -> "; err(args); } while (0)
void err() { std::cout << '\n'; }
template<typename T, typename...Args>
void err(T a, Args...args) { std::cout << a << ' '; err(args...); }
#else
#define dbg(...)
#endif
void pt() {std::cout << '\n'; }
template<typename T, typename...Args>
void pt(T a, Args...args) {std::cout << a << ' '; pt(args...); }
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
//head
const int N = 3e5 + 5;
int n;
int a[N];
void run(){
cin >> n;
for(int i = 1; i <= n; i++) cin >> a[i];
int f = 1;
for(int i = 1; i <= n; i++) {
if(f == 1) {
if(a[i] < i - 1) {
if(a[i - 1] <= n - i) f = -1;
else f = 0;
}
}
if(f == 0) {
if(a[i] < n - i) f = -1;
}
}
if(f >= 0) {
cout << "YES" << '\n';
} else {
for(int i = 1; i <= n; i++) {
if(a[i] < n - i) {
cout << "NO" << '\n';
return;
}
}
cout << "YES" << '\n';
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cout << fixed << setprecision(20);
int T; cin >> T;
while(T--) run();
return 0;
}
题意:
给出\(n\)个数,现在有\(n\)个人依次轮流来取走一个数,每次只能取最左边一个或最右边一个。
现在你是第\(m\)个来取的人。
除你以外的\(n-1\)个人每次取都是任意从两端取一个,但是现在你可以指定\(k\)个人从哪端取。
问所有的情况中,你能取到的最大值最小是多少。
思路:
直接枚举即可。
枚举指定\(x\)个人选左端点,那么就有\(k-x\)个人选右端点。
再枚举其余人随机选的所有情况,每种情况维护答案即可。
可以用线段树优化到\(O(nlogn)\)。
代码如下:
Code
/*
* Author: heyuhhh
* Created Time: 2020/2/3 0:18:18
*/
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cmath>
#include <set>
#include <map>
#include <queue>
#include <iomanip>
#define MP make_pair
#define fi first
#define se second
#define sz(x) (int)(x).size()
#define all(x) (x).begin(), (x).end()
#define INF 0x3f3f3f3f
#define Local
#ifdef Local
#define dbg(args...) do { cout << #args << " -> "; err(args); } while (0)
void err() { std::cout << '\n'; }
template<typename T, typename...Args>
void err(T a, Args...args) { std::cout << a << ' '; err(args...); }
#else
#define dbg(...)
#endif
void pt() {std::cout << '\n'; }
template<typename T, typename...Args>
void pt(T a, Args...args) {std::cout << a << ' '; pt(args...); }
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
//head
const int N = 3500 + 5;
int n, m, k;
int a[N];
void run(){
cin >> n >> m >> k;
for(int i = 1; i <= n; i++) cin >> a[i];
int ans = 0;
if(k >= m) k = m - 1;
int d = m - k - 1;
for(int j = 0; j <= k; j++) {
int res = INF;
for(int l = 1; l <= n; l++) {
int r = l + n - d - 1;
if(r > n) break;
int L = l + j, R = r - (k - j);
res = min(res, max(a[L], a[R]));
}
ans = max(ans, res);
}
cout << ans << '\n';
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cout << fixed << setprecision(20);
int T; cin >> T;
while(T--) run();
return 0;
}
题意:
如果两个串所有字符出现的次数相同,那么定义这两个串是相似的。
如果两个串是相似的,且满足:\(\exist k\geq 2\),两个串被划分为\(s_1,t_1,s_2,t_2,\cdots,s_k,t_k\),满足:
那么称这两个串非常相似。
现在给出一个串\(s\),然后给出多个询问,每个询问一个区间\([l,r]\),回答是否存在串和子串\(s_ls_{l+1}\cdots s_r\)不非常相似。
思路:
显然,我们要找的这个串首先满足和子串是相似的。
如果这两个串不是非常相似,那么就说明对于所有的划分,都不满足上面第二个条件。
接下来考虑构造:
注意\(l=r\)时的判断。
代码如下:
Code
/*
* Author: heyuhhh
* Created Time: 2020/2/3 11:14:11
*/
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cmath>
#include <set>
#include <map>
#include <queue>
#include <iomanip>
#define MP make_pair
#define fi first
#define se second
#define sz(x) (int)(x).size()
#define all(x) (x).begin(), (x).end()
#define INF 0x3f3f3f3f
#define Local
#ifdef Local
#define dbg(args...) do { cout << #args << " -> "; err(args); } while (0)
void err() { std::cout << '\n'; }
template<typename T, typename...Args>
void err(T a, Args...args) { std::cout << a << ' '; err(args...); }
#else
#define dbg(...)
#endif
void pt() {std::cout << '\n'; }
template<typename T, typename...Args>
void pt(T a, Args...args) {std::cout << a << ' '; pt(args...); }
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
//head
const int N = 2e5 + 5;
char s[N];
int pre[N][26];
void run(){
int n, q;
cin >> (s + 1);
n = strlen(s + 1);
for(int i = 1; i <= n; i++) {
for(int j = 0; j < 26; j++) {
pre[i][j] = pre[i - 1][j];
}
++pre[i][s[i] - 'a'];
}
cin >> q;
while(q--) {
int l, r; cin >> l >> r;
if(l == r || s[l] != s[r]) {
cout << "YES" << '\n';
continue;
}
vector <int> cnt(26, 0);
int t = 0;
for(int i = 0; i < 26; i++) {
cnt[i] = pre[r][i] - pre[l - 1][i];
if(cnt[i]) ++t;
}
if(t > 2) cout << "YES" << '\n';
else cout << "NO" << '\n';
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cout << fixed << setprecision(20);
run();
return 0;
}
Codeforces Round #616 (Div. 2)
标签:签到 i++ http pre inf creat fir vector ram
原文地址:https://www.cnblogs.com/heyuhhh/p/12256429.html