提出 #70255614


ソースコード 拡げる

#include <bits/stdc++.h>
using namespace std;
typedef signed long long ll;

#define _P(...) (void)printf(__VA_ARGS__)
#define FOR(x,to) for(x=0;x<(to);x++)
#define FORR(x,arr) for(auto& x:arr)
#define FORR2(x,y,arr) for(auto& [x,y]:arr)
#define ALL(a) (a.begin()),(a.end())
#define ZERO(a) memset(a,0,sizeof(a))
#define MINUS(a) memset(a,0xff,sizeof(a))
template<class T> bool chmax(T &a, const T &b) { if(a<b){a=b;return 1;}return 0;}
template<class T> bool chmin(T &a, const T &b) { if(a>b){a=b;return 1;}return 0;}
//-------------------------------------------------------

int N;
ll W[202020],D[202020];
int Q;

template<class V,int NV> class SegTree_MulAdd {
public:
	vector<V> sum,mul,add; // sum stores val after muladd
	SegTree_MulAdd(){sum.resize(NV*2,0); mul.resize(NV*2,1); add.resize(NV*2,0);};

	V getval(int x,int y,int l=0,int r=NV,int k=1) {
		if(r<=x || y<=l) return 0;
		if(x<=l && r<=y) return sum[k];
		x=max(x,l);
		y=min(y,r);
		V ret=getval(x,y,l,(l+r)/2,k*2)+getval(x,y,(l+r)/2,r,k*2+1);
		return ret*mul[k]+add[k]*(y-x);
	}
	void propagate(int k,int s) {
		mul[k*2]*=mul[k];
		add[k*2]*=mul[k];
		sum[k*2]*=mul[k];
		add[k*2]+=add[k];
		sum[k*2]+=add[k]*s/2;
		mul[k*2+1]*=mul[k];
		add[k*2+1]*=mul[k];
		sum[k*2+1]*=mul[k];
		add[k*2+1]+=add[k];
		sum[k*2+1]+=add[k]*s/2;
		
		mul[k]=1;
		add[k]=0;
	}

	void domul(int x,int y,V v,int l=0,int r=NV,int k=1) {
		if(l>=r) return;
		if(x<=l && r<=y) {
			mul[k]*=v;
			add[k]*=v;
			sum[k]*=v;
		}
		else if(l < y && x < r) {
			propagate(k,r-l);
			domul(x,y,v,l,(l+r)/2,k*2);
			domul(x,y,v,(l+r)/2,r,k*2+1);
			sum[k]=sum[k*2]+sum[k*2+1];
		}
	}
	void doadd(int x,int y,V v,int l=0,int r=NV,int k=1) {
		if(l>=r) return;
		if(x<=l && r<=y) {
			add[k]+=v;
			sum[k]+=(r-l)*v;
		}
		else if(l < y && x < r) {
			propagate(k,r-l);
			doadd(x,y,v/mul[k],l,(l+r)/2,k*2);
			doadd(x,y,v/mul[k],(l+r)/2,r,k*2+1);
			sum[k]=sum[k*2]+sum[k*2+1];
		}
	}
};

SegTree_MulAdd<ll, 1<<18> st;

int in(int v,ll pos) {
	ll a=W[N-1]/2+st.getval(v,N)-W[v]/2;
	return (pos>=a&&pos<=a+W[v]);
}

void solve() {
	int i,j,k,l,r,x,y; string s;
	
	cin>>N;
	FOR(i,N) {
		cin>>W[i];
		W[i]*=2;
	}
	vector<pair<int,int>> V={{N-1,-1}};
	FOR(i,N-1) {
		st.doadd(i,i+1,-(W[i+1]-W[i])/2);
	}
	cin>>Q;
	while(Q--) {
		cin>>i>>x;
		
		if(i==1||i==2) {
			x-=2;
			if(x<0) continue;
			y=(i==1)?-1:1;
			int L=0,R=x+1;
			while(V.back().first<=x) {
				if(V.back().second==-1) {
					st.domul(L,V.back().first+1,-1);
				}
				L=V.back().first+1;
				V.pop_back();
			}
			if(L<R&&V.back().second==-1) {
				st.domul(L,R,-1);
			}
			
			if(y==-1) {
				st.domul(0,x+1,-1);
				V.push_back({x,-1});
			}
			else {
				V.push_back({x,1});
			}
		}
		else {
			x=x*2+1;
			
			int cur=0;
			for(i=20;i>=0;i--) if(cur+(1<<i)<=N&&in(cur+(1<<i)-1,x)==0) cur+=1<<i;
			
			cout<<N-cur<<endl;
		}
		
	}
	
	
}


