結果
| 問題 | No.703 ゴミ拾い Easy | 
| コンテスト | |
| ユーザー |  vjudge1 | 
| 提出日時 | 2025-03-19 16:09:08 | 
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) | 
| 結果 | 
                                AC
                                 
                             | 
| 実行時間 | 164 ms / 1,500 ms | 
| コード長 | 1,542 bytes | 
| コンパイル時間 | 2,002 ms | 
| コンパイル使用メモリ | 195,088 KB | 
| 実行使用メモリ | 37,648 KB | 
| 最終ジャッジ日時 | 2025-03-19 16:09:16 | 
| 合計ジャッジ時間 | 7,833 ms | 
| ジャッジサーバーID (参考情報) | judge5 / judge4 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 4 | 
| other | AC * 46 | 
コンパイルメッセージ
main.cpp: In function ‘int main()’:
main.cpp:70:22: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
   70 |                 scanf("%d",&a[i]);
      |                 ~~~~~^~~~~~~~~~~~
main.cpp:72:36: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
   72 |         for(int i=1;i<=n;i++) scanf("%d",&x[i]);
      |                               ~~~~~^~~~~~~~~~~~
main.cpp:73:36: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
   73 |         for(int i=1;i<=n;i++) scanf("%d",&y[i]);
      |                               ~~~~~^~~~~~~~~~~~
            
            ソースコード
#include<bits/stdc++.h>
using namespace std;
const int N=3e5+5;
const long long inf=1e18;
int a[N];
int x[N];
int y[N];
long long dp[N];
struct node
{
	long long k,b;
	int l,r;
	long long gety(long long x){return k*x+b;}
}tr[N<<2];
void build(int id,int l,int r)
{
	tr[id]={0,inf,l,r};
	if(l==r) return;
	int mid=(l+r)>>1;
	build(id<<1,l,mid);
	build(id<<1|1,mid+1,r);
}
void change(int id,node p)
{
	int l=tr[id].l,r=tr[id].r;
	int mid=(l+r)>>1;
	if(p.l<=l&&r<=p.r)
	{
		if(p.gety(l)<tr[id].gety(l)&&p.gety(r)<tr[id].gety(r))
		{
			tr[id].k=p.k;
			tr[id].b=p.b;
		}
		if(tr[id].l==tr[id].r) return;
		if(p.gety(mid)<tr[id].gety(mid))
		{
			swap(tr[id].k,p.k);
			swap(tr[id].b,p.b);
		}
		if(p.gety(l)<tr[id].gety(l))
		{
			change(id<<1,p);
		}
		if(p.gety(r)<tr[id].gety(r))
		{
			change(id<<1|1,p);
		}
	}
	else
	{
		if(p.l<=mid) change(id<<1,p);
		if(p.r>mid) change(id<<1|1,p); 
	}
}
long long query(int id,int x)
{
	if(tr[id].l==tr[id].r) return tr[id].gety(x);
	int mid=(tr[id].l+tr[id].r)>>1;
	long long ans=tr[id].gety(x);
	if(x<=mid) return min(ans,query(id<<1,x));
	else return min(ans,query(id<<1|1,x));
}
int main()
{
	int n;
	cin>>n;
	build(1,-200000,200000);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
	}
	for(int i=1;i<=n;i++) scanf("%d",&x[i]);
	for(int i=1;i<=n;i++) scanf("%d",&y[i]);
	change(1,{x[1],1LL*y[1]*y[1]+1LL*x[1]*x[1],-200000,200000});
	for(int i=1;i<=n;i++)
	{
		dp[i]=1LL*a[i]*a[i]+query(1,-2LL*a[i]);
		change(1,{x[i+1],1LL*y[i+1]*y[i+1]+1LL*x[i+1]*x[i+1]+dp[i],-200000,200000});
	}
	cout<<dp[n];
 } 
            
            
            
        