Codeforces Round 910 (Div. 2) D. Absolute Beauty(数论)
Codeforces Round 910 (Div. 2) D. Absolute Beauty
思路:
将每个
即 L ( min) —— R (max)
对于
- L1 —— R1 L2 —— R2
若 两线段原本不相交,则会使两线段相交,长度和 +=
- 若原本相交,则会使线段分开,负贡献或者无贡献
因此要尽可能选用两条相隔最远的不相交线段
我们可以记录 最小的右端点 R ,找到最大的左端点 L
答案为 原所有线段和 sum +
#define int long long #define LL long long #define ld long double #define fr(i,l,r) for(int i=l;i<=r;i++) #define rf(i,r,l) for(int i=r;i>=l;i--) #define ppb pop_back() #define pb push_back #define pf push_front #define so(a) sort(a.begin(),a.end()) #define yes cout<<"YES"<<endl #define no cout<<"NO"<<endl #define ikun ios_base::sync_with_stdio(false), cin.tie(NULL), cout.tie(0) //mp.reserve(1024); //mp.max_load_factor(0.25); //auto check = [&]()->bool // { // // }; using namespace std; const int N = 2e5 + 10; int a[N], b[N]; signed main() { ikun; int t; t = 1; cin >> t; auto solve = [&]()->void { int n; cin >> n; for (int i = 1; i <= n; i++) { cin >> a[i]; } for (int i = 1; i <= n; i++) { cin >> b[i]; } vector<pair<int, int>>s(n + 5); int sum = 0; for (int i = 1; i <= n; i++) { s[i] = minmax(a[i], b[i]); sum += abs(a[i] - b[i]); } int mx = 0; int r = (int)1e9; sort(s.begin() + 1, s.begin() + 1 + n); for (int i=1;i<=n;i++) { mx = max(mx, s[i].first - r); r = min(r, s[i].second); } cout << sum + 2*mx << endl; }; while (t--) { solve(); } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】