結果

問題 No.742 にゃんにゃんにゃん 猫の挨拶
ユーザー 👑 horiesinitihoriesiniti
提出日時 2018-02-26 08:45:14
言語 Ruby
(3.3.0)
結果
AC  
実行時間 559 ms / 2,500 ms
コード長 1,692 bytes
コンパイル時間 41 ms
コンパイル使用メモリ 7,552 KB
実行使用メモリ 24,448 KB
最終ジャッジ日時 2024-04-20 17:56:24
合計ジャッジ時間 3,643 ms
ジャッジサーバーID
(参考情報)
judge3 / judge4
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 130 ms
16,128 KB
testcase_01 AC 121 ms
16,128 KB
testcase_02 AC 122 ms
16,000 KB
testcase_03 AC 126 ms
16,256 KB
testcase_04 AC 126 ms
16,256 KB
testcase_05 AC 130 ms
15,104 KB
testcase_06 AC 132 ms
16,000 KB
testcase_07 AC 139 ms
16,128 KB
testcase_08 AC 147 ms
16,512 KB
testcase_09 AC 122 ms
16,000 KB
testcase_10 AC 124 ms
16,000 KB
testcase_11 AC 559 ms
24,448 KB
testcase_12 AC 554 ms
23,424 KB
testcase_13 AC 124 ms
16,256 KB
testcase_14 AC 122 ms
16,128 KB
testcase_15 AC 122 ms
16,128 KB
権限があれば一括ダウンロードができます
コンパイルメッセージ
Main.rb:99: warning: assigned but unused variable - tree
Syntax OK

ソースコード

diff #

def f3(n,rs,ls)
rs3=n.times.map{0}
ls3=n.times.map{0}
rs.each{|e|
	rs3[e[0]]=1
	rs3[e[1]]=-1
}
ls.each{|e|
	ls3[e[1]]=1
	ls3[e[0]]=-1
}
rc=0
lc=0
ans=0

n.times{|i|
	
	if rs3[i]==0 
		if ls3[i]==1
			ans+=rc
		elsif ls3[i]==-1
			lc-=1
		end
	end
	if ls3[i]==0
		if rs3[i]==1
			ans+=lc
		elsif rs3[i]==-1
			rc-=1
		end
	end
	if rs3[i]==1 && ls3[i]==1
		ans+=rc+1+lc
		rc+=1
		lc+=1
	end
	if rs3[i]==-1 && ls3[i]==-1
		rc-=1
		lc-=1
	end
	#p [i,rc,lc,ans]
}
return ans
end

def fadd(tree,l,r,p1,p2,add)
	if r==l
		tree[p1]+=add
	else
		m=(r+l)/2
		if (p2<=m)
			fadd(tree,l,m,p1*2+1,p2,add)
		else
			fadd(tree,m+1,r,p1*2+2,p2,add)
		end
		tree[p1]+=add
	end
end
def fsum(tree,l,r,p1,r1)
	if r1<l
		return 0
	elsif 0<=l && r<=r1
		return tree[p1]
	else
		ans=0
		m=(l+r)/2
		ans+=fsum(tree,l,m,p1*2+1,r1)
		ans+=fsum(tree,m+1,r,p1*2+2,r1)
		return ans
	end
	return 0
end

def f(n2,n,ds)
	tree=n2.times.map{0}
	n=n-1
	ans=0
	while ds.empty? ==false do
		d1=ds.shift
		while d1.empty? ==false do
			d2=d1.shift
			d=d2[0]
			no=d2[1]
			fadd(tree,0,n,0,no,d)
			if d==-1 
				t=fsum(tree,0,n,0,no)
				if t>0
					ans+=t
				end
			end
		end
		#p [tree,ans,no,d]
	end
	return ans
end

n2=131071
#n2=31
tree=n2.times.map{0}

n=gets.to_i
xs=n.times.map{gets.to_i-1}
xs2=n.times.map{|i|
	[i,xs[i]]
}

rs=xs2.select{|e|
	e[0]<=e[1]	
}
ls=xs2.select{|e|
	e[1]<=e[0]	
}
rs2=xs2.select{|e|
	e[0]<e[1]	
}
ls2=xs2.select{|e|
	e[1]<e[0]	
}


ds=n.times.map{[]}
i=0
#p ds
rs.each{|e|
	ds[e[0]]<<[1,i]
	ds[e[1]]<<[-1,i]
	i+=1
}
ans1=f(n2,n,ds)
ds=n.times.map{[0,0]}
s1=ls.size-1
ls.each{|e|
	
	ds[e[0]]<<[1,s1]
	ds[e[1]]<<[-1,s1]
	s1-=1
}
ds.reverse!
ans2=f(n2,n,ds)
ans3=f3(n,rs2,ls2)
puts ans1+ans2+ans3
0