提出 #69910029


ソースコード 拡げる

/*
*            /$$           /$$
*           |__/          |__/
*  /$$$$$$$$ /$$ /$$$$$$$$ /$$  /$$$$$$
* |____ /$$/| $$|____ /$$/| $$ /$$__  $$
*    /$$$$/ | $$   /$$$$/ | $$| $$  \ $$
*   /$$__/  | $$  /$$__/  | $$| $$  | $$
*  /$$$$$$$$| $$ /$$$$$$$$| $$|  $$$$$$$
* |________/|__/|________/|__/ \____  $$
*                                   | $$
*                                   | $$
*                                   |__/
*/
//hj23308保佑我
//Missile保佑我
/*
* 醒了在梦里挣扎,不觉黯淡了朝霞
*/
/*
* 我很高兴你没有忘了我,但是我现在更希望你已经忘了我了。
* 希望在你的记忆中,我只是尘土一撮,从你的全世界路过,然后四散飞扬不留下一点痕迹,而你要不回头的往前走。
* 我更希望我只是从你的全世界路过,只是路过
*/
/*
* 只是我在十字路口守了太久,守到黄沙如雨掩埋一切痕迹,才发现自己等的人已经离开了。
*/
/*
* 听我的 别回头 回头就可能会泪流满面,会被黄沙掩埋,所以即使痛苦也要向前走
*/
/*
* 我听到了「天行健」的回响,这是一个伟大斗士的不息自强;
* 我听到了「破万法」的回响,这是一个黑道打手的守护欲望;
* 我看见了「生生不息」的激荡,这是一个骗子的伟大乐章!
*/
/*
* 我用虚假的面具照顾着细腻的感情;
* 我以华丽的衣物下藏着腐烂的血肉;
* 当我摘下面具,褪去衣物,即便是我最亲近的人,也无法直视我
*/
#include<bits/stdc++.h>
using namespace std;
mt19937 engine(chrono::steady_clock().now().time_since_epoch().count());
const int MAXN=2e5+5;
const int N=(1<<30)-1;
int n;
int tot,a[MAXN],b[32*MAXN];
struct TreeB {
	#define Ls(u) (ls[u])
	#define Rs(u) (rs[u])
	int idx,ls[400*MAXN],rs[400*MAXN],sum[400*MAXN];
	TreeB() {
		sum[0]=-1;
	}
	void pushUp(int u)
	{
		sum[u]=max(sum[Ls(u)],sum[Rs(u)]);
	}
	void Modify(int &u,int l,int r,int pos,int val)
	{
		if(!u) u=++idx,sum[u]=-1;
		if(l==r) {
			sum[u]=max(sum[u],val);
			return;
		}
		int mid=(l+r)>>1;
		if(pos<=mid) Modify(Ls(u),l,mid,pos,val);
		else Modify(Rs(u),mid+1,r,pos,val);
		pushUp(u);
	}
	int Query(int u,int l,int r,int L,int R)
	{
		if(!u) return -1;
		if(L<=l&&r<=R) return sum[u];
		int mid=(l+r)>>1,Ans=-1;
		if(L<=mid) Ans=max(Ans,Query(Ls(u),l,mid,L,R));
		if(mid+1<=R) Ans=max(Ans,Query(Rs(u),mid+1,r,L,R));
		return Ans;
	}
	#undef Ls
	#undef Rs
}treeB;
struct TreeA {
	#define Ls(u) (u<<1)
	#define Rs(u) (u<<1|1)
	int root[4*MAXN];
	void Modify(int u,int l,int r,int posA,int posB,int val)
	{
		treeB.Modify(root[u],1,tot,posB,val);
		if(l==r) return;
		int mid=(l+r)>>1;
		if(posA<=mid) Modify(Ls(u),l,mid,posA,posB,val);
		else Modify(Rs(u),mid+1,r,posA,posB,val);
	}
	int Query(int u,int l,int r,int xL,int xR,int yL,int yR)
	{
		if(xL>xR||yL>yR) return -1;
		if(xL<=l&&r<=xR) return treeB.Query(root[u],1,tot,yL,yR);
		int mid=(l+r)>>1,Ans=-1;
		if(xL<=mid) Ans=max(Ans,Query(Ls(u),l,mid,xL,xR,yL,yR));
		if(mid+1<=xR) Ans=max(Ans,Query(Rs(u),mid+1,r,xL,xR,yL,yR));
		return Ans;
	}
}treeA;
void modify(int id,vector<int>&Q)
{
	int res=a[id];
	vector<int>P;
	P.emplace_back(id);
	for(auto pos:Q) {
		if((res|a[pos])!=res) P.emplace_back(pos);
		res|=a[pos];
	}
	swap(P,Q);
}
int calc(int val)
{
	return lower_bound(b+1,b+tot+1,val)-b;
}
void Init()
{
	vector<int>Q;
	b[++tot]=0;
	for(int i=1;i<=n;i++) {
		modify(i,Q);
		int res=a[i];
		b[++tot]=a[i];
		for(auto pos:Q) {
			res|=a[pos];
			b[++tot]=res;
		}
	}
	sort(b+1,b+tot+1);
	tot=unique(b+1,b+tot+1)-b-1;
}
int solve()
{
	treeA.Modify(1,0,n,0,1,0);
	int Ans=0;
	vector<int>Q;
	for(int i=1;i<=n;i++) {
		modify(i,Q);
		int res=a[i],last=i+1;
		for(auto pos:Q) {
			int val=treeA.Query(1,0,n,pos,last-1,1,calc(res))+1;
			if(val!=0) {
				treeA.Modify(1,0,n,i,calc(res),val);
				if(i==n) Ans=max(Ans,val);
			}
			res|=a[pos];
			last=pos;
		}
		int val=treeA.Query(1,0,n,0,last-1,1,calc(res))+1;
		if(val!=0) {
			treeA.Modify(1,0,n,i,calc(res),val);
			if(i==n) Ans=max(Ans,val);
		}
	}
	return Ans;
}
int main()
{
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	std::ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++) {
		cin>>a[i];
	}
	Init();
	cout<<solve()<<"\n";
	return 0;
}

