首页 > 其他分享 >题解 ARC175C【Jumping Through Intervals】

题解 ARC175C【Jumping Through Intervals】

时间:2024-03-30 16:22:21浏览次数:21  
标签:return int 题解 Intervals Jumping operator Modint friend mod

先不考虑构造字典序最小的方案,只考虑求出最小的 \(\sum\limits_{i=1}^{N-1}|A_{i+1}-A_i|\)。

设定义域为 \([L_i,R_i]\) 的函数 \(F_i(x)\) 表示考虑后缀 \([i,N]\),令 \(A_i=x\) 时上式最小的值。

初值为 \(F_N(x)=0,(x\in[L_N,R_N])\)。

显然有转移方程:

\[F_i(x)=\min\limits_{y=L_{i+1}}^{R_{i+1}}\{F_{i+1}(y)+|x-y|\} \]

赛时我做到这里之后,发现是加绝对值和取 \(\min\) 的操作,便思考是否可以用类似于 Slope Trick 的方法维护之。

之后,我注意到:\(F_i(x)\) 的函数图象一定形如一段斜率为 \(-1\) 的线段、一段斜率为 \(0\) 的线段和一段斜率为 \(+1\) 的线段拼接得到的分段函数。于是,自然地,维护 \(f_i,g_i\) 表示斜率为 \(-1\) 和 \(0\) 的分界点、斜率为 \(0\) 和 \(+1\) 的分界点。

最后考虑构造出字典序最小的方案。显然 \(A_1=f_1\)。之后枚举 \(i\) 从 \(2\) 到 \(N\),若 \(A_{i-1} < L_i\),显然需要 \(A_i=L_i\);若 \(A_{i-1} > g_i\),则令 \(A_i=g_i\);否则令 \(A_i=A_{i-1}\) 即可。

// Problem: C - Jumping Through Intervals
// Contest: AtCoder - AtCoder Regular Contest 175
// URL: https://atcoder.jp/contests/arc175/tasks/arc175_c
// Memory Limit: 1024 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

//By: OIer rui_er
#include <bits/stdc++.h>
#define rep(x, y, z) for(int x = (y); x <= (z); ++x)
#define per(x, y, z) for(int x = (y); x >= (z); --x)
#define debug(format...) fprintf(stderr, format)
#define fileIO(s) do {freopen(s".in", "r", stdin); freopen(s".out", "w", stdout);} while(false)
#define endl '\n'
using namespace std;
typedef long long ll;

mt19937 rnd(std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::system_clock::now().time_since_epoch()).count());
int randint(int L, int R) {
    uniform_int_distribution<int> dist(L, R);
    return dist(rnd);
}

template<typename T> void chkmin(T& x, T y) {if(x > y) x = y;}
template<typename T> void chkmax(T& x, T y) {if(x < y) x = y;}

template<int mod>
inline unsigned int down(unsigned int x) {
	return x >= mod ? x - mod : x;
}

template<int mod>
struct Modint {
	unsigned int x;
	Modint() = default;
	Modint(unsigned int x) : x(x) {}
	friend istream& operator>>(istream& in, Modint& a) {return in >> a.x;}
	friend ostream& operator<<(ostream& out, Modint a) {return out << a.x;}
	friend Modint operator+(Modint a, Modint b) {return down<mod>(a.x + b.x);}
	friend Modint operator-(Modint a, Modint b) {return down<mod>(a.x - b.x + mod);}
	friend Modint operator*(Modint a, Modint b) {return 1ULL * a.x * b.x % mod;}
	friend Modint operator/(Modint a, Modint b) {return a * ~b;}
	friend Modint operator^(Modint a, int b) {Modint ans = 1; for(; b; b >>= 1, a *= a) if(b & 1) ans *= a; return ans;}
	friend Modint operator~(Modint a) {return a ^ (mod - 2);}
	friend Modint operator-(Modint a) {return down<mod>(mod - a.x);}
	friend Modint& operator+=(Modint& a, Modint b) {return a = a + b;}
	friend Modint& operator-=(Modint& a, Modint b) {return a = a - b;}
	friend Modint& operator*=(Modint& a, Modint b) {return a = a * b;}
	friend Modint& operator/=(Modint& a, Modint b) {return a = a / b;}
	friend Modint& operator^=(Modint& a, int b) {return a = a ^ b;}
	friend Modint& operator++(Modint& a) {return a += 1;}
	friend Modint operator++(Modint& a, int) {Modint x = a; a += 1; return x;}
	friend Modint& operator--(Modint& a) {return a -= 1;}
	friend Modint operator--(Modint& a, int) {Modint x = a; a -= 1; return x;}
	friend bool operator==(Modint a, Modint b) {return a.x == b.x;}
	friend bool operator!=(Modint a, Modint b) {return !(a == b);}
};

const ll N = 5e5 + 5, inf = 0x3f3f3f3f3f3f3f3fll;

