ICPC2021山东省赛总结

按时间线走…

首先是TG
在这里插入图片描述
很签到,看到数据范围就知道只能模拟除法。

然后我和栋哥开TD去了
在这里插入图片描述
题意就是薛定谔的箱子(bushi),一个箱子没开之前不知道里面的重力场方向,有可能是水平向左,也可能是竖直向下,这个箱子里面有一些小方块,求每次打开箱子后再两种重力作用下形成的轮廓的周长。

idea:两种情况是一样的在这里插入图片描述

ACcode:

#include <cstdio>
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;

const int MAXN = 200010;
int n, x[MAXN], y[MAXN], d[MAXN], ans = 0;
vector<int> ans1, ans2;

int main() {
	cin >> n;
	for(int i = 1; i <= n; ++i) cin >> x[i] >> y[i];
	for(int i = 1; i <= n; ++i) {
		int t = x[i];
		if(t == 1) ++ans;
		else if(d[t - 1] <= d[t]) ++ans;
		else --ans;
		if(d[t] == 0) ans+=2;
		if(d[t + 1] <= d[t]) ++ans;
		else --ans;
		d[t]++;
		ans1.push_back(ans);
	}
	ans = 0; memset(d, 0, sizeof(d));
	for(int i = 1; i <= n; ++i) {
		int t = y[i];
		if(t == 1) ++ans;
		else if(d[t - 1] <= d[t]) ++ans;
		else --ans;
		if(d[t] == 0) ans+=2;
		if(d[t + 1] <= d[t]) ++ans;
		else --ans;
		d[t]++;
		ans2.push_back(ans);
	}
	for(int i = 0; i < ans1.size(); ++i) cout << ans1[i] << ' ' << ans2[i] << endl;
	return 0;
}

在峰哥狂过了B C J题之后,发现还剩下M题是可做的,然后开始了与M题的拉锯战…
首先栋哥贡献了14发WA,最后半小时我开始打M,打到最后5min才终于过掉,前前后后一共WA了20发啊啊啊啊啊qwq,从赛后测试来看,栋哥的水法能过百分之50的点,我第一种水法能过百分之60的点

TM
在这里插入图片描述

idea:题目中的原始矩阵边框保证是0我们一直没发现它的用处,一直在错误思路上偏了,一开始总想着有什么办法能把所有的‘1’串到一起,什么用一条线,一个框包起来之类的大水法(赛后看最多过60%的点)。始终没有利用到题目所给出的关于边框的条件。最后还剩是十几min的时候,我突然意识到如果初始的边框一定是‘0’的话,那么构造的两个矩阵的边框可以是一个左边全为1,另一个右边全为1,然后对于每一行而言,只要分开奇偶分别处理就好了。
ACcode:

#include<bits/stdc++.h>
#define LL long long
#define INF 0x3f3f3f3f
using namespace std;

int n,m,c[510][510],a[510][510],b[510][510];
char s[510];

int main()
{

	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>s;
		for(int j=1;j<=m;j++)
		{
			c[i][j] = s[j-1]-'0';
		}
		
		
	}
	for(int i=1;i<=n;i++)
	{
		a[i][1] = 1;
	}
	for(int i=1;i<=n;i++)
	{
		b[i][m] = 1;
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=2;j<=m-1;j++)
		{
			
		if( i%2==1 )
		{
			a[i][j] = 1;
			if( c[i][j]==1 ) b[i][j] = 1;
		}
		else
		{
			b[i][j] = 1;
			if( c[i][j]==1 ) a[i][j] = 1;
		}
		
		}
	}
	//cout<<endl<<endl;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			printf("%d",a[i][j]);
		}
		printf("\n");
	}
	//cout<<endl<<endl;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			printf("%d",b[i][j]);
		}
		printf("\n");
	}
	return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值