题目链接:https://codeforces.com/contest/1798
解题思路:小的放一边大的放一边
#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define lson l,mid,rt<<1
#define rson mid+1,r,(rt<<1)|1
typedef long long ll;
using ull = unsigned long long;
const int mx = 2e3 + 10;
const int mod = 1e9 + 7;
int a[mx], b[mx];
int main() {
int t;
scanf("%d", &t);
auto solve = [](int n) {
for (int i=1;i<=n;i++)
if (a[i] == '1')
return i;
return -1;
};
while (t--) {
int n;
scanf("%d", &n);
for (int i=1;i<=n;i++) {
scanf("%d", a+i);
}
for (int i=1;i<=n;i++) {
scanf("%d", b+i);
}
int m1 = 0, m2 = 0;
for (int i=1;i<=n;i++) {
if (a[i] > b[i])
swap(a[i], b[i]);
m1 = max(m1, a[i]);
m2 = max(m2, b[i]);
}
if (m1 == a[n] && m2 == b[n])
puts("yes");
else
puts("no");
}
return 0;
}
解题思路:模拟一下
#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define lson l,mid,rt<<1
#define rson mid+1,r,(rt<<1)|1
typedef long long ll;
using ull = unsigned long long;
const int mx = 5e4 + 10;
const int mod = 1e9 + 7;
vector <int> vec[mx];
map <int,int> mp;
int main() {
int t;
scanf("%d", &t);
auto solve = [](vector <int> &ans, int m) {
for (int i=1;i<=m;i++) {
for (int v: vec[i]) {
mp[v]--;
if (ans.size() != i && mp[v] == 0)
ans.push_back(v);
}
if (ans.size() != i)
return 0;
}
return 1;
};
while (t--) {
mp.clear();
int m, n;
scanf("%d", &m);
for (int i=1;i<=m;i++) {
vec[i].clear();
scanf("%d", &n);
for (int j=1;j<=n;j++) {
int v;
scanf("%d", &v);
vec[i].push_back(v);
mp[v]++;
}
}
vector <int> ans;
if (solve(ans, m)) {
for (int v: ans)
printf("%d ", v);
puts("");
} else
puts("-1");
}
return 0;
}
解题思路:算一下除数和被除数的gcd是否能整除不能就++。
#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define lson l,mid,rt<<1
#define rson mid+1,r,(rt<<1)|1
typedef long long ll;
using ull = unsigned long long;
const int mx = 2e5 + 10;
const int mod = 1e9 + 7;
ll a[mx], b[mx];
int n;
int main() {
int t;
scanf("%d", &t);
auto solve = [](vector <int> &ans, int m) {
};
while (t--) {
scanf("%d", &n);
ll now_gcd, val;
int ans = 1;
for (int i=1;i<=n;i++) {
scanf("%d%d", a+i, b+i);
if (i == 1) now_gcd = a[i] * b[i], val = b[i];
else {
now_gcd = __gcd(now_gcd, a[i] * b[i]);
val = val * b[i] / __gcd(val, b[i]);
if (now_gcd % val != 0) {
ans++;
now_gcd = a[i] * b[i];
val = b[i];
}
}
}
printf("%d\n", ans);
}
return 0;
}
解题思路:贪心一下,让前缀和交替负数和正数,那么任意的区间就不会超过最大值减去最小值。
#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define lson l,mid,rt<<1
#define rson mid+1,r,(rt<<1)|1
typedef long long ll;
using ull = unsigned long long;
const int mx = 3e5 + 10;
const int mod = 1e9 + 7;
ll a[mx], b[mx];
int n;
vector <int> v1, v2;
int main() {
int t;
scanf("%d", &t);
auto solve = [](vector <int> &ans, int m) {
};
while (t--) {
scanf("%d", &n);
v1.clear();
v2.clear();
for (int i=1;i<=n;i++) {
int v;
scanf("%d", &v);
if (v < 0)
v1.push_back(v);
else if (v > 0)
v2.push_back(v);
}
if (v1.size() == 0) {
puts("no");
continue;
}
puts("yes");
sort(v1.begin(), v1.end());
sort(v2.begin(), v2.end(), greater<int>());
int id1 = 0, id2 = 0;
for (int i=0; i<n-v1.size()-v2.size(); i++)
printf("0 ");
ll sum = 0;
while (id1 < v1.size() && id2 < v2.size()) {
if (sum <= 0) {
printf("%d ", v2[id2]);
sum += v2[id2++];
} else {
printf("%d ", v1[id1]);
sum += v1[id1++];
}
}
while (id1 < v1.size())
printf("%d ", v1[id1++]);
while (id2 < v2.size())
printf("%d ", v2[id2++]);
puts("");
}
return 0;
}
解题思路:容易知道最多操作次数不超过2,也就是改掉,i,和a[i+1]的值就行了。0的情况也很好判断,令vis[i]为i~n的连续次数,那么a[i] == vis[i+1]答案就为0。1的情况就有几种了,一种是该i的值,当vis[i+1]连续,一种是该a[i+1]的值,令a[i] <= ma[i+1],这里令ma[i]令i~n连续的最大值。还有一种情况是改变i + a[i] + 1的值,因为vis[i+1]不连续,那么如果i+1+a[i+1]<=n,那么vis[i+1+a[i+1]+1]肯定也是不连续的,因此还可以不改变i+1的值,该i + a[i] +1的值。
#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define lson l,mid,rt<<1
#define rson mid+1,r,(rt<<1)|1
typedef long long ll;
using ull = unsigned long long;
const int mx = 3e5 + 10;
const int mod = 1e9 + 7;
int a[mx], ans[mx];
int vis[mx], ma[mx];
int n;
int main() {
int t;
scanf("%d", &t);
auto solve = [](vector <int> &ans, int m) {
};
while (t--) {
scanf("%d", &n);
for (int i=1;i<=n;i++) {
scanf("%d", a + i);
}
ma[n+1] = vis[n+1] = 0;
for (int i=n; i; i--) {
if (i + a[i] > n || vis[i + a[i] + 1] == -1) {
vis[i] = -1;
}
else {
vis[i] = vis[i + a[i] + 1] + 1;
}
ma[i] = max(vis[i], ma[i+1]);
}
for (int i=n;i;i--) {
if (vis[i] == -1) {
ma[i] = ma[i] + 1;
if (i + a[i] <= n)
ma[i] = max(ma[i], ma[i + a[i] + 1] + 1);
}
}
for (int i=1;i<n;i++) {
if (a[i] == vis[i+1]) {
printf("0 ");
} else if (vis[i+1] == -1) {
if (a[i] <= ma[i+1])
printf("1 ");
else
printf("2 ");
} else {
printf("1 ");
}
}
puts("");
}
return 0;
}