2018 计蒜之道 初赛 第三场

Posted hl666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2018 计蒜之道 初赛 第三场相关的知识,希望对你有一定的参考价值。

这次我是真的菜,对着T1YY了一堆类似于玄学二分+尺取法的东西

原来是个结论题,然后过了20min才去写T2,虽然1次A,但已经崩了

下面开始讲题

A. 贝壳找房性价比

这是一个神坑题,我们将题意抽象一下

就是在一个二维平面内找出斜率最大的点对

这个就是很性质了,我们将所有点按照横坐标(即s)排序后,对于所有三个点的情况,如下都可以发现:

简单分析后我们得出:AB的斜率大于AC与BC的斜率;BC的斜率大于AC与AB的斜率

然后便有结论:最大的斜率只有可能在相邻的两个数之间

然后就可以A掉了

CODE

#include<cstdio>
#include<algorithm>
using namespace std;
const int N=1e5+5;
struct data
{
	int s,p;
}a[N];
double ans=0;
int t,n;
inline char tc(void)
{
	static char fl[100000],*A=fl,*B=fl;
	return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(int &x)
{
	x=0; char ch=tc(); int flag=1;
	while (ch<\'0\'||ch>\'9\') { if (ch==\'-\') flag=-1; ch=tc(); }
	while (ch>=\'0\'&&ch<=\'9\') x=x*10+ch-\'0\',ch=tc();
	x*=flag;
}
inline bool comp(data a,data b)
{
	return a.s<b.s;
}
inline double max(double a,double b)
{
	return a>b?a:b;
}
inline int abs(int x)
{
	return x>0?x:-x;
}
int main()
{
	//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
	register int i; read(t);
	while (t--)
	{
		for (read(n),i=1;i<=n;++i)
		read(a[i].s),read(a[i].p);
		sort(a+1,a+n+1,comp); bool flag=1;
		for (ans=0.0,i=2;i<=n;++i)
		if (a[i].s==a[i-1].s) { flag=0; break; } else ans=max(ans,(double)abs(a[i].p-a[i-1].p)/(a[i].s-a[i-1].s));
		if (flag) printf("%.6lf\\n",ans); else puts("-1");
	}
	return 0;
}

B. 贝壳找房户外拓展(简单)

这道题就比较简单了,我们直接暴力模拟即可

这里有一个优化,记录一下当前颜色在那一列

CODE

#include<cstdio>
using namespace std;
typedef long long LL;
const LL N=1005,mod=323232323;
LL n,m,t,tot,p[N],q[N],a[N][N],l[N],x,y,z;
inline char tc(void)
{
	static char fl[100000],*A=fl,*B=fl;
	return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(LL &x)
{
	x=0; char ch=tc(); 
	while (ch<\'0\'||ch>\'9\') ch=tc(); 
	while (ch>=\'0\'&&ch<=\'9\') x=x*10+ch-\'0\',ch=tc();
}
inline void write(LL x)
{
	if (x/10) write(x/10);
	putchar(x%10+\'0\');
}
inline void paint(LL x,LL y,LL z,LL num)
{
	for (register LL i=x;i<=y;++i)
	a[i][z]=num;
}
inline LL move(LL x,LL y,LL z)
{
	LL ans=0;
	for (register LL i=y;i<=z;++i)
	if (a[x][i]) ans=(ans*p[a[x][i]]+q[a[x][i]])%mod;
	return ans;
}
inline void del(LL num,LL x)
{
	for (register LL i=1;i<=n;++i)
	if (a[i][x]==num) a[i][x]=0;
}
int main()
{
	//freopen("T2.in","r",stdin); freopen("T2.out","w",stdout);
	register LL i,j;
	read(n); read(m); read(t);
	while (t--)
	{
		char ch=tc(); while (ch!=\'I\'&&ch!=\'Q\'&&ch!=\'D\') ch=tc(); 
		if (ch==\'I\') 
		{
			read(x); read(y); read(z); read(p[++tot]); read(q[tot]);
			l[tot]=z; paint(x,y,z,tot);	
		}
		if (ch==\'Q\')
		{
			read(x); read(y); read(z);
			write(move(x,y,z)); putchar(\'\\n\');
		}
		if (ch==\'D\') read(x),del(x,l[x]);
	}
	return 0;
}

C. 贝壳找房户外拓展(中等)&&D. 贝壳找房户外拓展(困难)

这个题目还是难度比较高的,需要扫描线+线段树维+标记永久化

留着等以后姿势高了再来补

以上是关于2018 计蒜之道 初赛 第三场的主要内容,如果未能解决你的问题,请参考以下文章

2018 计蒜之道 初赛 第三场

2017 计蒜之道 初赛 第三场 D. 腾讯狼人杀 (点边都带权的最大密度子图)

2018 计蒜之道 初赛 第一场

2018 计蒜之道 初赛 第一场

2018 计蒜之道 初赛 第二场

2018 计蒜之道 初赛 第一场