首页 > 其他分享 >2023.11.6测试

2023.11.6测试

时间:2023-11-09 09:36:49浏览次数:29  
标签:cntc int 2023.11 rev 测试 集合 isans row

\[\text{NOIP模拟赛-2023.11.6} \]

T1 视频监控

简单题,写复杂了

#include<bits/stdc++.h>
#define LL long long
using namespace std;

bool Mbe;

const int N=1e5+10;

int row,col,n,ansr,cntr,ansc,cntc;
int b[N<<1],rev[N<<1],tr[N<<1],sumr[N<<1],tc[N<<1],sumc[N<<1];
struct node{int x,y;}a[N<<1];

void solver()
{
	for(int i=1; i<=n; i++)
		b[i]=a[i].y,b[i+n]=a[i].y+col;
	sort(b+1,b+1+2*n);
	int nn=unique(b+1,b+1+2*n)-(b+1);
	for(int i=1; i<=n; i++)
	{
		int x=lower_bound(b+1,b+1+nn,a[i].y)-b;
		int y=lower_bound(b+1,b+1+nn,a[i].y+col)-b;
		tr[x]++;  tr[y]++;
		rev[x]=a[i].y;  rev[y]=a[i].y+col;
		// cout<<x<<" "<<y<<endl;
	}

	ansr=cntr=1e9;
	for(int i=1; i<=nn; i++)
		sumr[i]=sumr[i-1]+tr[i];
	for(int i=1; i<=nn; i++)
	{
		if(sumr[i]<n)
			continue;
		int j=upper_bound(sumr+1,sumr+1+nn,sumr[i]-n)-sumr;
		// cout<<"kkk"<<rev[i]<<" "<<rev[j]<<endl;
		if(rev[i]-rev[j]+1<ansr)
		{
			ansr=rev[i]-rev[j]+1;
			if(rev[i]<=col || rev[j]>col)
				cntr=0;
			else
				cntr=min(rev[i]-col,col-rev[j]+1);
			// cout<<cntr<<endl;
		}
		else if(ansr==rev[i]-rev[j]+1)
		{
			if(rev[i]<=col || rev[j]>col)
				cntr=0;
			else
				cntr=min(cntr,min(rev[i]-col,col-rev[j]+1));
		}
	}
}

void solvec()
{
	for(int i=1; i<=n; i++)
		b[i]=a[i].x,b[i+n]=a[i].x+row,rev[i]=rev[i+n]=0;
	sort(b+1,b+1+2*n);
	int nn=unique(b+1,b+1+2*n)-(b+1);
	for(int i=1; i<=n; i++)
	{
		int x=lower_bound(b+1,b+1+nn,a[i].x)-b;
		int y=lower_bound(b+1,b+1+nn,a[i].x+row)-b;
		tc[x]++;  tc[y]++;
		rev[x]=a[i].x;  rev[y]=a[i].x+row;
		// cout<<x<<" "<<y<<endl;
	}

	ansc=cntc=1e9;
	for(int i=1; i<=nn; i++)
		sumc[i]=sumc[i-1]+tc[i];
	for(int i=1; i<=nn; i++)
	{
		if(sumc[i]<n)
			continue;
		int j=upper_bound(sumc+1,sumc+1+nn,sumc[i]-n)-sumc;
		// cout<<"kkk"<<rev[i]<<" "<<rev[j]<<endl;
		if(rev[i]-rev[j]+1<ansc)
		{
			ansc=rev[i]-rev[j]+1;
			if(rev[i]<=row || rev[j]>row)
				cntc=0;
			else
				cntc=min(rev[i]-row,row-rev[j]+1);
		}
		else if(ansc==rev[i]-rev[j]+1)
		{
			if(rev[i]<=row || rev[j]>row)
				cntc=0;
			else
				cntc=min(cntc,min(rev[i]-row,row-rev[j]+1));
		}
	}
}

bool Med;

int main()
{
	freopen("watch.in","r",stdin);
	freopen("watch.out","w",stdout);

	// fprintf(stderr, "%.3lfMB",(&Med-&Mbe)/1048576.0);

	scanf("%d%d%d",&row,&col,&n);
	for(int i=1; i<=n; i++)
		scanf("%d%d",&a[i].x,&a[i].y);

	solver();
	solvec();
	// cout<<ansr<<" "<<cntr<<endl;

	LL ans=1LL*ansr*ansc;
	printf("%lld %d",ans,cntr+cntc);

	// cout<<"\n"<<cntr<<" "<<cntc<<endl;
	
	return 0;
}

