제출 #72516

#제출 시각아이디문제언어결과실행 시간메모리
72516IDxTree (#118)오르막길 (FXCUP3_hill)C++17
100 / 100
1253 ms41484 KiB
#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;
typedef long long ll;
const int inf=2e9, MX=300010;

struct edge{
	ll x=1, y=0;
	bool operator > (const edge &e) const {
		return y*e.x>e.y*x;
	}
	bool operator == (const edge &e) const {
		return y*e.x==e.y*x;
	}
};

struct node1{
	int idx; edge e;
	bool operator < (const node1 &nd) const {
		return idx<nd.idx;
	}
};

struct node2{
	int idx; edge e;
	bool operator < (const node2 &nd) const {
		return nd.e>e || (e==nd.e && idx<nd.idx);
	}
	bool operator==(const node2 &nd) const {
        return !(*this < nd) && !(nd < *this);
	}
};

set<node1> S1;

struct pq {
    priority_queue<node2> pq1, pq2;
    void insert(node2 x) {
        pq1.push(x);
    }
    void erase(node2 x) {
        pq2.push(x);
        while (!pq2.empty() && pq1.top() == pq2.top()) {
            pq1.pop();
            pq2.pop();
        }
    }
    node2 get() const {
        return pq1.top();
    }
} S2;


int n;
ll X[MX], Y[MX];
ll c;

int gcd(int x, int y){
	if(y==0) return x;
	return gcd(y,x%y);
}

ll area(int l, int r){
	return (X[r]-X[l])*(Y[l]+Y[r]);
}

int main(){
scanf("%d%lld", &n, &c);	
c*=2;
	for(int i=1; i<=n; i++) scanf("%lld", &X[i]);
	for(int i=1; i<=n; i++) scanf("%lld", &Y[i]);
	for(int i=1; i<n; i++){
		edge e;
		e.x=X[i+1]-X[i];
		e.y=Y[i+1]-Y[i];
		S1.insert({i,e});
		S2.insert({i,e});
	}
	while(true){
		node2 a=S2.get();
		int i=a.idx; edge e=a.e;
		if(i==1) break;

		node1 b=*prev(S1.find({i,e}));
		int j=b.idx; edge f=b.e;

		int k=n;

		auto it=S1.find({i,e});
		auto it2 = next(it);
		if(it2!=S1.end()) k=it2->idx;

		ll now=area(j,k)-area(j,i)-area(i,k);

		if(now>c) break;

//		cout<<"POINTS: "<<j<<' '<<i<<' '<<k<<'\n';

		c-=now;

		S1.erase({i,e}), S2.erase({i,e});
		S1.erase({j,f}), S2.erase({j,f});

		edge g; g.x=e.x+f.x, g.y=e.y+f.y;
		S1.insert({j,g}), S2.insert({j,g});
//		cout<<S1.size()<<", "<<S2.size()<<'\n';
	}
	{
		edge ans=S2.get().e;
		int x=ans.x, y=ans.y, g=gcd(x,y);
printf("%d/%d\n", y/g,x/g);
	}
	return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

hill.cpp: In function 'int main()':
hill.cpp:68:6: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
 scanf("%d%lld", &n, &c); 
 ~~~~~^~~~~~~~~~~~~~~~~~
hill.cpp:70:31: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  for(int i=1; i<=n; i++) scanf("%lld", &X[i]);
                          ~~~~~^~~~~~~~~~~~~~~
hill.cpp:71:31: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  for(int i=1; i<=n; i++) scanf("%lld", &Y[i]);
                          ~~~~~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...