提出 #45343588


ソースコード 拡げる

#include <iostream>
#include <algorithm>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<vector>
#include<iomanip>
#include<ctime>
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<bitset>
#include<cassert>
#define sqr(x) ((x)*(x))
#define fz1(i,n) for ((i)=1;(i)<=(n);(i)++)
#define fd1(i,n) for ((i)=(n);(i)>=1;(i)--)
#define fz0g(i,n) for ((i)=0;(i)<=(n);(i)++)
#define fd0g(i,n) for ((i)=(n);(i)>=0;(i)--)
#define fz0k(i,n) for ((i)=0;(i)<(n);(i)++)
#define fd0k(i,n) for ((i)=(((long long)(n))-1);(i)>=0;(i)--)
#define fz(i,x,y) for ((i)=(x);(i)<=(y);(i)++)
#define fd(i,y,x) for ((i)=(y);(i)>=(x);(i)--)
#define fzin fz1(i,n)
#define fzim fz1(i,m)
#define fzjn fz1(j,n)
#define fzjm fz1(j,m)
#define ff(c,itr) for (__typeof((c).begin()) itr=(c).begin();itr!=(c).end();++itr)
#define pb push_back
#define mk make_pair
#define rdst(st,len){static char ss[len];scanf(" %s",ss);(st)=ss;}
#define spln(i,n) (i==n?'\n':' ')
#define fac_init(n){fac[0]=fac[1]=inv[1]=fi[0]=fi[1]=1;fz(i,2,n){fac[i]=1ll*fac[i-1]*i%mod;inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;fi[i]=1ll*fi[i-1]*inv[i]%mod;}}
using namespace std;
typedef long long i64;
typedef long double f80;
typedef unsigned int u32;
typedef unsigned long long u64;
//typedef __int128 i128;
//typedef unsigned __int128 u128;
#ifndef ONLINE_JUDGE
	FILE *___=freopen("1.in","r",stdin);
#endif
inline void read(int &x)
{
	char c;int f=1;
	while(!isdigit(c=getchar()))if(c=='-')f=-1;
	x=(c&15);while(isdigit(c=getchar()))x=(x<<1)+(x<<3)+(c&15);
	x*=f;
}
const int mod=998244353;
int n,m,i,j,a[250005],p[250005],ans=1;
struct bit
{
	int a[250005];
	void add(int x,int y)
	{
		while(x<=n)a[x]+=y,x+=(x&-x);
	}
	int query(int x)
	{
		int s=0;
		while(x) s+=a[x],x&=x-1;
		return s;
	}
}tr0;
int cur;
struct seg1
{
	int sum[1000005],mi[1000005];
	void pushup(int x)
	{
		sum[x]=sum[x+x]+sum[x+x+1];
		mi[x]=min(mi[x+x+1],mi[x+x]+sum[x+x+1]);
	}
	void update(int x,int l,int r,int y,int c)
	{
		if(l==r){
			sum[x]+=c;
			mi[x]=min(0,sum[x]);
			return;
		}
		int mid=(l+r)/2;
		if(y<=mid) update(x+x,l,mid,y,c);
		else update(x+x+1,mid+1,r,y,c);
		pushup(x);
	}
	int query(int x,int l,int r,int qr)
	{
		if(l>qr) return l-1;
		if(r<=qr&&cur+mi[x]>=0){
			cur+=sum[x];
			return l-1;
		}
		if(l==r) return l;
		int mid=(l+r)/2;
		int t=query(x+x+1,mid+1,r,qr);
		if(t>mid) return t;
		return query(x+x,l,mid,qr);
	}
}tr1;
struct seg2
{
	int sum[1000005],mi[1000005];
	void pushup(int x)
	{
		sum[x]=sum[x+x]+sum[x+x+1];
		mi[x]=min(mi[x+x],mi[x+x+1]+sum[x+x]);
	}
	void update(int x,int l,int r,int y,int c)
	{
		if(l==r){
			sum[x]+=c;
			mi[x]=min(0,sum[x]);
			return;
		}
		int mid=(l+r)/2;
		if(y<=mid) update(x+x,l,mid,y,c);
		else update(x+x+1,mid+1,r,y,c);
		pushup(x);
	}
	int query(int x,int l,int r,int ql)
	{
		if(r<ql) return r+1;
		if(l>=ql&&cur+mi[x]>=0){
			cur+=sum[x];
			return r+1;
		}
		if(l==r) return l;
		int mid=(l+r)/2;
		int t=query(x+x,l,mid,ql);
		if(t<=mid) return t;
		return query(x+x+1,mid+1,r,ql);
	}
}tr2;
set<int> s;
set<int> bl,br;
bool checkban(int l,int r)
{
	if(!bl.count(l)||!br.count(r)){
		bl.erase(l);
		br.erase(r);
		return 1;
	}
	cur=1;int tl=tr1.query(1,1,n,l);
	cur=1;int tr=tr2.query(1,1,n,r);
	if(tr-tl-1>=m){
		bl.erase(l);
		br.erase(r);
		return 1;
	}
	return 0;
}
int calcl(int x)
{
	for(;;){
		int l=*prev(br.upper_bound(x));
		if(l<=*next(s.begin())) return *next(s.begin());
		if(!checkban(*prev(s.find(l)),l)) return l;
	}
}
int calcr(int x)
{
	for(;;){
		int r=*bl.lower_bound(x);
		if(r>=*prev(prev(s.end()))) return *prev(prev(s.end()));
		if(!checkban(r,*next(s.find(r)))) return r;
	}
}
int main()
{
	read(n);read(m);fz1(i,n)read(a[i]),p[a[i]]=i;
	fz0g(i,n+1)s.insert(i);bl=br=s;
	fz1(i,n) tr1.update(1,1,n,i,-1),tr2.update(1,1,n,i,-1);
	fz1(i,n){
		int x=p[i];
		int l=calcl(x);
		int r=calcr(x);
		ans=1ll*ans*(r-l+1-(tr0.query(r)-tr0.query(l-1)))%mod;
		tr0.add(x,1);
		tr1.update(1,1,n,r,1);
		tr2.update(1,1,n,l,1);
		bl.erase(x);br.erase(x);
		set<int>::iterator it=s.find(x);
		int tl=*prev(it),tr=*next(it);
		s.erase(it);
		checkban(tl,tr);
	}
	printf("%d\n",ans);
	return 0;
}

