QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#198290 | #4246. Cactus is Money | hotboy2703 | TL | 1ms | 6792kb | C++14 | 4.2kb | 2023-10-03 12:13:45 | 2023-10-03 12:13:45 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
struct pt{
ll x,y;
pt operator + (pt p) const{
return {x+p.x, y+p.y};
}
pt operator - (pt p) const{
return {x-p.x, y-p.y};
}
ll operator * (pt p)const{
return x * p.y - y * p.x;
}
};
ll sq(pt a,pt b){
return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y);
}
void reorder_polygon(vector <pt> &p){
ll pos = 0;
for (ll i = 0;i < p.size();i ++){
if (p[i].y < p[pos].y || (p[i].y == p[pos].y && p[i].x < p[pos].x)){
pos = i;
}
}
rotate(p.begin(),p.begin() + pos,p.end());
}
ll orientation(pt a, pt b, pt c){
ll ori = (b-a)*(c-b);
if (ori == 0)return 0;
if (ori > 0)return 1;
if (ori < 0)return -1;
}
vector <pt> sum(vector <pt> &P,vector <pt> &Q){
//no mulipleple point counter clockwise
reverse(P.begin(),P.end());
reverse(Q.begin(),Q.end());
reorder_polygon(P);
reorder_polygon(Q);
P.push_back(P[0]);
P.push_back(P[1]);
Q.push_back(Q[0]);
Q.push_back(Q[1]);
vector <pt> result;
ll i,j;
i = j = 0;
while (i < P.size() - 2 || j < Q.size() - 2){
result.push_back(P[i] + Q[j]);
auto cross = (P[i+1] - P[i]) * (Q[j+1] - Q[j]);
if (cross >= 0 && i < P.size() - 2){
++i;
}
if (cross <= 0 && j < Q.size() - 2){
++j;
}
}
return result;
}
void convex_hull(vector <pt> &P){
pt p0 = *min_element(P.begin(),P.end(),[=](pt a, pt b){return make_pair(a.y,a.x) < make_pair(b.y,b.x);});
sort(P.begin(),P.end(),[&p0](const pt &a,const pt &b){
auto o = orientation(p0,a,b);
if (o == 0){
return sq(p0,a) < sq(p0,b);
}
return (o == -1);
});
vector <pt> st;
for (ll i = 0;i < P.size();i ++){
while (st.size() > 1 && orientation(st[st.size() - 2],st[st.size() - 1],P[i]) == 1){
st.pop_back();
}
st.push_back(P[i]);
}
P = st;
}
const ll MAXN = 5e4;
ll n,m;
vector <ll> g[MAXN + 100];
ll pa[MAXN + 100];
bool in[MAXN + 100];
struct edge{
ll u,v,a,b;
};
ll depth[MAXN + 100];
edge all[MAXN * 5 + 100];
ll nxt(ll u, edge x){
return (x.u == u?x.v:x.u);
}
vector <pt> minkowski;
void dfs(ll u){
//cout<<u<<'\n';
for (auto id:g[u]){
auto v = nxt(u,all[id]);
if (!in[v]){
pa[v] = id;
in[v] = 1;
depth[v] = depth[u] + 1;
//cout<<id<<' '<<u<<' '<<v<<'\n';
dfs(v);
}
if (in[v]){
if (depth[v] > depth[u] + 1){
ll cur = v;
vector <pt> tmp;
tmp.push_back({all[id].a,all[id].b});
while (cur != u){
tmp.push_back({all[pa[cur]].a,all[pa[cur]].b});
cur = nxt(cur,all[pa[cur]]);
}
//cout<<pa[1]<<' '<<pa[2]<<' '<<pa[3]<<'\n';
//cout<<u<<' '<<v<<'\n';
convex_hull(tmp);
/*for (auto x:tmp){
cout<<x.x<<' '<<x.y<<'\n';
}
cout<<'\n';*/
if (minkowski.empty())minkowski = tmp;
else minkowski = sum(minkowski,tmp);
}
}
}
}ll sum_a,sum_b;
int main(){
ios_base::sync_with_stdio(0);cin.tie(nullptr);cout.tie(nullptr);
cin>>n>>m;
sum_a = sum_b = 0;
for (ll i = 1;i <= m;i ++){
cin>>all[i].u>>all[i].v>>all[i].a>>all[i].b;
g[all[i].u].push_back(i);
g[all[i].v].push_back(i);
sum_a += all[i].a;
sum_b += all[i].b;
}
in[1] = 1;
dfs(1);
//return 0;
ll ans = sum_a * sum_b;
/*for (ll i = 1;i <= m;i ++){
cout<<(sum_a - all[i].a) * (sum_b - all[i].b)<<'\n';
}
for (auto x:minkowski){
cout<<x.x<<' '<<x.y<<' ';
}
cout<<'\n';*/
for (auto x:minkowski){
//cout<<(sum_a - x.x) * (sum_b - x.y)<<' ';
ans = min(ans,(sum_a - x.x) * (sum_b - x.y));
}
cout<<ans<<'\n';
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 5792kb
input:
3 3 1 2 0 1000 2 3 0 1000 3 1 1 1
output:
0
result:
ok 1 number(s): "0"
Test #2:
score: 0
Accepted
time: 1ms
memory: 5844kb
input:
5 5 1 2 666 10 2 3 555 1000 3 1 444 345 1 4 222 234 2 5 333 123
output:
1185480
result:
ok 1 number(s): "1185480"
Test #3:
score: 0
Accepted
time: 1ms
memory: 6536kb
input:
5 6 1 3 12316 13729 1 2 171 10309 5 1 47389 7369 2 4 43318 36867 1 4 30728 43835 5 3 24437 31639
output:
6732185824
result:
ok 1 number(s): "6732185824"
Test #4:
score: 0
Accepted
time: 0ms
memory: 6784kb
input:
6 6 5 2 36032 49949 4 5 8963 9741 3 4 4004 35098 4 1 14459 30350 4 6 39612 8568 1 5 8645 16098
output:
11617618224
result:
ok 1 number(s): "11617618224"
Test #5:
score: 0
Accepted
time: 0ms
memory: 4816kb
input:
6 6 6 1 1516 16290 3 5 47834 15228 5 1 14795 44496 2 6 21296 36977 6 3 42659 16631 4 3 9808 31313
output:
13124412318
result:
ok 1 number(s): "13124412318"
Test #6:
score: 0
Accepted
time: 1ms
memory: 6792kb
input:
7 7 1 7 42781 13704 7 3 48779 17985 6 4 27969 24986 4 7 33333 35700 5 7 4859 49960 6 2 23927 33500 6 1 11232 15327
output:
24803495714
result:
ok 1 number(s): "24803495714"
Test #7:
score: 0
Accepted
time: 1ms
memory: 5052kb
input:
10 11 7 3 43798 8096 5 7 36600 4126 2 6 20599 15893 9 6 7541 5621 4 9 22047 10608 5 10 21235 2700 1 10 19260 8862 4 3 22407 37504 5 1 12867 1738 1 8 48480 15236 2 5 43525 13679
output:
19944198324
result:
ok 1 number(s): "19944198324"
Test #8:
score: -100
Time Limit Exceeded
input:
10 12 10 2 21765 14299 4 2 8316 29600 3 2 36018 33286 4 5 30741 46828 9 7 13354 18461 9 5 11896 14216 6 1 35705 34008 1 9 41496 21860 7 5 37709 34178 8 7 1595 27497 6 9 12139 37471 3 5 43310 12734