ll n, L[N], R[N], f[N], g[N];

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    cin >> n;
    rep(i, 1, n) cin >> L[i] >> R[i];
    f[n] = L[n];
    g[n] = R[n];
    per(i, n - 1, 1) {
        f[i] = f[i + 1];
        g[i] = g[i + 1];
        chkmax(f[i], L[i]);
        chkmax(g[i], L[i]);
        chkmin(f[i], R[i]);
        chkmin(g[i], R[i]);
    }
    // rep(i, 1, n) cout << f[i] << " " << g[i] << endl;
    ll val = f[1];
    cout << val << " ";
    rep(i, 1, n - 1) {
        if(val < L[i + 1]) {
            val = L[i + 1];
        }
        else if(val > g[i + 1]) {
            val = g[i + 1];
        }
        cout << val << " \n"[i == n - 1];
    }
    return 0;
}

标签:return,int,题解,Intervals,Jumping,operator,Modint,friend,mod
From: https://www.cnblogs.com/ruierqwq/p/18105654/arc175c

相关文章

  • 题解 CF70E【Information Reform】
    题解CF70E【InformationReform】题目描述\(n\)个点的树,边权为\(1\)。可以花费常数\(k\),在一个点上建基站。每个点\(i\)需要找到离他最近的基站\(a_i\),花费\(d[dis(i,a_i)]\)。一种方案的总花费是建基站的花费加上每个点的花费之和。最小化总花费。输出方案\(a_i\)。......
  • ICPC2023 陕西邀请赛 题解
    G-PermutationQuestion找到一个排列\(p\),使得\(\prod_{i=1}^nlcm(p_i,p_{(imodn)+1})\)最大Solution考虑到\(x\)和\(x-1\)必然是互质的所以顺序排列即可Code#include<bits/stdc++.h>usingnamespacestd;intmain(){intn;cin>>n;for(inti......
  • 快递员的烦恼【华为OD机试JAVA&Python&C++&JS题解】
    一.题目-快递员的烦恼快递公司每日早晨,给每位快递员推送需要送到客户手中的快递以及路线信息,快递员自己又查找了一些客户与客户之间的路线距离信息,请你依据这些信息,给快递员设计一条最短路径,告诉他最短路径的距离。注意:不限制快递包裹送到客户手中的顺序,但必须保证都送......
  • 园区参观路径【华为OD机试JAVA&Python&C++&JS题解】
    一.题目-园区参观路径园区某部门举办了FamilyDay,邀请员工及其家属参加;将公司园区视为一个矩形,起始园区设置在左上角,终点园区设置在右下角;家属参观园区时,只能向右和向下园区前进;求从起始园区到终点园区会有多少条不同的参观路径;输入描述:第一行为园区长和宽;后面每一行表示......
  • [题解]P1439 【模板】最长公共子序列
    P1439【模板】最长公共子序列题意简述给出\(1,2,…,n\)的两个排列\(P_1\)和\(P_2\),求它们的最长公共子序列。范围限制:\(n\le10^5\)。样例53214512345输出:3。思路简述这道题看似是最长公共子序列,但是发现如果用\(O(n^2)\)的复杂度实现\(LCS\)就会时......
  • 2024年03月CCF-GESP编程能力等级认证C++编程八级真题解析
    本文收录于专栏《C++等级认证CCF-GESP真题解析》,专栏总目录:点这里。订阅后可阅读专栏内所有文章。一、单选题(每题2分,共30分)第1题为丰富食堂菜谱,炒菜部进行头脑风暴。肉类有鸡肉、牛肉、羊肉、猪肉4种,切法有肉排、肉块、肉末3种,配菜有圆白菜、油菜、豆腐3种,辣度有......
  • 2024年03月CCF-GESP编程能力等级认证C++编程七级真题解析
    本文收录于专栏《C++等级认证CCF-GESP真题解析》,专栏总目录:点这里。订阅后可阅读专栏内所有文章。一、单选题(每题2分,共30分)第1题下列关于排序的说法,正确的是()。A.冒泡排序是最快的排序算法之一。B.快速排序通常是不稳定的。C.最差情况,N个元素做归并排序......
  • ccfcsp-2019-12-2回收站选址(c++满分题解)
    该题就是考察点的保存以及索引的保存和遍历,看了他的用例说明,我原先以为暴力只能得50分,但是又没有想到别的优化方法,就写了一下暴力,发现居然AC下面是代码:#include<iostream>#include<vector>#include<map>usingnamespacestd;intmain(){ intn; cin>>n; vector<pair<......
  • atcoder beginner 346 题解
      看到别人的视频讲解 AtCoderBeginnerContest346A至G題讲解bydreamoon C如果用sort写,那么再从小到大遍历也需要写几行#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<cstdbool>#include<string>#include<......
  • P1484 种树 题解
    P1484种树有\(n\)个坑。第\(i\)个坑种树的价值是\(c_i\),相邻坑不能同时种。可以种\(k\)颗树,求最大价值。模拟费用流,建图类似这样:中间两层结点之间有\(7\)条边,表示\(n=7\)的情况。相邻两条边,例如\(1,2\)总流入量为\(1\),\(2,3\)总流出量为\(1\),也不可能出现相......