首页 > 其他 > 详细

[CSP-S模拟测试]:Cicada拿衣服(暴力+乱搞)

时间:2019-10-28 20:29:17      阅读:109      评论:0      收藏:0      [点我收藏+]

题目传送门(内部题94)


输入格式

  第一行两个整数$n,k$,代表衣服的数量和阈值。
  接下来一行$n$个数,第$i$个数$a_i$表示每件衣服的愉悦值。


输出格式

  输出一行$n$个数,第$i$个数为$r_i-l_i+1$,如果不存在这样的$l,r$,则输出$-1$即可。


数据范围与提示

$n\leqslant 10^6,0\leqslant a_i\leqslant 10^8,0\leqslant k\leqslant 10^9$

技术分享图片


题解

正解是什么?我不知道。

乱搞就好了……

具体看代码吧,挺帅(不要脸)的。

可能是我发现这样可以过?

技术分享图片

总之绿块块是我的!!!

技术分享图片

感谢富豪大神的快读(从不打快读的我)。

时间复杂度:$\Theta($不要脸$)$。

期望得分:$64$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
int n,k;
int a[1000001],ans[1000001];
inline int read(){
	int ss(0);char bb(getchar());
	while(bb<48||bb>57)bb=getchar();
	while(bb>=48&&bb<=57)ss=(ss<<1)+(ss<<3)+(bb^48),bb=getchar();
	return ss;
}
int main()
{
	n=read(),k=read();
	for(int i=1;i<=n;i++)ans[i]=-1,a[i]=read();
	if(n<=30000)
	{
		for(int i=1;i<=n;i++)
		{
			int Min=0x3f3f3f3f,Or=0,Max=0,And=(1<<30)-1,r=-0x3f3f3f3f;
			for(int j=i;j<=n;j++)
			{
				if(a[j]<Min)Min=a[j];
				Or|=a[j];
				if(a[j]>Max)Max=a[j];
				And&=a[j];
				if(Min+Or-Max-And>=k)r=j;
			}
			int len=r-i+1;
			for(int j=i;j<=r;j++)if(len>ans[j])ans[j]=len;
		}
		for(int i=1;i<=n;i++)printf("%d ",ans[i]);
		return 0;
	}
	for(int i=1;i<=n;i++)
	{
		int Min=0x3f3f3f3f,Or=0,Max=0,And=(1<<30)-1,r=-0x3f3f3f3f;
		int minn=min(i+700,n);
		for(int j=i;j<=minn;j++)
		{
			if(a[j]<Min)Min=a[j];
			Or|=a[j];
			if(a[j]>Max)Max=a[j];
			And&=a[j];
			if(Min+Or-Max-And>=k)r=j;
		}
		int len=r-i+1;
		for(int j=i;j<=r;j++)if(len>ans[j])ans[j]=len;
	}
	for(int i=1;i<=n;i++)printf("%d ",ans[i]);
	return 0;
}

rp++

[CSP-S模拟测试]:Cicada拿衣服(暴力+乱搞)

原文:https://www.cnblogs.com/wzc521/p/11754598.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!