Submission #19114446
Source Code Expand
#pragma GCC optimize ("Ofast")
#include<bits/stdc++.h>
using namespace std;
#define MD (998244353U)
void*wmem;
char memarr[96000000];
template<class S, class T> inline S max_L(S a,T b){
return a>=b?a:b;
}
template<class T> inline void walloc1d(T **arr, int x, void **mem = &wmem){
static int skip[16] = {0, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
(*mem) = (void*)( ((char*)(*mem)) + skip[((unsigned long long)(*mem)) & 15] );
(*arr)=(T*)(*mem);
(*mem)=((*arr)+x);
}
template<class T> inline void walloc1d(T **arr, int x1, int x2, void **mem = &wmem){
walloc1d(arr, x2-x1, mem);
(*arr) -= x1;
}
template<class T1> void sortA_L(int N, T1 a[], void *mem = wmem){
sort(a, a+N);
}
template<class T1, class T2> void sortA_L(int N, T1 a[], T2 b[], void *mem = wmem){
int i;
pair<T1, T2>*arr;
walloc1d(&arr, N, &mem);
for(i=(0);i<(N);i++){
arr[i].first = a[i];
arr[i].second = b[i];
}
sort(arr, arr+N);
for(i=(0);i<(N);i++){
a[i] = arr[i].first;
b[i] = arr[i].second;
}
}
struct Modint{
unsigned val;
Modint(){
val=0;
}
Modint(int a){
val = ord(a);
}
Modint(unsigned a){
val = ord(a);
}
Modint(long long a){
val = ord(a);
}
Modint(unsigned long long a){
val = ord(a);
}
inline unsigned ord(unsigned a){
return a%MD;
}
inline unsigned ord(int a){
a %= (int)MD;
if(a < 0){
a += MD;
}
return a;
}
inline unsigned ord(unsigned long long a){
return a%MD;
}
inline unsigned ord(long long a){
a %= (int)MD;
if(a < 0){
a += MD;
}
return a;
}
inline unsigned get(){
return val;
}
inline Modint &operator+=(Modint a){
val += a.val;
if(val >= MD){
val -= MD;
}
return *this;
}
inline Modint &operator-=(Modint a){
if(val < a.val){
val = val + MD - a.val;
}
else{
val -= a.val;
}
return *this;
}
inline Modint &operator*=(Modint a){
val = ((unsigned long long)val*a.val)%MD;
return *this;
}
inline Modint &operator/=(Modint a){
return *this *= a.inverse();
}
inline Modint operator+(Modint a){
return Modint(*this)+=a;
}
inline Modint operator-(Modint a){
return Modint(*this)-=a;
}
inline Modint operator*(Modint a){
return Modint(*this)*=a;
}
inline Modint operator/(Modint a){
return Modint(*this)/=a;
}
inline Modint operator+(int a){
return Modint(*this)+=Modint(a);
}
inline Modint operator-(int a){
return Modint(*this)-=Modint(a);
}
inline Modint operator*(int a){
return Modint(*this)*=Modint(a);
}
inline Modint operator/(int a){
return Modint(*this)/=Modint(a);
}
inline Modint operator+(long long a){
return Modint(*this)+=Modint(a);
}
inline Modint operator-(long long a){
return Modint(*this)-=Modint(a);
}
inline Modint operator*(long long a){
return Modint(*this)*=Modint(a);
}
inline Modint operator/(long long a){
return Modint(*this)/=Modint(a);
}
inline Modint operator-(void){
Modint res;
if(val){
res.val=MD-val;
}
else{
res.val=0;
}
return res;
}
inline operator bool(void){
return val!=0;
}
inline operator int(void){
return get();
}
inline operator long long(void){
return get();
}
inline Modint inverse(){
int a = val;
int b = MD;
int u = 1;
int v = 0;
int t;
Modint res;
while(b){
t = a / b;
a -= t * b;
swap(a, b);
u -= t * v;
swap(u, v);
}
if(u < 0){
u += MD;
}
res.val = u;
return res;
}
inline Modint pw(unsigned long long b){
Modint a(*this);
Modint res;
res.val = 1;
while(b){
if(b&1){
res *= a;
}
b >>= 1;
a *= a;
}
return res;
}
inline bool operator==(int a){
return ord(a)==val;
}
inline bool operator!=(int a){
return ord(a)!=val;
}
}
;
inline Modint operator+(int a, Modint b){
return Modint(a)+=b;
}
inline Modint operator-(int a, Modint b){
return Modint(a)-=b;
}
inline Modint operator*(int a, Modint b){
return Modint(a)*=b;
}
inline Modint operator/(int a, Modint b){
return Modint(a)/=b;
}
inline Modint operator+(long long a, Modint b){
return Modint(a)+=b;
}
inline Modint operator-(long long a, Modint b){
return Modint(a)-=b;
}
inline Modint operator*(long long a, Modint b){
return Modint(a)*=b;
}
inline Modint operator/(long long a, Modint b){
return Modint(a)/=b;
}
inline int my_getchar_unlocked(){
static char buf[1048576];
static int s = 1048576;
static int e = 1048576;
if(s == e && e == 1048576){
e = fread_unlocked(buf, 1, 1048576, stdin);
s = 0;
}
if(s == e){
return EOF;
}
return buf[s++];
}
inline void rd(int &x){
int k;
int m=0;
x=0;
for(;;){
k = my_getchar_unlocked();
if(k=='-'){
m=1;
break;
}
if('0'<=k&&k<='9'){
x=k-'0';
break;
}
}
for(;;){
k = my_getchar_unlocked();
if(k<'0'||k>'9'){
break;
}
x=x*10+k-'0';
}
if(m){
x=-x;
}
}
inline void rd(long long &x){
int k;
int m=0;
x=0;
for(;;){
k = my_getchar_unlocked();
if(k=='-'){
m=1;
break;
}
if('0'<=k&&k<='9'){
x=k-'0';
break;
}
}
for(;;){
k = my_getchar_unlocked();
if(k<'0'||k>'9'){
break;
}
x=x*10+k-'0';
}
if(m){
x=-x;
}
}
struct MY_WRITER{
char buf[1048576];
int s;
int e;
MY_WRITER(){
s = 0;
e = 1048576;
}
~MY_WRITER(){
if(s){
fwrite_unlocked(buf, 1, s, stdout);
}
}
}
;
MY_WRITER MY_WRITER_VAR;
void my_putchar_unlocked(int a){
if(MY_WRITER_VAR.s == MY_WRITER_VAR.e){
fwrite_unlocked(MY_WRITER_VAR.buf, 1, MY_WRITER_VAR.s, stdout);
MY_WRITER_VAR.s = 0;
}
MY_WRITER_VAR.buf[MY_WRITER_VAR.s++] = a;
}
inline void wt_L(char a){
my_putchar_unlocked(a);
}
inline void wt_L(int x){
int s=0;
int m=0;
char f[10];
if(x<0){
m=1;
x=-x;
}
while(x){
f[s++]=x%10;
x/=10;
}
if(!s){
f[s++]=0;
}
if(m){
my_putchar_unlocked('-');
}
while(s--){
my_putchar_unlocked(f[s]+'0');
}
}
inline void wt_L(Modint x){
int i;
i = (int)x;
wt_L(i);
}
template<class T> struct segtree_Point_Maxval{
int N;
int logN;
T*mx;
void malloc(int maxN, int once = 0){
int i;
for(i=1;i<maxN;i*=2){
;
}
mx = new T[2*i];
if(once){
setN(maxN);
}
}
void walloc(int maxN, int once = 0, void **mem = &wmem){
int i;
for(i=1;i<maxN;i*=2){
;
}
walloc1d(&mx, 2*i, mem);
if(once){
setN(maxN);
}
}
void free(void){
delete [] mx;
}
T& operator[](int i){
return mx[N+i];
}
void setN(int n, int zerofill = 1, int dobuild = 1){
int i;
for(i=1,logN=0;i<n;i*=2,logN++){
;
}
N = i;
if(zerofill){
for(i=(0);i<(N);i++){
mx[N+i] = 0;
}
}
if(dobuild){
build();
}
}
void build(void){
int i;
for(i=N-1;i;i--){
mx[i] =max_L(mx[2*i], mx[2*i+1]);
}
}
inline void build(int a){
while(a > 1){
a /= 2;
mx[a] =max_L(mx[2*a], mx[2*a+1]);
}
}
inline void change(int a, T val){
mx[a+N] = val;
build(a+N);
}
inline void add(int a, T val){
mx[a+N] += val;
build(a+N);
}
inline T getMaxVal(int a, int b){
T res;
T tmp;
int fga = 0;
int fgb = 0;
a += N;
b += N;
while(a < b){
if(a%2){
if(fga){
res =max_L(res, mx[a]);
}
else{
res = mx[a];
fga = 1;
}
a++;
}
if(b%2){
b--;
if(fgb){
tmp =max_L(mx[b], tmp);
}
else{
tmp = mx[b];
fgb = 1;
}
}
a /= 2;
b /= 2;
}
if(fga==1 && fgb==0){
return res;
}
if(fga==0 && fgb==1){
return tmp;
}
if(fga==1 && fgb==1){
res =max_L(res, tmp);
return res;
}
return res;
}
}
;
int N;
long long X[200000];
long long D[200000];
Modint dp[200000+1];
int main(){
wmem = memarr;
int i;
int k;
segtree_Point_Maxval<int> t;
rd(N);
{
int Lj4PdHRW;
for(Lj4PdHRW=(0);Lj4PdHRW<(N);Lj4PdHRW++){
rd(X[Lj4PdHRW]);
rd(D[Lj4PdHRW]);
}
}
sortA_L(N,X,D);
t.malloc(N, 1);
dp[N] = 1;
for(i=(N)-1;i>=(0);i--){
k = lower_bound(X, X+N, X[i]+D[i]) - X;
t.change(i,k);
k = t.getMaxVal(i,k);
t.change(i,k);
dp[i] = dp[i+1] + dp[k];
}
wt_L(dp[0]);
wt_L('\n');
return 0;
}
// cLay version 20201229-1
// --- original code ---
// #define MD 998244353
// int N;
// ll X[2d5], D[2d5];
// Modint dp[2d5+1];
// {
// int i, k;
// segtree_Point_Maxval<int> t;
// rd(N,(X,D)(N));
// sortA(N,X,D);
//
// t.malloc(N, 1);
//
// dp[N] = 1;
// rrep(i,N){
// k = lower_bound(X, X+N, X[i]+D[i]) - X;
// t.change(i,k);
// k = t.getMaxVal(i,k);
// t.change(i,k);
// dp[i] = dp[i+1] + dp[k];
// }
// wt(dp[0]);
// }
Submission Info
Submission Time
2021-01-02 18:42:13+0900
Task
F - Removing Robots
User
LayCurse
Language
C++ (GCC 9.2.1)
Score
600
Code Size
9558 Byte
Status
AC
Exec Time
89 ms
Memory
13712 KiB
Compile Error
./Main.cpp: In function ‘int main()’:
./Main.cpp:404:7: warning: ‘res’ may be used uninitialized in this function [-Wmaybe-uninitialized]
404 | T res;
| ^~~
./Main.cpp:405:7: warning: ‘tmp’ may be used uninitialized in this function [-Wmaybe-uninitialized]
405 | T tmp;
| ^~~
Judge Result
Set Name
Sample
All
Score / Max Score
0 / 0
600 / 600
Status
Set Name
Test Cases
Sample
s1.txt, s2.txt, s3.txt, s4.txt
All
01.txt, 02.txt, 03.txt, 04.txt, 05.txt, 06.txt, 07.txt, 08.txt, 09.txt, 10.txt, 11.txt, 12.txt, 13.txt, 14.txt, 15.txt, 16.txt, 17.txt, 18.txt, 19.txt, 20.txt, 21.txt, 22.txt, s1.txt, s2.txt, s3.txt, s4.txt
Case Name
Status
Exec Time
Memory
01.txt
AC
9 ms
4328 KiB
02.txt
AC
4 ms
4352 KiB
03.txt
AC
3 ms
4280 KiB
04.txt
AC
3 ms
4284 KiB
05.txt
AC
3 ms
4360 KiB
06.txt
AC
3 ms
4256 KiB
07.txt
AC
4 ms
4352 KiB
08.txt
AC
4 ms
4400 KiB
09.txt
AC
4 ms
4332 KiB
10.txt
AC
3 ms
4328 KiB
11.txt
AC
60 ms
13528 KiB
12.txt
AC
57 ms
13656 KiB
13.txt
AC
57 ms
13524 KiB
14.txt
AC
48 ms
13528 KiB
15.txt
AC
88 ms
13520 KiB
16.txt
AC
89 ms
13572 KiB
17.txt
AC
78 ms
13524 KiB
18.txt
AC
53 ms
13712 KiB
19.txt
AC
7 ms
4208 KiB
20.txt
AC
61 ms
13524 KiB
21.txt
AC
60 ms
13568 KiB
22.txt
AC
62 ms
13524 KiB
s1.txt
AC
3 ms
4208 KiB
s2.txt
AC
2 ms
4208 KiB
s3.txt
AC
3 ms
4148 KiB
s4.txt
AC
3 ms
4328 KiB