首页 > 其他分享 >2022 Hubei Provincial Collegiate Programming Contest G. Brick(gym103729)

2022 Hubei Provincial Collegiate Programming Contest G. Brick(gym103729)

时间:2023-09-09 20:11:06浏览次数:36  
标签:Provincial gym103729 Contest h2 ll h1 else hnow 10

大意

给出底层高度,用1*2的砖块将总形状铺成等高矩形,使得高度最小(不能放在外面)

题解

奇妙做法

当高度同奇偶时显然x可以的话x+2也可以,直接加一层竖的,所以首先分奇偶二分高度

有解的必要条件1是,把矩形黑白方格染色之后未填的黑=白(一个1*2刚好覆盖1黑1白)

然后从左往右放砖块,可以感受一下发现把当前列尽量往上拉是最优的

比如二分ans=10,初始h=4,3,2,1,1

那么往右扫过去可以依次拉到10,9,8,7高度;接下来把h[5]拉到7之后又可以整体横着放一波,变成10,10,10,9,8的阶梯

于是维护阶梯的最下端高度hnow,当h[i]和hnow不同奇偶时可以拉到hnow-1,否则拉到hnow之后再整体往上拉变成hnow+1

这样从左往右知道hnow<h[i],此时无论如何也无法拉成阶梯状,记录终止位置i