T2 会议

有 \(n\) 个活动,每个活动有开始时间 \(l_i\) 和结束时间 \(r_i\)。称一个活动集合为共享集合,如果集合中的任意两个活动都不重叠。假设会议的最大集合为 \(m\)

现在需要选择 \(n/2\) 个活动来进行,要求举行的活动的最大共享集合为 \(m/2\),保证 \(n,m\) 为偶数,请给出一种方案

\(T\leq 5\times 10^4\),\(n\leq 10^5\),\(l_i,r_i\leq 10^9\)

构造题,一点不会好吧

首先初始的 \(m\) 可以通过排序右端点贪心地求出。问题是我们应该选择哪 \(m/2\) 个来作为最后的活动

一开始想隔着删,发现不行,然后打摆……

其实我们可以直接考虑要前 \(m/2\) 个或者后 \(m/2\) 个。考虑哪些非共享集合的活动也要选择。这里有个非常重要的思想:分类,剩下的 \(m-n\) 个活动,我们应该寻找一种分类方法,使得选择更加明晰

这里的方法是,我们将剩下的活动分为两类,一类是与前 \(m/2\) 个活动有交的活动,另一类是其它活动,分别记为集合 \(L,R\),将共享集合里的活动也分别放进 \(L,R\) 里。这样分类有 \(|L|+|R|=n\),所以必然有一个集合的大小大于等于 \(n/2\),我们从中选择即可。将共享集合的选择了,剩下的随便选

#include<bits/stdc++.h>
using namespace std;

const int N=1e5+10;

int n,m,in[N];
bool isans[N];
struct node{int l,r,id;}a[N];
vector <int> L,R,ans;

void init()
{
	m=0;
	memset(isans,0,sizeof(isans));
	memset(in,0,sizeof(in));
	L.clear();  R.clear();  ans.clear();
}

void mian()
{
	init();

	scanf("%d",&n);
	for(int i=1; i<=n; i++)
		scanf("%d%d",&a[i].l,&a[i].r),a[i].id=i;

	sort(a+1,a+1+n,[](const node &A,const node &B){return A.r<B.r;});

	int lastR=0,mid=0;
	for(int i=1; i<=n; i++)
	{
		if(a[i].l>lastR)
			isans[i]=1,lastR=a[i].r,m++;
	}
	int cnt=0;
	for(int i=1; i<=n; i++)
	{
		if(isans[i])
		{
			cnt++;
			if(cnt==m/2)
			{
				mid=i;  break;
			}
		}
	}

	// cout<<"kk"<<m<<endl;
	for(int i=1; i<=n; i++)
	{
		if(a[i].l<=a[mid].r)
			in[i]=0,L.push_back(i);
		else
			in[i]=1,R.push_back(i);
	}

	if(L.size()>=n/2)
	{
		cnt=0;
		for(auto v:L)
		{
			if(isans[v])
				ans.push_back(a[v].id),cnt++;
		}
		// cout<<cnt<<endl;
		for(auto v:L)
		{
			if(cnt>=n/2)
				break;
			if(!isans[v])
				ans.push_back(a[v].id),cnt++;
			// cout<<cnt<<endl;
		}
	}
	else
	{
		cnt=0;
		for(auto v:R)
		{
			if(isans[v])
				ans.push_back(a[v].id),cnt++;
		}
		for(auto v:R)
		{
			if(cnt>=n/2)
				break;
			if(!isans[v])
				ans.push_back(a[v].id),cnt++;
		}
	}

	// cout<<cnt<<endl;
	for(auto v:ans)
		printf("%d ",v);
	puts("");
}

int main()
{
	freopen("meet.in","r",stdin);
	freopen("meet.out","w",stdout);

	int T;
	scanf("%d",&T);
	while(T--)
		mian();
	
	return 0;
}

标签:cntc,int,2023.11,rev,测试,集合,isans,row
From: https://www.cnblogs.com/xishanmeigao/p/17813612.html

