problemscpp
A collection of my answers to algorithm problems in c++.
| 函数
acwing::acwing3874 命名空间参考

  1. 三元组的最小距离
更多...

struct  point
 

函数

int main (istream &cin, ostream &cout)
 
 TEST (acwing3874, case2)
 

详细描述

  1. 三元组的最小距离

函数说明

◆ main()

int acwing::acwing3874::main ( istream &  cin,
ostream &  cout 
)

在文件 acwing408.cpp1607 行定义.

1607 {
1608 int64_t l, m, n;
1609 cin >> l >> m >> n;
1610 vector<int64_t> s1(l), s2(m), s3(n);
1611 for(int i = 0; i < l; i++) {
1612 cin >> s1[i];
1613 }
1614 for(int i = 0; i < m; i++) {
1615 cin >> s2[i];
1616 }
1617 for(int i = 0; i < n; i++) {
1618 cin >> s3[i];
1619 }
1620 vector<point> s(l + m + n);
1621 int64_t p1 = 0, p2 = 0, p3 = 0, ps = 0, prev1 = -1, prev2 = -1, prev3 = -1;
1622 while(p1 < l || p2 < m || p3 < n || ps < l + m + n) {
1623 int64_t v1 = p1 < l ? s1[p1] : LONG_LONG_MAX;
1624 int64_t v2 = p2 < m ? s2[p2] : LONG_LONG_MAX;
1625 int64_t v3 = p3 < n ? s3[p3] : LONG_LONG_MAX;
1626 int64_t min_v = min(v1, min(v2, v3));
1627 if(min_v == v1) {
1628 s[ps++] = {v1, 1, {-1, prev1, prev2, prev3}};
1629 prev1 = ps - 1;
1630 p1++;
1631 } else if(min_v == v2) {
1632 s[ps++] = {v2, 2, {-1, prev1, prev2, prev3}};
1633 prev2 = ps - 1;
1634 p2++;
1635 } else {
1636 s[ps++] = {v3, 3, {-1, prev1, prev2, prev3}};
1637 prev3 = ps - 1;
1638 p3++;
1639 }
1640 }
1641 int64_t last1 = l + m + n, last2 = l + m + n, last3 = l + m + n;
1642 int64_t ans = LONG_LONG_MAX;
1643 for(int64_t i = l + m + n - 1; i >= 0; i--) {
1644 if(s[i].group == 1) {
1645 if(last2 != l + m + n && s[i].prev_index[3] != -1) {
1646 ans = min(ans, 2 * (s[last2].value - s[s[i].prev_index[3]].value));
1647 }
1648 if(last3 != l + m + n && s[i].prev_index[2] != -1) {
1649 ans = min(ans, 2 * (s[last3].value - s[s[i].prev_index[2]].value));
1650 }
1651 last1 = i;
1652 } else if(s[i].group == 2) {
1653 if(last1 != l + m + n && s[i].prev_index[3] != -1) {
1654 ans = min(ans, 2 * (s[last1].value - s[s[i].prev_index[3]].value));
1655 }
1656 if(last3 != l + m + n && s[i].prev_index[1] != -1) {
1657 ans = min(ans, 2 * (s[last3].value - s[s[i].prev_index[1]].value));
1658 }
1659 last2 = i;
1660 } else {
1661 if(last1 != l + m + n && s[i].prev_index[2] != -1) {
1662 ans = min(ans, 2 * (s[last1].value - s[s[i].prev_index[2]].value));
1663 }
1664 if(last2 != l + m + n && s[i].prev_index[1] != -1) {
1665 ans = min(ans, 2 * (s[last2].value - s[s[i].prev_index[1]].value));
1666 }
1667 last3 = i;
1668 }
1669 }
1670 cout << ans;
1671 return 0;
1672 }

被这些函数引用 TEST().

◆ TEST()

acwing::acwing3874::TEST ( acwing3874  ,
case2   
)

在文件 acwing408_test.cpp1853 行定义.

1853 {
1854 istringstream in("3 4 5\n"
1855 "-1 0 9\n"
1856 "-25 -10 10 11\n"
1857 "2 9 17 30 41");
1858 auto out = ostringstream();
1859 main(in, out);
1860 const auto ans = out.str();
1861 ASSERT_EQ("2",
1862 ans);
1863 }
int main(int argc, char **argv)
Definition: main.cpp:5

引用了 main().