ARC089简要题解

本文作者分享了参与ACM竞赛的经历,详细解析了C、D两道题目。C题通过判断两点间距离与时间差的关系来确定是否可行。D题涉及二维前缀和处理区间覆盖问题,通过映射和调整确保正确计算。作者在轻松的氛围中完成了题目解析,并对E题表示出困惑,感叹解题思路的独特。
摘要由CSDN通过智能技术生成

智力被爆了
在这里插入图片描述
自闭2题人,T2还写了好一会儿。

C题:
这题我是不是在哪儿见过。
减一减判一判就完事。

#include<bits/stdc++.h>
using namespace std;
int n;
int nx, ny;
int x[100010], y[100010], t[100010];
int main() { 
	scanf("%d", &n);
	int ok = 1;
	for(int i=1;i<=n;++i) { 
		scanf("%d%d%d", &t[i], &x[i], &y[i]);
		int det = abs(nx - x[i]) + abs(ny - y[i]);
		if((t[i] - t[i-1]) < det) 
			ok = 0;
		if(((t[i] - t[i-1]) - det) % 2 == 1) 
			ok = 0;
		nx = x[i], ny = y[i];
	} 
	printf(ok ? "Yes" : "No");
	return 0;
} 

D题:
首先先把所有点都映射到 ( [ 1 , 2 × l e n ] , [ 1 , 2 × l e n ] ) ([1,2\times len],[1, 2\times len]) ([1,2×len],[1,2×len])的区间里面(第一发就是这么RE的)
然后,如果我们需要使得某个点为黑色,二维区间覆盖点不好做,转一步,变成“如果起点在某个区域内,则答案+1”,白色反之。
发现会有负数下标的情况,于是二维前缀和开到 4 × l e n 4\times len 4×len,做的时候判一下,如果越界了,就 + = 2 × l e n +=2\times len +=2×len,最后一个格子的值在四个格子里头找。
白色懒得算下标了,所以做了个整体加一,然后那一块减一。
边聊QQ边写,所以有点慢HHH

#include<bits/stdc++.h>
using namespace std;
int n, len;
int mp[4010][4010];
int x[100010], y[100010], ned[100010];
char s[123];
inline void add(int stx, int sty, int val) { 
	mp[stx][sty] += val;
	mp[stx][sty + len] -= val;
	mp[stx + len][sty] -= val;
	mp[stx + len][sty + len] += val;
} 

void shua() { 
	for(int i=1;i<=4000;++i) { 
		for(int j=1;j<=4000;++j) { 
			mp[i][j] += mp[i-1][j] + mp[i][j-1] - mp[i-1][j-1];
		} 
	} 
} 

void check(int &a) { 
	if(a <= 0) 
		a += len * 2;
	return;
} 

int main() { 
	scanf("%d%d", &n, &len);
	for(int i=1;i<=n;++i) { 
		scanf("%d%d%s", &x[i], &y[i], s+1);
		x[i] %= len*2, y[i] %= len*2;
		x[i]++, y[i]++;
		if(s[1] == 'B')
			ned[i] = 1;
		else
			ned[i] = 0;
	} 
	for(int i=1;i<=n;++i) { 
		int xx1 = x[i] - len + 1, yy1 = y[i] - len + 1;
		int xx2 = x[i] + 1, yy2 = y[i] + 1;
		check(xx1), check(xx2), check(yy1), check(yy2);
		if(ned[i] == 1) { 
			add(xx1, yy1, 1);
			add(xx2, yy2, 1);
		} 
		else { 
			add(1, 1, 1), add(1, len+1, 1), add(len+1, 1, 1), add(len+1, len+1, 1);
			add(xx1, yy1, -1);
			add(xx2, yy2, -1);
		} 
	} 
	shua();
	int ans = 0;
	for(int i=1;i<=len*2;++i) { 
		for(int j=1;j<=len*2;++j) { 
			int nval = mp[i][j] + mp[i+len*2][j] + mp[i][j+len*2] + mp[i+len*2][j+len*2];
			ans = max(ans, nval);
		} 
	} 
	cout<<ans;
	return 0;
} 

E题:
冥思苦想20min发觉不会。
看了题解之后:这人的脑子是怎么长的.jpg
他为什么能想到变成不等式.jpg
https://www.cnblogs.com/withhope/p/11740792.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值