int main(int argc,char** argv){
	string s;int i;
	if(argc==1) ios::sync_with_stdio(false), cin.tie(0);
	FOR(i,argc-1) s+=argv[i+1],s+='\n'; FOR(i,s.size()) ungetc(s[s.size()-1-i],stdin);
	cout.tie(0); solve(); return 0;
}

提出情報

提出日時
問題 F - Pyramid Alignment
ユーザ kmjp
言語 C++ 20 (gcc 12.2)
得点 525
コード長 3212 Byte
結果 AC
実行時間 929 ms
メモリ 19028 KiB

コンパイルエラー

Main.cpp: In function ‘void solve()’:
Main.cpp:86:15: warning: unused variable ‘j’ [-Wunused-variable]
   86 |         int i,j,k,l,r,x,y; string s;
      |               ^
Main.cpp:86:17: warning: unused variable ‘k’ [-Wunused-variable]
   86 |         int i,j,k,l,r,x,y; string s;
      |                 ^
Main.cpp:86:19: warning: unused variable ‘l’ [-Wunused-variable]
   86 |         int i,j,k,l,r,x,y; string s;
      |                   ^
Main.cpp:86:21: warning: unused variable ‘r’ [-Wunused-variable]
   86 |         int i,j,k,l,r,x,y; string s;
      |                     ^
Main.cpp: In function ‘int main(int, char**)’:
Main.cpp:6:19: warning: this ‘for’ clause does not guard... [-Wmisleading-indentation]
    6 | #define FOR(x,to) for(x=0;x<(to);x++)
      |                   ^~~
Main.cpp:143:9: note: in expansion of macro ‘FOR’
  143 |         FOR(i,argc-1) s+=argv[i+1],s+='\n'; FOR(i,s.size()) ungetc(s[s.size()-1-i],stdin);
      |         ^~~
Main.cpp:6:19: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the ‘for’
    6 | #define FOR(x,to) for(x=0;x<(to);x++)
      |                   ^~~
Main.cpp:143:45: note: in expansion of macro ‘FOR’
  143 |         FOR(i,argc-1) s+=argv[i+1],s+='\n'; FOR(i,s.size()) ungetc(s[s.size()-1-i],stdin);
      |                                             ^~~
Main.cpp:6:28: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::__cxx11::basic_string<char>::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
    6 | #define FOR(x,to) for(x=0;x<(to);x++)
      |                            ^
Main.cpp:143:45: note: in expansion of macro ‘FOR’
  143 |         FOR(i,argc-1) s+=argv[i+1],s+='\n'; FOR(i,s.size()) ungetc(s[s.size()-1-i],stdin);
      |                                             ^~~

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 525 / 525
結果
AC × 1
AC × 16
セット名 テストケース
Sample 00-sample-01.txt
All 00-sample-01.txt, 01-01.txt, 01-02.txt, 01-03.txt, 01-04.txt, 01-05.txt, 01-06.txt, 01-07.txt, 01-08.txt, 01-09.txt, 01-10.txt, 01-11.txt, 01-12.txt, max-01.txt, max-02.txt, max-03.txt
ケース名 結果 実行時間 メモリ
00-sample-01.txt AC 6 ms 15272 KiB
01-01.txt AC 386 ms 16872 KiB
01-02.txt AC 336 ms 16456 KiB
01-03.txt AC 384 ms 16208 KiB
01-04.txt AC 514 ms 16976 KiB
01-05.txt AC 524 ms 18076 KiB
01-06.txt AC 576 ms 17032 KiB
01-07.txt AC 568 ms 17132 KiB
01-08.txt AC 564 ms 16768 KiB
01-09.txt AC 451 ms 16724 KiB
01-10.txt AC 406 ms 16772 KiB
01-11.txt AC 427 ms 16768 KiB
01-12.txt AC 403 ms 16804 KiB
max-01.txt AC 929 ms 17040 KiB
max-02.txt AC 224 ms 17064 KiB
max-03.txt AC 149 ms 19028 KiB