然后求出从右往左的终止位置j,若j<i则有解
感受一下就是可以从左往右和从右往左拉出两个阶梯,然后剩下由于必要条件1剩下一定合法(


最后再打表感受一下发现ans不超过max(h[i])+1,所以不用二分了(

code

#include <bits/stdc++.h>
#define fo(a,b,c) for (a=b; a<=c; a++)
#define fd(a,b,c) for (a=b; a>=c; a--)
#define ll long long
#define file
using namespace std;

int n,i,j,k,l,mx;
int h[200001];
ll L,R,Mid,ans;

bool pd(ll t)
{
	int i,j;
	ll sum=0,h1=t,h2=t;
	if (t<mx) return 0;
	
	fo(i,1,n)
	{
		if (i&1)
		{
			if ((t-h[i])%2==1)
			++sum;
		}
		else
		{
			if ((t-h[i])%2==1)
			--sum;
		}
	}
	if (sum) return 0;
	
	fo(i,1,n)
	{
		if (h1>=h[i])
		{
			if ((h1-h[i])%2==0)
			h1=min(h1+1,t);
			else
			--h1;
		}
		else
		break;
	}
	fd(j,n,1)
	{
		if (h2>=h[j])
		{
			if ((h2-h[j])%2==0)
			h2=min(h2+1,t);
			else
			--h2;
		}
		else
		break;
	}
	
	if (j<i) return 1;
	else return 0;
}

int main()
{
//	freopen("G.in","r",stdin);
	scanf("%d",&n);
	fo(i,1,n) scanf("%d",&h[i]),mx=max(mx,h[i]);
	
//	printf("%d\n",pd(10));
	
	ans=2000000000;
	L=1,R=2000000000;
	while (L<R)
	{
		Mid=(L+R)/2;
		if (!pd(Mid*2-1))
		L=Mid+1;
		else
		R=Mid;
	}
	ans=min(ans,L*2-1);
	L=1,R=2000000000;
	while (L<R)
	{
		Mid=(L+R)/2;
		if (!pd(Mid*2))
		L=Mid+1;
		else
		R=Mid;
	}
	ans=min(ans,L*2);
	
	if (ans==2000000000) ans=-1;
	printf("%lld\n",ans);
}

标签:Provincial,gym103729,Contest,h2,ll,h1,else,hnow,10
From: https://www.cnblogs.com/gmh77/p/17690086.html

相关文章

  • 2019 ICPC Universidad Nacional de Colombia Programming Contest
    A.Amazon给定\(n\)条直线(存在共线的情况),在每两条垂直的直线的交点处需要建一个交叉点,求交叉点的数量,注意需要去除共线时候的交叉点题解因为要除去共线的情况,我们考虑将一条直线以方向向量\(v\),与\(x\)轴的交点的横坐标\(x\)的方式存储注意:对于\(v\)来说需要最简形......
  • 【题解】AtCoder Regular Contest 161
    评价:感觉这场题目质量不咋地啊,都是一些乱搞题A.MakeM题目描述:\(N\)是一个正奇数。我们称一个长度为\(N\)的序列\(S\)是M型序列,当前仅当对于所有的\(i=2,4,6,\dots,N-1\)(即偶数位),都有\(S_{i-1}<S_{i}\)且\(S_{i}>S_{i+1}\)。现在给定你一个长度为\(N\)的序列\(A......
  • 【题解】AtCoder Regular Contest 162
    A.EkidenRace题目描述:有\(n\)个人参加了往返赛跑,每个人有一个编号\(1\)到\(n\)。已知以下信息:如果按照往路的成绩排序,那么任何两个人的成绩都不相同。同时第\(i\)个人在往路中排名第\(i\)。如果按照往返的成绩排序,那么任何两个人的成绩都不相同。同时第\(i\)个人......
  • AtCoder Grand Contest 041 F Histogram Rooks
    洛谷传送门AtCoder传送门神题!!!!!!!!!/bx全部格子都被覆盖不好处理,考虑钦定\(k\)个格子不被覆盖,容斥系数就是\((-1)^k\)。发现网格的行不一定连续,但是列是连续的。如果一列有格子被钦定,那么这一列就不能放棋子。由此想到枚举不能放棋子的列(至少有一个棋子被钦定的列)集合\(S\),把......
  • AtCoder Beginner Contest 318 - D(状压 dp)
    目录D-GeneralWeightedMaxMatchingD-GeneralWeightedMaxMatching题意给定无向图,边有边权。让你选择一组边,满足任意两边不相交且总边权和最大。顶点数$\le16$思路状压DP求解该问题状态:利用n位二进制表示每个顶点是否已经被选择,0表示该顶点未选,1表示当前......
  • 2022 International Collegiate Programming Contest, Jinan Site AEKM
    2022InternationalCollegiateProgrammingContest,JinanSite-CodeforcesAEKMA.Tower思路:思维+贪心由于我们只能进行\(+1,-1\)和\\(2\)的操作。显然的,我们能大幅度改变一个数是除\(2\)的操作,并且最后化成的一样的那个数一定不会大于当且的任何一个数,因为这样肯定......
  • The 16-th BIT Campus Programming Contest - Onsite Round
    链接:https://codeforces.com/gym/104025A.Giftsinbox#include"bits/stdc++.h"usingnamespacestd;usingi64=longlong;intmain(){ios::sync_with_stdio(false);cin.tie(nullptr);intn,m,h;cin>>n>>m>&......
  • [题解] AtCoder Beginner Contest 308 A~G
    AtCoderBeginnerContest308A~GA.NewSchemevoidMain(){vector<i64>a(8);for(auto&x:a)cin>>x;if(!is_sorted(a.begin(),a.end())&&!all_of(a.begin(),a.end(),[](auto&x){returnx%25!=0||!(100......
  • The 2022 ICPC Asia Nanjing Regional Contest
    链接:https://codeforces.com/gym/104128A.Stop,YesterdayPleaseNoMore#include"bits/stdc++.h"usingnamespacestd;usingi64=longlong;voidsolve(){intn,m,k;cin>>n>>m>>k;strings;cin>>......
  • The 2022 ICPC Asia Hangzhou Regional Programming Contest
    The2022ICPCAsiaHangzhouRegionalProgrammingContestNoBugNoGame  #include<bits/stdc++.h>usingnamespacestd;#defineendl"\n"#defineintlonglongtypedeflonglongll;constintN=3e3+10;intf[N][N][2];signedm......