csust-8.13早训CF之1000-1700分

目录

 

A - An abandoned sentiment from past

B - An express train to reveries

C - An impassioned circulation of affection

D - Karen and Morning

E - Karen and Coffee

F - Karen and Game


A - An abandoned sentiment from past

 CodeForces - 814A 

题目链接https://codeforces.com/problemset/problem/814/A

#include <bits/stdc++.h>
using namespace std;
int a[120], b[120];
int main()
{
	int n, m;
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= n; i++)
		scanf("%d", &a[i]);
	for (int i = 1; i <= m; i++)
		scanf("%d", &b[i]);
	int p = -1, nb = m;
	sort(b + 1, b + 1 + m);
	for (int i = 1; i <= n; i++) {
		if (a[i] < p && a[i] != 0) {
			printf("Yes\n"); return 0;
		}
		if (a[i] == 0) {
			int mark = 0;
			for (int j = 1; j <= m; j++) {
				if (b[j] < a[i - 1]) {
					mark = 1;
					printf("Yes\n"); return 0;
				}
			}
			if (!mark) a[i] = b[nb--];
		}
		p = a[i];
	}
	for (int i = 2; i <= n; i++) {
		if (a[i] < a[i - 1]) {
			printf("Yes\n"); return 0;
		}
	}
	printf("No\n");
	return 0;
}

B - An express train to reveries

 CodeForces - 814B 

题目链接https://codeforces.com/problemset/problem/814/B

#include <bits/stdc++.h>
using namespace std;
const int mac = 1e3 + 10;
int a[mac], b[mac], vis[mac], c[mac];
int main()
{
	int n;
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) {
		scanf("%d", &a[i]);
		vis[a[i]]++;
	}
	for (int i = 1; i <= n; i++) {
		scanf("%d", &b[i]);
	}
	for (int i = 1; i <= n; i++) {
		if (a[i] == b[i]) c[i] = a[i];
		else {
			if (vis[a[i]] > 1) {
				if (!vis[b[i]]) c[i]=b[i],vis[a[i]]--;
				else c[i] = a[i];			
			}
			else c[i] = a[i];
		}
	}
	memset(vis, 0, sizeof vis);
	for (int i = 1; i <= n; i++) vis[c[i]]++;
	for (int i = 1; i <= n; i++) {
		if (vis[c[i]] > 1) {
			if (a[i] != b[i]) {
				for (int j = 1; j <= n; j++)
					if (!vis[j]) { c[i] = j; break; }
			}
		}
	}	
	for (int i = 1; i < n; i++)
		printf("%d ", c[i]);
	printf("%d\n", c[n]);
	return 0;
}

C - An impassioned circulation of affection

 CodeForces - 814C 

题目链接https://codeforces.com/problemset/problem/814/C

法一:

#include <bits/stdc++.h>
using namespace std;
const int mac = 2e3 + 10;
char s[mac];
int dp[30][mac];
int serch(char x);
int n, q, m;
int main()
{
	scanf("%d", &n);
	scanf("%s", s);
	scanf("%d", &q);
	char st[5];
	for (int i = 1; i <= q; i++) {
		scanf("%d%s", &m, st);
		printf("%d\n", serch(st[0]));
	}
	return 0;
}
int serch(char x)
{
	int l = 0, r = 0, sum = 0, ans = 0, same = 0;
	while (l < n && r < n) {
		while ((s[r] == x || sum < m) && r < n) {
			if (s[r] != x) sum++;
			r++;
		}
		ans = max(ans, r - l);
		while (s[l] == x && l < n) {
			l++;
		}
		l++;
		sum--;
	}
	return ans;
}

法二:

#include <bits/stdc++.h>
using namespace std;
const int mac = 2e3 + 10;
char s[mac];
int dp[30][mac], sum[30][mac];
int n, q, m;
int main()
{
	int n, q, x;
	scanf("%d", &n);
	scanf("%s", s+1);
	scanf("%d", &q);
	char st[5];
	for (int i = 0; i < 26; i++) {
		for (int j = 1; j <= n; j++) {
			if (s[j] != 'a' + i) sum[i][j] = sum[i][j - 1] + 1;
			else sum[i][j] = sum[i][j - 1];
		}
	}
	for (int i = 0; i < 26; i++) {
		for (int j = 1; j <= n; j++) {
			for (int l = 1; l <= n; l++) {
				int r = upper_bound(sum[i] + l, sum[i] + n + 1, sum[i][l-1] + j) - sum[i] - 1;
				dp[i][j] = max(dp[i][j], r - l + 1);
			}
		}
	}
	for (int i = 1; i <= q; i++) {
		scanf("%d%s", &x, st);
		printf("%d\n", dp[st[0] - 'a'][x]);
	}
	return 0;
}

D - Karen and Morning

 CodeForces - 816A 

题目链接https://codeforces.com/problemset/problem/816/A

