按时间线走…
首先是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;
}