提出 #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;
}

提出情報

提出日時
問題 Ex - Snuke Panic (2D)
ユーザ kotatsugame
言語 C++ (GCC 9.2.1)
得点 600
コード長 3767 Byte
結果 AC
実行時間 3775 ms
メモリ 447772 KiB

コンパイルエラー

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
結果
AC × 3
AC × 38
セット名 テストケース
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