提出情報

提出日時
問題 C - Combine to Make Non-decreasing
ユーザ Ziziq
言語 C++ 20 (gcc 12.2)
得点 800
コード長 4471 Byte
結果 AC
実行時間 2922 ms
メモリ 609356 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 800 / 800
結果
AC × 3
AC × 35
セット名 テストケース
Sample sample_01.txt, sample_02.txt, sample_03.txt
All max_01.txt, max_02.txt, max_03.txt, max_04.txt, max_05.txt, max_06.txt, random_large_01.txt, random_large_02.txt, random_large_03.txt, random_large_04.txt, random_large_05.txt, random_large_06.txt, random_large_07.txt, random_large_08.txt, random_large_09.txt, random_large_10.txt, random_small_01.txt, random_small_02.txt, random_small_03.txt, random_small_04.txt, random_small_05.txt, random_small_06.txt, random_small_07.txt, random_small_08.txt, random_small_09.txt, random_small_10.txt, sample_01.txt, sample_02.txt, sample_03.txt, sparse_01.txt, sparse_02.txt, sparse_03.txt, sparse_04.txt, sparse_05.txt, sparse_06.txt
ケース名 結果 実行時間 メモリ
max_01.txt AC 831 ms 78572 KiB
max_02.txt AC 838 ms 78636 KiB
max_03.txt AC 2899 ms 609356 KiB
max_04.txt AC 2922 ms 607984 KiB
max_05.txt AC 631 ms 70640 KiB
max_06.txt AC 634 ms 70720 KiB
random_large_01.txt AC 326 ms 40068 KiB
random_large_02.txt AC 186 ms 25460 KiB
random_large_03.txt AC 541 ms 62160 KiB
random_large_04.txt AC 424 ms 51032 KiB
random_large_05.txt AC 353 ms 43216 KiB
random_large_06.txt AC 181 ms 24388 KiB
random_large_07.txt AC 575 ms 65280 KiB
random_large_08.txt AC 460 ms 54072 KiB
random_large_09.txt AC 385 ms 46248 KiB
random_large_10.txt AC 212 ms 27832 KiB
random_small_01.txt AC 6 ms 4236 KiB
random_small_02.txt AC 4 ms 3936 KiB
random_small_03.txt AC 8 ms 4372 KiB
random_small_04.txt AC 5 ms 4008 KiB
random_small_05.txt AC 9 ms 4480 KiB
random_small_06.txt AC 10 ms 4736 KiB
random_small_07.txt AC 10 ms 4680 KiB
random_small_08.txt AC 7 ms 4152 KiB
random_small_09.txt AC 11 ms 4840 KiB
random_small_10.txt AC 4 ms 4028 KiB
sample_01.txt AC 1 ms 3492 KiB
sample_02.txt AC 1 ms 3428 KiB
sample_03.txt AC 1 ms 3656 KiB
sparse_01.txt AC 2187 ms 133200 KiB
sparse_02.txt AC 1957 ms 100828 KiB
sparse_03.txt AC 1807 ms 106208 KiB
sparse_04.txt AC 1891 ms 105432 KiB
sparse_05.txt AC 1883 ms 112016 KiB
sparse_06.txt AC 1859 ms 96192 KiB