提出情報

提出日時
問題 B - The Greatest Two
ユーザ csy2005
言語 C++ 20 (gcc 12.2)
得点 1500
コード長 4327 Byte
結果 AC
実行時間 986 ms
メモリ 50108 KiB

コンパイルエラー

Main.cpp: In function ‘int main()’:
Main.cpp:19:19: warning: this ‘for’ clause does not guard... [-Wmisleading-indentation]
   19 | #define fz0g(i,n) for ((i)=0;(i)<=(n);(i)++)
      |                   ^~~
Main.cpp:174:9: note: in expansion of macro ‘fz0g’
  174 |         fz0g(i,n+1)s.insert(i);bl=br=s;
      |         ^~~~
Main.cpp:174:32: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the ‘for’
  174 |         fz0g(i,n+1)s.insert(i);bl=br=s;
      |                                ^~

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 1500 / 1500
結果
AC × 4
AC × 42
セット名 テストケース
Sample 00-sample-001.txt, 00-sample-002.txt, 00-sample-003.txt, 00-sample-004.txt
All 00-sample-001.txt, 00-sample-002.txt, 00-sample-003.txt, 00-sample-004.txt, 01-001.txt, 01-002.txt, 01-003.txt, 01-004.txt, 01-005.txt, 01-006.txt, 01-007.txt, 01-008.txt, 01-009.txt, 01-010.txt, 01-011.txt, 01-012.txt, 01-013.txt, 01-014.txt, 01-015.txt, 01-016.txt, 01-017.txt, 01-018.txt, 01-019.txt, 01-020.txt, 01-021.txt, 01-022.txt, 01-023.txt, 01-024.txt, 01-025.txt, 01-026.txt, 01-027.txt, 01-028.txt, 01-029.txt, 01-030.txt, 01-031.txt, 01-032.txt, 01-033.txt, 01-034.txt, 01-035.txt, 01-036.txt, 01-037.txt, 01-038.txt
ケース名 結果 実行時間 メモリ
00-sample-001.txt AC 1 ms 3848 KiB
00-sample-002.txt AC 1 ms 3628 KiB
00-sample-003.txt AC 1 ms 3620 KiB
00-sample-004.txt AC 1 ms 3772 KiB
01-001.txt AC 1 ms 3692 KiB
01-002.txt AC 2 ms 4004 KiB
01-003.txt AC 1 ms 3764 KiB
01-004.txt AC 2 ms 3796 KiB
01-005.txt AC 1 ms 3788 KiB
01-006.txt AC 1 ms 3896 KiB
01-007.txt AC 735 ms 41872 KiB
01-008.txt AC 148 ms 13356 KiB
01-009.txt AC 535 ms 35036 KiB
01-010.txt AC 232 ms 19036 KiB
01-011.txt AC 69 ms 8568 KiB
01-012.txt AC 202 ms 35660 KiB
01-013.txt AC 503 ms 45132 KiB
01-014.txt AC 183 ms 20156 KiB
01-015.txt AC 626 ms 45156 KiB
01-016.txt AC 464 ms 36928 KiB
01-017.txt AC 590 ms 41500 KiB
01-018.txt AC 471 ms 35976 KiB
01-019.txt AC 147 ms 14464 KiB
01-020.txt AC 32 ms 6296 KiB
01-021.txt AC 28 ms 6032 KiB
01-022.txt AC 428 ms 27276 KiB
01-023.txt AC 444 ms 27528 KiB
01-024.txt AC 349 ms 23940 KiB
01-025.txt AC 99 ms 11132 KiB
01-026.txt AC 50 ms 7960 KiB
01-027.txt AC 664 ms 39652 KiB
01-028.txt AC 24 ms 5932 KiB
01-029.txt AC 70 ms 8832 KiB
01-030.txt AC 986 ms 50092 KiB
01-031.txt AC 359 ms 49976 KiB
01-032.txt AC 373 ms 50068 KiB
01-033.txt AC 314 ms 49888 KiB
01-034.txt AC 392 ms 49968 KiB
01-035.txt AC 320 ms 50092 KiB
01-036.txt AC 335 ms 49964 KiB
01-037.txt AC 313 ms 50108 KiB
01-038.txt AC 391 ms 49952 KiB