首页 > 其他分享 >[AtCoder Grand Contest 071] E: Jigsaw (agc071E)

[AtCoder Grand Contest 071] E: Jigsaw (agc071E)

时间:2022-12-29 14:32:21浏览次数:68  
标签:AtCoder Contest int Jigsaw cd rd 拼图 pd include


原题链接
​​​https://agc017.contest.atcoder.jp/tasks/agc017_e​

Description

给出N块拼图

每块拼图宽度为3,高度为相同的H

拼图由3个宽度为1的部分拼接而成,第一部分是高度为Ci到Ci+Ai的一块(不超过H),第二部分是高度1到H的一长块,第三部分是高度为Di到Di+Bi的一块(也不超过H)

如图

[AtCoder Grand Contest 071] E: Jigsaw (agc071E)_#define

现在要将这N块拼图拼在一起,必须保证拼接后每一部分都不能悬空

[AtCoder Grand Contest 071] E: Jigsaw (agc071E)_ios_02

给出N<=100000,H<=200
给出每个拼图的A,B,C,D
1<=A,B<=H
0<=C<=H-A
0<=D<=H-B
求判断是否能拼成功

Solution

这题感觉挺难的,然而某些大爷秒切都不屑于写题解了@HowarLi @Jacky35

而且细节贼多

拼图有100000个之多,这很麻烦
然而高度只有200

可以将拼图看做边,高度看做点,相应的连边

注意高度有两种,悬空的就是按照底边算,接地的就按照顶来算,其中一个要加个200之类的

然后入和出某一个加200要反过来(即都是右边连向右边)

上面两行比较意识流,具体可以看看代码

然后对于每一个联通块(此处是无向的联通),我们相当于要用若干条(因为可以两个接地的接在一起,互不镶嵌)从悬空的开始(因为连边的时候都是右边连向右边的,镶嵌的情况下左边接地相当于上一个右边悬空),接地的结束的路径走完所有的边

如果某一个联通块是欧拉回路的话就不合法了

然后把每个联通块出度大于入度的点数和入度大于出度的点数都统计出来,判断是否相等且不为0即可

搞联通块用了并查集

Code

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstring>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fod(i,a,b) for(int i=a;i>=b;i--)
#define N 100005
#define M 405
using namespace std;
bool bz[N];
int cd[M],rd[M],n,num,f[M],h,m,v1[M],v2[M];
int getf(int k)
{
if(f[k]==k||!f[k]) return k;
return (f[k]=getf(f[k]));
}
int main()
{
cin>>n>>h;
fo(i,1,n)
{
int a,b,c,d,x,y;
scanf("%d%d%d%d",&a,&b,&c,&d);
x=(c>0)?c:(a+200);
y=(d>0)?(d+200):b;
cd[x]++,rd[y]++;
int fx=getf(x),fy=getf(y);
f[fx]=fy;
}
int w=0;
bool pd=1;
fo(i,1,400)
{
if(rd[i]>0||cd[i]>0)
{
int fa=getf(i);
if(rd[i]-cd[i]<0)
{
v1[fa]++;
if(i<=200)
{
pd=0;
break;
}
}
if(rd[i]-cd[i]>0)
{
v2[fa]++;
if(i>200)
{
pd=0;
break;
}
}
}
}
if(pd)
fo(i,1,400)
{
if((rd[i]||cd[i])&&v1[getf(i)]==0)
{
pd=0;
break;
}
}
if(pd) printf("YES\n");
else printf("NO\n");
}


标签:AtCoder,Contest,int,Jigsaw,cd,rd,拼图,pd,include
From: https://blog.51cto.com/u_15925597/5977153

相关文章

  • AtCoder-abc230_g GCD Permutation 容斥
    J-GCDPermutation传送门:J-GCDPermutation知识点:素数筛、容斥定理、gcd题意:长度为n的一个排列a中,求满足\(gcd(i,j)!=1且gcd(a_i,a_j)!=1\)的i,j对数。i,j可以......
  • AtCoder Beginner Contest 239总结
    由于比赛延期了一个星期,今天才打,恰巧我记错了时间,本来是8:00,我记成9:00,然后·········幸运的是我还是把前四题做出来了(intwentyminutes),由于时间问题,我......
  • Atcoder Beginner Contest 244总结
    这次的Rating凉了………………这次出乎T3意料的考了交互题,虽然很简单,但卡了我好久……T4考了一个神奇的东西,我用骗分大法水了过去……一看排名发现有快3000人得了1000分......
  • Atcoder Beginner Contest 242
    由于我8点半才下课,我只好晚半个小时再打,这次还行,排名3042五道题,秒了前三道,第四道不会,第五道想出正解,结果一直不对,比完后看了一下大佬的代码恍然大悟,但是比赛早已结束...........
  • Educational DP Contest I - Coins(概率DP)
    https://atcoder.jp/contests/dp/tasks/dp_i题目大意:给定n个硬币,n是奇数,每个硬币朝上的概率是ai问我们一半以上的硬币处于正面的概率是多少?SampleInput130.30......
  • AtCoder Beginner Contest 283
    《E-Don'tIsolateElements》dp   刚开始拿到这道题时,我总是在想:第一行翻不翻转对下面情况的影响,在什么情况下要反转,等一系列情况最后我发现:这些情况不如我可......
  • 2022 icpc 济南 (2022 International Collegiate Programming Contest, Jinan Site)
    链接:https://codeforc.es/gym/104076A.Tower枚举最后的取值,然后计算每个数变成这个取值的最⼩次数,去掉最大的\(m\)个,取\(\min\)。C++Code#include"bits/stdc++.......
  • Atcoder Beginner Contest ABC 283 Ex Popcount Sum 题解 (类欧几里得算法)
    题目链接令\(p=\lfloor\frac{n-r}m\rfloor\),则我们其实是要对所有\(0\lei\le29\)求\(\sum_{j=0}^p(\lfloor\frac{mj+r}{2^i}\rfloormod\2)\)。右边那个东西如果没......
  • 2022 International Collegiate Programming Contest, Jinan Site 部分题目简要题解
    从这里开始比赛目录傻逼学院负责人ProblemBTorch注意到$a_1,b_1,a_2,b_2$的和不会超过$10^6$考虑胖先生的周期开始的时候,瘦先生的周期在时......
  • AtCoder Grand Contest 060(持续更新)
    Preface那一天,闪总终于想起了被ACG支配的恐惧……只能说还好Rating不够,这场Unrated打的,写了个A然后B一直挂(一个细节没想到),C数数又数不来90min后光速跑路推Gal去了A-......