C - 简单 --- C - Make it Simplehttps://atcoder.jp/contests/abc393/tasks/abc393_c?lang=en
归并排序+hash哈希 哈希计算有效对一一对应
方法一()
#define _CRT_SECURE_NO_WARNINGS
#include<bits/stdc++.h>
//定义
using namespace std;
int n, m, k, d[500002];
struct da {
int x, y;
}q[500005],t[500005];
//归并
void merge(da q[], da temp[], int low, int high) {
if (low >= high) return;
int mid = low + (high - low) / 2;
merge(q, temp, low, mid);
merge(q, temp, mid + 1, high);
int i = low, j = mid + 1, k = low;
while (i <= mid && j <= high) {
if (q[i].x < q[j].x)temp[k++] = q[i++];
else temp[k++] = q[j++];
}
while (i <= mid)temp[k++] = q[i++];
while (j <= high)temp[k++] = q[j++];
for (int i = low; i <= high; i++)q[i] = temp[i];
}
int main() {
//输入
scanf("%d %d", &n, &m);
int j = 1;
for (int i = 1; i <= m; i++) {
scanf("%d %d", &q[j].x, &q[j].y);
//我要求x[i]<y[i]
if (q[j].x > q[j].y) {
int temp = q[j].x;
q[j].x = q[j].y;
q[j].y = temp;
j++;
}
else if (q[j].x == q[j].y) {
k++;
if (i == m)j++;
}
else {
j++;
}
}
j--;
//排完序
merge(q, t, 1, j);
//hash哈希
for (int i = 1; i <= j; i++) {
if (d[q[i].y] != q[i].x) {
d[q[i].y] = q[i].x;
}
else {
k++;
}
}
printf("%d\n", k);
return 0;
}
方法一(简化版)
#define _CRT_SECURE_NO_WARNINGS
#include<bits/stdc++.h>
using namespace std;
int n, m, k, d[500002];
struct da {
int x, y;
}q[500005],t[500005];
//归并
void merge(da q[], da temp[], int low, int high) {
if (low >= high) return;
int mid = low + (high - low) / 2;
merge(q, temp, low, mid);
merge(q, temp, mid + 1, high);
int i = low, j = mid + 1, k = low;
while (i <= mid && j <= high) {
if (q[i].x < q[j].x)temp[k++] = q[i++];
else temp[k++] = q[j++];
}
while (i <= mid)temp[k++] = q[i++];
while (j <= high)temp[k++] = q[j++];
for (int i = low; i <= high; i++)q[i] = temp[i];
}
int main() {
scanf("%d %d", &n, &m);
for (int i = 1; i <= m; i++) {
scanf("%d %d", &q[i].x, &q[i].y);
//我要求x[i]<y[i]
if (q[i].x > q[i].y) {
int temp = q[i].x;
q[i].x = q[i].y;
q[i].y = temp;
}
else if (q[i].x == q[i].y) {
k++;
i--;
m--;
}
}
//排完序
merge(q, t, 1, m);
//哈希
for (int i = 1; i <= m; i++) {
if (d[q[i].y] != q[i].x) {
d[q[i].y] = q[i].x;
}
else {
k++;
}
}
printf("%d\n", k);
return 0;
}
方法二(这个归并是我哥们写的)
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int n, m, x, y,sum=0;
struct s {
int x;
int y;
}a[5000009],e[5000009];
int b[5000009];
void digui(int i, int j) {
if (i >= j) {
return;
}
int mid = i + (j - i) / 2;
digui(i, mid);
digui(mid + 1, j);
int r = i, l = mid + 1, h = i;
while (r <= mid && l <= j) {
if (a[r].x < a[l].x) {
e[h].x = a[r].x;
e[h].y = a[r].y;
h++;
r++;
}
else {
e[h].x = a[l].x;
e[h].y = a[l].y;
h++;
l++;
}
}
while (r <= mid) {
e[h].x = a[r].x;
e[h].y = a[r].y;
h++;
r++;
}
while (l <= j) {
e[h].x = a[l].x;
e[h].y = a[l].y;
h++;
l++;
}
h = i;
while (h <= j) {
a[h].x = e[h].x;
a[h].y = e[h].y;
h++;
}
}
int main() {
scanf("%d %d", &n, &m);
int j = 0;
for (int i = 0;i < m;i++) {
scanf("%d %d", &x, &y);
if (x == y) {
sum++;
}
else if (x > y) {
a[j].x = y;
a[j].y = x;
j++;
}
else {
a[j].x = x;
a[j].y = y;
j++;
}
}
digui(0, j - 1);
for (int i = 0;i < j;i++) {
if (b[a[i].y] != a[i].x) {
b[a[i].y] = a[i].x;
}
else {
sum++;
}
}
printf("%d\n", sum);
return 0;
}
codeforces.com/problemset/problem/2067/A
当时写题的时候以为这题很难,结果很简单,wokao, 可能是测试数据太假了,被吓到了
#include <iostream>
using namespace std;
int main() {
int t;
cin >> t; // 读取测试用例的数量
while (t--) {
int x, y;
cin >> x >> y; // 对于每个测试用例,读取两个整数x和y
int l = 0; // l用于标记是否满足条件,0表示不满足,1表示满足
// 检查y是否等于x加1
if (y == 1 + x) l = 1;
// 检查y是否小于x,并且x和y的差是9的倍数
else if ((1 + x - y) % 9 == 0 && x > y) l = 1;
// 如果l为1,则输出"yes",表示满足条件
if (l) cout << "yes" << endl;
// 如果l为0,则输出"no",表示不满足条件
else cout << "no" << endl;
}
return 0;
}
Задача - 2065B - Codeforces --- Задача - 2065B - Codeforces
#include<bits/stdc++.h>
using namespace std;
int main() {
int t; cin >> t;
while (t--) {
string s;
cin >> s;
int count = 0;
for (int i = s.size() - 1; i >= 1; i--) {
if (s[i] == s[i - 1]) {
count = i; break;
}
}
int l = s.size();
if (count != 0)cout << 1 << endl;
else {
cout << l << endl;
}
}
return 0;
}
看到这里的大佬好,我水一下