提出 #34878769
ソースコード 拡げる
#include<iostream>
#include<vector>
#include<algorithm>
#include<tuple>
#include<cassert>
using namespace std;
struct segtree1D{
vector<int>idx;
vector<long>dat;
segtree1D(vector<int>fidx)
{
sort(fidx.begin(),fidx.end());
fidx.erase(unique(fidx.begin(),fidx.end()),fidx.end());
idx.swap(fidx);
dat.assign(idx.size(),(long)-1e18);
}
void set(int id,long x)
{
int i=lower_bound(idx.begin(),idx.end(),id)-idx.begin();
assert(i<idx.size()&&idx[i]==id);
i++;
for(;i<=dat.size();i+=i&-i)dat[i-1]=max(dat[i-1],x);
}
long prod(int r)
{
r=lower_bound(idx.begin(),idx.end(),r)-idx.begin();
long ret=(long)-1e18;
for(;r;r-=r&-r)ret=max(ret,dat[r-1]);
return ret;
}
};
struct segtree2D{
vector<int>idx;
vector<vector<int> >idx1D;
vector<segtree1D>dat;
segtree2D(vector<pair<int,int> >fidx)
{
sort(fidx.begin(),fidx.end());
for(int i=0;i<fidx.size();)
{
int x=fidx[i].first;
idx.push_back(x);
idx1D.emplace_back();
while(i<fidx.size()&&fidx[i].first==x)i++;
}
int R=0;
for(int i=0;i<fidx.size();)
{
int x=fidx[i].first;
R++;
while(i<fidx.size()&&fidx[i].first==x)
{
int y=fidx[i++].second;
int r=R;
for(;r<=idx1D.size();r+=r&-r)idx1D[r-1].emplace_back(y);
}
dat.emplace_back(segtree1D(idx1D[R-1]));
}
}
void set(pair<int,int>id,long x)
{
int i=lower_bound(idx.begin(),idx.end(),id.first)-idx.begin();
assert(i<idx.size()&&idx[i]==id.first);
i++;
for(;i<=dat.size();i+=i&-i)dat[i-1].set(id.second,x);
}
long prod(pair<int,int>r)
{
int ri=lower_bound(idx.begin(),idx.end(),r.first)-idx.begin();
long ret=(long)-1e18;
for(;ri;ri-=ri&-ri)ret=max(ret,dat[ri-1].prod(r.second));
return ret;
}
};
struct segtree3D{
vector<int>idx;
vector<vector<pair<int,int> > >idx2D;
vector<segtree2D>dat;
segtree3D(vector<pair<int,pair<int,int> > >fidx)
{
sort(fidx.begin(),fidx.end());
for(int i=0;i<fidx.size();)
{
int x=fidx[i].first;
idx.push_back(x);
idx2D.emplace_back();
while(i<fidx.size()&&fidx[i].first==x)i++;
}
int R=0;
for(int i=0;i<fidx.size();)
{
int x=fidx[i].first;
R++;
while(i<fidx.size()&&fidx[i].first==x)
{
pair<int,int>y=fidx[i++].second;
int r=R;
for(;r<=idx2D.size();r+=r&-r)idx2D[r-1].emplace_back(y);
}
dat.emplace_back(segtree2D(idx2D[R-1]));
}
}
void set(pair<int,pair<int,int> >id,long x)
{
int i=lower_bound(idx.begin(),idx.end(),id.first)-idx.begin();
assert(i<idx.size()&&idx[i]==id.first);
i++;
for(;i<=dat.size();i+=i&-i)dat[i-1].set(id.second,x);
}
long prod(pair<int,pair<int,int> >r)
{
int ri=lower_bound(idx.begin(),idx.end(),r.first)-idx.begin();
long ret=(long)-1e18;
for(;ri;ri-=ri&-ri)ret=max(ret,dat[ri-1].prod(r.second));
return ret;
}
};
int N;
tuple<int,int,int,int>TXYA[1<<17];
main()
{
cin>>N;
vector<pair<int,pair<int,int> > >Set1(N),Set2(N);
for(int i=0;i<N;i++)
{
int t,x,y,a;cin>>t>>x>>y>>a;
TXYA[i]=make_tuple(t,x,y,a);
Set1[i]=make_pair(x,make_pair(y,t-y-x));
Set2[i]=make_pair(-x,make_pair(y,t-y+x));
}
sort(TXYA,TXYA+N,[](const tuple<int,int,int,int>&l,const tuple<int,int,int,int>&r){return get<0>(l)<get<0>(r);});
sort(Set1.begin(),Set1.end());
Set1.erase(unique(Set1.begin(),Set1.end()),Set1.end());
sort(Set2.begin(),Set2.end());
Set2.erase(unique(Set2.begin(),Set2.end()),Set2.end());
segtree3D seg1(Set1);
segtree3D seg2(Set2);
long ans=0;
for(int i=0;i<N;i++)
{
long now=-1e18;
auto[t,x,y,a]=TXYA[i];
if(x+y<=t)now=0;
now=max(now,seg1.prod(make_pair(x+1,make_pair(y+1,t-y-x+1))));
now=max(now,seg2.prod(make_pair(-x+1,make_pair(y+1,t-y+x+1))));
now+=a;
seg1.set(make_pair(x,make_pair(y,t-y-x)),now);
seg2.set(make_pair(-x,make_pair(y,t-y+x)),now);
ans=max(ans,now);
}
cout<<ans<<endl;
}
提出情報
コンパイルエラー
In file included from /usr/include/c++/9/cassert:44,
from ./Main.cpp:5:
./Main.cpp: In member function ‘void segtree1D::set(int, long int)’:
./Main.cpp:20:11: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::vector<int>::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
20 | assert(i<idx.size()&&idx[i]==id);
| ~^~~~~~~~~~~
./Main.cpp:22:9: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::vector<long int>::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
22 | for(;i<=dat.size();i+=i&-i)dat[i-1]=max(dat[i-1],x);
| ~^~~~~~~~~~~~
./Main.cpp: In constructor ‘segtree2D::segtree2D(std::vector<std::pair<int, int> >)’:
./Main.cpp:39:16: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::vector<std::pair<int, int> >::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
39 | for(int i=0;i<fidx.size();)
| ~^~~~~~~~~~~~
./Main.cpp:44:11: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::vector<std::pair<int, int> >::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
44 | while(i<fidx.size()&&fidx[i].first==x)i++;
| ~^~~~~~~~~~~~
./Main.cpp:47:16: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::vector<std::pair<int, int> >::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
47 | for(int i=0;i<fidx.size();)
| ~^~~~~~~~~~~~
./Main.cpp:51:11: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::vector<std::pair<int, int> >::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
51 | while(i<fidx.size()&&fidx[i].first==x)
| ~^~~~~~~~~~~~
./Main.cpp:55:11: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::vector<std::vector<int> >::size_type’ {aka ‘lo...
ジャッジ結果
| セット名 |
Sample |
All |
| 得点 / 配点 |
0 / 0 |
600 / 600 |
| 結果 |
|
|
| セット名 |
テストケース |
| Sample |
sample_01.txt, sample_02.txt, sample_03.txt |
| All |
min.txt, random_01.txt, random_02.txt, random_03.txt, random_04.txt, random_05.txt, random_06.txt, random_07.txt, random_08.txt, random_09.txt, random_10.txt, random_11.txt, random_12.txt, random_13.txt, random_14.txt, random_15.txt, random_16.txt, random_17.txt, random_18.txt, random_19.txt, random_20.txt, random_21.txt, random_22.txt, random_23.txt, random_24.txt, random_25.txt, random_26.txt, random_27.txt, random_28.txt, random_29.txt, random_30.txt, random_31.txt, random_32.txt, random_33.txt, random_34.txt, sample_01.txt, sample_02.txt, sample_03.txt |
| ケース名 |
結果 |
実行時間 |
メモリ |
| min.txt |
AC |
7 ms |
3504 KiB |
| random_01.txt |
AC |
3701 ms |
444968 KiB |
| random_02.txt |
AC |
445 ms |
75072 KiB |
| random_03.txt |
AC |
3764 ms |
447220 KiB |
| random_04.txt |
AC |
1557 ms |
214800 KiB |
| random_05.txt |
AC |
3704 ms |
445740 KiB |
| random_06.txt |
AC |
2691 ms |
336448 KiB |
| random_07.txt |
AC |
3724 ms |
446812 KiB |
| random_08.txt |
AC |
1270 ms |
180656 KiB |
| random_09.txt |
AC |
3747 ms |
447772 KiB |
| random_10.txt |
AC |
77 ms |
17868 KiB |
| random_11.txt |
AC |
3775 ms |
446848 KiB |
| random_12.txt |
AC |
1439 ms |
198968 KiB |
| random_13.txt |
AC |
3706 ms |
446312 KiB |
| random_14.txt |
AC |
809 ms |
120684 KiB |
| random_15.txt |
AC |
3772 ms |
447512 KiB |
| random_16.txt |
AC |
630 ms |
100124 KiB |
| random_17.txt |
AC |
3738 ms |
446168 KiB |
| random_18.txt |
AC |
253 ms |
47976 KiB |
| random_19.txt |
AC |
3707 ms |
445828 KiB |
| random_20.txt |
AC |
499 ms |
83648 KiB |
| random_21.txt |
AC |
2146 ms |
265732 KiB |
| random_22.txt |
AC |
923 ms |
129872 KiB |
| random_23.txt |
AC |
2176 ms |
265936 KiB |
| random_24.txt |
AC |
43 ms |
10624 KiB |
| random_25.txt |
AC |
2175 ms |
266276 KiB |
| random_26.txt |
AC |
1221 ms |
162512 KiB |
| random_27.txt |
AC |
2175 ms |
266208 KiB |
| random_28.txt |
AC |
37 ms |
9304 KiB |
| random_29.txt |
AC |
2163 ms |
266060 KiB |
| random_30.txt |
AC |
884 ms |
125264 KiB |
| random_31.txt |
AC |
58 ms |
12220 KiB |
| random_32.txt |
AC |
54 ms |
12084 KiB |
| random_33.txt |
AC |
220 ms |
55036 KiB |
| random_34.txt |
AC |
105 ms |
27100 KiB |
| sample_01.txt |
AC |
2 ms |
3544 KiB |
| sample_02.txt |
AC |
2 ms |
3488 KiB |
| sample_03.txt |
AC |
2 ms |
3556 KiB |