相关文章

  • 2023.11.8测试
    \[\text{NOIP模拟赛-2023.11.8}\]T1日本题一\(n\timesm\)的网格,从\((1,1)\)移到\((n,m)\)网格间有两种连边(无向边):一类边\((i,j)\rightarrow(i+1,j)\);二类边\((i,j)\rightarrow(i,j+1)\)。所有边的代价都是\(1\),但初始时二类边均不能通过网络中有\(k\)个节点可以......
  • 2023.11.8 近期杂题
    CF1797E设\(f(x,y)\)表示\(x,y\)要相同最大的变成多少。由于\(\varphi\)最多只需要做\(\log\)次就可以到\(1\),所以这是可以直接暴力的。我们现在只需维护区间\(f\)的值,外加区间取\(\varphi\)。区间取\(\varphi\)暴力。使用”小清新“线段树,或者用并查集。复杂......
  • 小景的Dba之路--压力测试和Oracle数据库缓存
    小景最近在做系统查询接口的压测相关的工作,其中涉及到了查询接口的数据库缓存相关的内容,在这里做一个汇总和思维发散,顺便简单说下自己的心得:针对系统的查询接口,首次压测执行的时候TPS较低,平均响应时间较高,后续的查询中,TPS和平均相应时间较第一次比有较为明显的提升,这里考虑到时Or......
  • 浅谈性能测试问题定位
    什么是系统的性能?当一个系统被开发出来后,功能均被实现了,系统进入稳定的运行状态。但系统的运行得怎么样,还是有待验证。系统的运行得怎么样即可以简单理解为系统的性能。什么是系统的性能测试?在指定的软件、硬件、网络条件下,通过编制脚本运行模拟多种环境进行测试(如:正常环境、峰......
  • 【2023.11.08】NOIP2023模拟试题-30
    前言数论迎我归,数学送我葬组合数学不容易,又有DP当T3刚爆零,T4又遭殃OI路上怅前望,且行且彷徨T1最大公约数T1应该想一想就会,接下来我们讨论是怎么减去他的复杂度的。题目的关键在于,如果根据给出的\(a\)推出\(\gcd\)的话,就会有\(9\times10^{10}\)条推导关系。而......
  • 软件测试|好用的pycharm插件推荐(三)——Rainbow Brackets
    简介我们平时写代码的时候,括号是让我们非常头疼的地方,特别是代码逻辑很多,层层嵌套的情况。一眼很难看出,代码是从哪个括号开始,到哪个反括号结束的。这个时候要是有一款工具能够让我们一眼就看出代码从哪个括号开始,到哪个反括号结束,无疑对我们会有很大帮助。PyCharmRainbowBra......
  • 软件测试|MySQL BETWEEN AND:范围查询详解
    简介在MySQL数据库中,使用BETWEENAND操作符可以进行范围查询,即根据某个字段的值在指定范围内进行检索数据。这个操作符非常有用,因为它可以让我们轻松地筛选出位于两个特定值之间的数据,而不需要使用复杂的条件语句。BETWEENAND操作符的语法BETWEENAND操作符的基本语法如下:SE......
  • 软件测试|MySQL LIKE:深入了解模糊查询
    简介在数据库查询中,模糊查询是一种强大的技术,可以用来搜索与指定模式匹配的数据。MySQL数据库提供了一个灵活而强大的LIKE操作符,使得模糊查询变得简单和高效。本文将详细介绍MySQL中的LIKE操作符以及它的用法,并通过示例演示其功能。基本语法MySQL中的LIKE操作符用于模糊匹配数......
  • 软件测试|如何在Pycharm中配置文件头部信息
    简介PyCharm是一款功能强大的Python集成开发环境(IDE),在开发过程中,我们经常需要在代码文件的开头添加固定的文件说明信息,例如版权声明、作者信息、创建日期等。手动添加这些信息可能会很繁琐,但是PyCharm提供了一个方便的功能,可以自动生成固定文件说明信息。本文将详细介绍在PyChar......
  • 软件测试|好用的pycharm插件推荐(一)——Indent Rainbow
    简介在Python中,缩进至关重要,缩进关系着我们的代码层级和逻辑的实现,一旦缩进错误,整个代码的运行就会报错,但是对于初学者来说,又不太容易注意到这一点,所以要是能够有一款提示代码缩进的插件能够使用的话,对我们是很有帮助的。PyCharm作为一款功能强大的Python集成开发环境(IDE),提供了......