F. New Year's Puzzle- Codeforces Round #693 (Div. 3)
F. New Year's Puzzle
https://codeforces.com/contest/1472/problem/F
题解
给出一个2×n的方格,其中有些方格无法填充,问你是否存在一种方案:使用1×2或者2×1的小方格将空白部分全部填充。
首先将所有堵塞位置按y从小排序,使用两个变量(up、down)记录上一个堵塞位置在第一行和第二行的相应位置。
对于第i的堵塞位置,判断距离up和down的长度(uplen,downlen),
- 如果当前位置一列都被堵塞,则只有当uplen=downlen时才可以将中间位置填充,同时将up和down更新为当前位置,否则无法满足要求。
- 当第一行被堵塞时,如果uplen=downlen,则此位置和上一个堵塞位置的中间位置可以一列一列填充,此时更新up=当前位置,down为当前位置的前一个位置(因为此时第二行可以填充,就相当于上一个位置被堵塞),否则只有在uplen为偶数时才可以满足题意,此时downlen为奇数,则当前位置的下面被填充,故更新up和down都为当前位置。
- 当第二行被堵塞时同理。
Code
#include<bits/stdc++.h>
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
const int inf=0x3f3f3f3f;
typedef long long ll;
const int N= 2e5+7;
const ll mod=998244353;
map<ll,int>mp;
struct $
{
int x,y;
bool operator <($ p)const{
if(y!=p.y)return y<p.y;
else return x<p.x;
}
}a[N];
int main(){
IO;
int t=1;
cin>>t;
while(t--){
int n,m;
cin>>n>>m;
for (int i = 0; i < m; ++i)
{
cin>>a[i].x>>a[i].y;
}
sort(a,a+m);
a[m].y=0;
int up=0,down=0,flag=1;
for (int i = 0; i < m; ++i)
{
int ud=a[i].y-up-1,dd=a[i].y-down-1;
if(a[i].y==a[i+1].y){
if(ud==dd)up=down=a[i].y;
else {
flag=0;break;
}i++;
}
else if(a[i].x==1){
if(ud==dd)up=a[i].y,down=a[i].y-1;
else if(ud%2==0)up=down=a[i].y;
else {
flag=0;break;
}
}
else if(a[i].x==2){
if(ud==dd)up=a[i].y-1,down=a[i].y;
else if(dd%2==0)up=down=a[i].y;
else{
flag=0;break;
}
}
}
if(up!=down)flag=0;
if(flag)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
Code will change the world !
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】博客园2025新款「AI繁忙」系列T恤上架,前往周边小店选购
【推荐】凌霞软件回馈社区,携手博客园推出1Panel与Halo联合会员
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 解锁.NET 9性能优化黑科技:从内存管理到Web性能的最全指南
· 通过一个DEMO理解MCP(模型上下文协议)的生命周期
· MySQL下200GB大表备份,利用传输表空间解决停服发版表备份问题
· 记一次 .NET某固高运动卡测试 卡慢分析
· 微服务架构学习与思考:微服务拆分的原则
· AI浏览器自动化实战
· Chat to MySQL 最佳实践:MCP Server 服务调用
· 解锁.NET 9性能优化黑科技:从内存管理到Web性能的最全指南
· .NET周刊【3月第5期 2025-03-30】
· 重生之我是操作系统(八)----文件管理(上)