#include <bits/stdc++.h>
using namespace std;
const int mac = 1e3 + 10;
int a[mac], b[mac], vis[mac], c[mac];
char s[10];
int check(int x);
int main()
{
	scanf("%s", s);
	for (int i = 0; i <= 24 * 60; i++) {
		if (check(i)) {
			printf("%d\n", i); return 0;
		}
	}
	return 0;
}
int check(int x)
{
	int mi = (s[3] - '0') * 10 + s[4] - '0';
	mi += x;
	int hou = (s[0] - '0') * 10 + s[1] - '0';
	while (mi >= 60) hou++, mi -= 60;
	while (hou>=24) hou-=24; 
	int arr[10];
	arr[1] = hou / 10; arr[2] = hou % 10;
	arr[3] = mi / 10; arr[4] = mi % 10;
	if (arr[1] == arr[4] && arr[3] == arr[2]) return 1;
	return 0;
}

E - Karen and Coffee

 CodeForces - 816B 

题目链接https://codeforces.com/problemset/problem/816/B

#include <bits/stdc++.h>
using namespace std;
const int mac = 2e5 + 10;
int tree[mac << 2];
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define lc rt<<1
#define rc rt<<1|1
int n, k, q;
int nb[mac << 2], f[mac << 2];
void update(int l, int r, int rt, int L, int R);
void update1(int l, int r, int rt);
int query(int l, int r, int rt, int L, int R);
int main()
{
	int l, r;
	scanf("%d%d%d", &n, &k, &q);
	for (int i = 1; i <= n; i++) {
		scanf("%d%d", &l, &r);
		update(1, mac, 1, l, r);
	}
	update1(1, mac, 1);
	for (int i = 1; i <= q; i++) {
		scanf("%d%d", &l, &r);
		int ans = query(1, mac, 1, l, r);
		printf("%d\n", ans);
	}
	return 0;
}
void update(int l, int r, int rt, int L, int R)
{
	if (l >= L && r <= R) {
		tree[rt]++; f[rt]++;
		return;
	}
	if (f[rt]) {
		tree[lc] += f[rt]; tree[rc] += f[rt];
		f[lc] += f[rt]; f[rc] += f[rt];
		f[rt] = 0;
	}
	int mid = (l + r) >> 1;
	if (mid >= L) update(lson, L, R);
	if (mid < R) update(rson, L, R);
}
int query(int l, int r, int rt, int L, int R)
{
	int ans = 0;
	if (l >= L && r <= R) {
		return nb[rt];
	}
	int mid = (l + r) >> 1;
	if (mid >= L) ans += query(lson, L, R);
	if (mid < R) ans += query(rson, L, R);
	return ans;
}
void update1(int l, int r, int rt)
{
	if (l == r) {
		if (tree[rt] >= k) nb[rt] = 1;
		else nb[rt] = 0;
		return;
	}
	if (f[rt]) {
		tree[lc] += f[rt]; tree[rc] += f[rt];
		f[lc] += f[rt]; f[rc] += f[rt];
		f[rt] = 0;
	}
	int mid = (l + r) >> 1;
	update1(lson);
	update1(rson);
	nb[rt] = nb[lc] + nb[rc];
}

F - Karen and Game

 CodeForces - 816C 

题目链接https://codeforces.com/problemset/problem/816/C

#include <bits/stdc++.h>
using namespace std;
const int mac = 1e3 + 10;
const int inf = 1e8 + 10;
int a[mac][mac], b[mac][mac];
int op1[mac], op2[mac], op[mac];
int n, m;
int find(int x);
int find1(int x);
int main()
{
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++)
			scanf("%d", &a[i][j]);
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++) b[i][j] = 0;
	int num = 0;
	if (n <= m) {
		for (int i = 1; i <= n; i++) {
			int x = find(i);
			if (x == 0) continue;
			for (int j = 1; j <= m; j++) b[i][j] = x;
			op1[++num] = 1; op2[num] = i, op[num] = x;
		}
		for (int i = 1; i <= m; i++) {
			if (a[1][i] != b[1][i]) {
				int x = a[1][i] - b[1][i];
				op1[++num] = 2; op2[num] = i, op[num] = x;
				for (int j = 1; j <= n; j++) b[j][i] += x;
			}
		}
	}
	else {
		for (int i = 1; i <= m; i++) {
			int x = find1(i);
			if (x == 0) continue;
			for (int j = 1; j <= n; j++) b[j][i] = x;
			op1[++num] = 2; op2[num] = i, op[num] = x;
		}
		for (int i = 1; i <= n; i++) {
			if (a[i][1] != b[i][1]) {
				int x = a[i][1] - b[i][1];
				op1[++num] = 1; op2[num] = i, op[num] = x;
				for (int j = 1; j <= m; j++) b[i][j] += x;
			}
		}
	}
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			if (a[i][j] != b[i][j]) {
				printf("-1\n"); return 0;
			}
		}
	}
	int ans = 0;
	for (int i = 1; i <= num; i++) ans += op[i];
	printf("%d\n", ans);
	for (int i = 1; i <= num; i++) {
		while (op[i]) {
			if (op1[i] == 1) printf("row %d\n", op2[i]);
			else printf("col %d\n", op2[i]);
			op[i]--;
		}
	}
	return 0;
}
int find(int x)
{
	int mi = inf;
	for (int i = 1; i <= m; i++) mi = min(mi, a[x][i]);
	return mi;
}
int find1(int x)
{
	int mi = inf;
	for (int i = 1; i <= n; i++) mi = min(mi, a[i][x]);
	return mi;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值