提出 #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;
}
提出情報
提出日時
2023-09-09 15:35:13+0900
問題
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
結果
セット名
テストケース
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