首页 > 其他分享 >icpc2024昆明补题记录

icpc2024昆明补题记录

时间:2024-12-14 22:32:10浏览次数:3  
标签:二分 sta icpc2024 read top mid -- 补题 昆明

D 套娃

这个trick是真没见过,也难怪场上没几个人过这个代码这么简单的题

题目大意

给定一排 \(n\) 个套娃,套娃的大小互不相同。你可以将相邻两个套娃套在一起,问最多能套几
次?

\[n ≤ 10^5 \]

题解

发现可以\(O(n)\)的判断一个长度为\(n\)的套娃序列是否能合并成一个,接下来从左边开始就可以贪心地往右扩展,尽量地让更多的套娃合并成一个,到合并不了的地方,说明只能合并这么多了
接下来就想到二分右端点,然后用\(O(n)\)的算法来进行二分的判断,但直接做复杂度是\(O(n^2\log n)\)的
接下来比较精髓的trick就是,先用倍增确定二分的一个右端点,然后再二分,这样可以就可以让二分区间的长度去到\(O(n\log n)\),加上二分的复杂度,总复杂度就是\(O(n\log^2 n)\)的

代码

点击查看代码
#include<cstdio>
#include<algorithm>
using namespace std;
void read(int &res)
{
	res=0;char ch=getchar();
	while(ch<'0'||ch>'9') ch=getchar();
	while('0'<=ch&&ch<='9') res=(res<<1)+(res<<3)+(ch^48),ch=getchar(); 
}
const int N=1e5+100;
int T,n,a[N+10],p[N+10];
bool cmp(int x,int y)
{
	return a[x]<a[y];
}
struct node
{
	int l,r;
}sta[N+10];
int top;
bool check(int l,int r)
{
	for(int i=l;i<=r;i++)
		p[i]=i;
	sort(p+l,p+1+r,cmp);
	top=0;
	for(int i=l;i<=r;i++)
	{
		sta[++top]=(node){p[i],p[i]};
		while(top>1)
		{
			if(sta[top].l==sta[top-1].r+1)
			{
				sta[top-1].r=sta[top].r;
				top--;
				continue;
			}
			if(sta[top].r+1==sta[top-1].l)
			{
				sta[top-1].l=sta[top].l;
				top--;
				continue;
			}
			break;
		}
	}
	return top==1;
}
int main()
{
//	freopen("d.in","r",stdin);
	read(T);
	for(;T--;)
	{
		read(n);
		for(int i=1;i<=n;i++) read(a[i]);
		int Ans=0;
		for(int i=1;i<=n;i++)
		{
			int k=0;
			while(i+(1<<k)-1<=n&&check(i,i+(1<<k)-1)) k++;
			int l=i,r=min(n,i+(1<<k)-1),mid,ans=i;
			while(l<=r)
			{
				mid=l+r>>1;
				if(check(i,mid))
					ans=mid,l=mid+1;
				else
					r=mid-1;
			}
			Ans++;
			i=ans;
		}
		printf("%d\n",n-Ans);
	}
	return 0;
}

标签:二分,sta,icpc2024,read,top,mid,--,补题,昆明
From: https://www.cnblogs.com/the-blog-of-doctorZ/p/18607354

相关文章

  • cf补题日记
    听退役选手建议,补40道C、D题。(又又又开新专题。。。进度:2/100 原题1:Youaregivenastring ss,consistingofdigitsfrom 00 to 99.Inoneoperation,youcanpickanydigitinthisstring,exceptfor 00 ortheleftmostdigit,decreaseitby 11,and......
  • CF补题 964-Div.4
    CF补题964-Div.4-20241206Dashboard-CodeforcesRound964(Div.4)-CodeforcesA:题目大意:给定一个两位数正整数n,求其位数之和#include<stdio.h>intmain(){intn;scanf("%d",&n);while(n--){intx,sum=0;scanf("%d&quo......
  • Codeforces Round 991 (Div. 3) G(补题)
    G-TreeDestruction Code:#include<bits/stdc++.h>usingnamespacestd;typedefint64_ti64;constintN=2e5+5;vector<int>adj[N];intdp[N],ans=0,n;voiddfs(intfrom,intfa){dp[from]=adj[from].size();ans=max......
  • 2024ICPC区域赛昆明站游记
    前言:感谢杨老师给我们学校申请到的外卡名额,也算是第一次参加ICPC区域赛了。 day0早上7点起床去坐飞机,似乎队友lzh还是第一次坐,全程表现的很紧张(在飞机上起飞甚至还抓着我的衣服,当然被我推开了),下飞机后,辛亏提前看了天气,本来打算带件保暖衣的,但因为背包不够大以及看起来比较......
  • MeIoN's XCPC Library - ICPC2024 - Kunming
    MeIoN'sXCPCLibrary-ICPC2024-Kunming目录MeIoN'sXCPCLibrary-ICPC2024-Kunming目录Z_HMeIoN_H.hppMeIoN_IO.hppMeIoN_PRET.hppMeIoN_debug.hppfast_io.hppdsLinearBasis.hppWavelet_Matrix.hppbit_vec.hppchothlly.hppdsu.hppfenw......
  • ICPC2024 杭州区域赛 M. Make It Divisible 解题报告
    ICPC2024杭州区域赛M.MakeItDivisible解题报告题目大意给你一个长度为\(n\le5\times10^4\)的数列\(\{a_n\}\)和一个数\(m\le10^9\),求出所有满足条件的\(x\),使得对于数列\(\{a_n+x\}\)的任意一个区间,满足区间内存在一个数,能整除这个区间内所有的数。......
  • 牛客小白月赛105 补题
    Blz的数字问题链接:B-lz的数字问题_牛客小白月赛105思路:多列举测试用例,考虑完整。首先判断是整数还是小数,小数分整数和小数两部分判断(函数调用最方便!)。注意有<小数的小数部分不够六位>的情况看个错误代码:tip(注释里):1.判断整数和小数应遍历整个数组,若出现".",则为小数,否则相反。......
  • coduck 复赛模拟赛三 补题报告 侯锦呈
    自测160分第一题30分第二题100分第三题30分(后来100分 自己改的)第四题0分第一题十五的月亮题目描述假设一个每个月都是30天,用0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1表示一个月30天中的月亮......
  • 2024CCPC山东省赛补题记录
    前言今天和队友VP了24CCPC山东省赛,最后9题,但是赛中7题左右我就隐身了,赛后看题解发现E题不难,赛时过的人太少导致有点畏手畏脚,看到题解一下就懂了,几分钟写好。这里主要补一下E和L的题解,这场比赛学到了维护区间信息,可以考虑把区间挂在线段树节点上,以及动态维护树直径的典。E传感器......
  • DAY3-补题
    一题之计在于补呐补题很快乐的一点就是看不懂且听不明白但是写注释中理解到了。果然学会一道题最简单的方式是给一个纯萌新讲。说在前面今天%你赛手感非常好,可能是换了一个位置的原因(玄首先T1没有读错题是一个比较大的进步,因为DAY1和2都是因为差不多这个原因寄掉了,读对题目果......