首页 > 其他分享 >ABC338 D Island Tour 题解

ABC338 D Island Tour 题解

时间:2024-01-28 11:15:07浏览次数:31  
标签:ABC338 一条 int 题解 long Tour Island

Question

有 \(n\) 座海岛由 \(n\) 条桥连着,第 \(i\) 座桥连接第 \(i\) 和 \(i+1\) 座海岛,第 \(n\) 座桥连接第 \(n\) 和 \(1\) 座海盗

有一条长度为 \(m\) 的旅游路线,第 \(X_i\) 表示依次到达的岛屿

现在需要切断一条桥,求总旅游路线最小值

Solution

显然,从第 \(X_{i-1}\) 到 \(X_i\) 有两条路可以走,一条路是 \(|X_i-X_{i-1}|\) 另外一条路是 \(n-|X_i-X_{i-1}|\)

我们肯定选择短的那一条,不妨设短的那条路径长度为 \(x\)

如果短的那一条其中有一条道路被封死了,那么只能绕路,增加的路程就是 \((n-x)-x=n-2x\)

对于短的道路上的每一条路,我们把这个增量加到这条路的每一座桥上面

对于每个 \(X_{i-1},X_i\) 都重复这个过程

总增量最小的那座桥就是被切断的桥

区间加+单点查询可以用树状数组或者线段树实现

Code

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int INF = 1LL<<60;
const int maxn = 4e5 + 10;
int n,m;
int q[maxn],c[maxn];
int read(){
    int ret=0,f=1;char ch=getchar();
    while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
    while(isdigit(ch)){ret=ret*10+ch-'0';ch=getchar();}
    return ret*f;
}

int get(int x){
    int ret = 0 ;
        for(;x;x-=x&-x) ret += c[x];
    return ret;
}
void add(int x,int d){
    for(;x<maxn;x+=x&-x) c[x] += d;
}

signed main(){
    freopen("D.in","r",stdin);
    n=read();m=read();
    int ans = 0;
    for(int i=1;i<=m;i++) q[i]=read();
    for(int i=2;i<=m;i++){
        if(abs(q[i]-q[i-1]) < n - abs(q[i]-q[i-1])){
            int x = abs(q[i]-q[i-1]);
            ans += x;
            int d = n - 2*x;
            int L = min(q[i],q[i-1]), R = max(q[i],q[i-1]);
            add(L,d); add(R,-d);
        }
        else{
            int x = n - abs(q[i]-q[i-1]);
            ans += x;
            int d = n- 2*x;
            int L = min(q[i],q[i-1]), R = max(q[i],q[i-1]);
            add(1,d); add(L,-d); add(R,d); add(n+1,-d);
        }
    }
    int add_ans = INF;
    for(int i=1;i<=n;i++){
        add_ans = min(add_ans, get(i));
    }
    cout<<ans + add_ans<<endl;
    return 0;
}

标签:ABC338,一条,int,题解,long,Tour,Island
From: https://www.cnblogs.com/martian148/p/17992561

相关文章

  • ABC338 E Chords 题解
    Question一个圆上有\(2N\)个点均匀分布,给出\(N\)条线,每条线连接两个顶点问,有没有两条线相交Solution也算一个比较典的题目考虑到这种两两配对,配对中有没有交错关系的可以考虑异或哈希因为一个数异或两次等于它本身,所以我们可以用异或来实现一个“撤销”操作我们当我......
  • UVA10852 的题解
    UVA10852的题解题目大意给定自然数\(n(100\leqn\leq10000)\),寻找质数\(x\len\),使得\(p\timesx\leqn<(p+1)\timesx\)且\(n-p\timesx\)最大。思路不难发现,\(p\)其实就是$\left\lfloor\frac{n}{x}\right\rfloor$,所以,我们只要找到对应的\(x\),\(p\)的只就......
  • 洛谷题解-P3003 [USACO10DEC] Apple Delivery S (dijkstra)
    题目描述Bessiehastwocrispredapplestodelivertotwoofherfriendsintheherd.Ofcourse,shetravelstheC(1<=C<=200,000)cowpathswhicharearrangedastheusualgraphwhichconnectsP(1<=P<=100,000)pasturesconvenientlynumb......
  • CF765F Souvenirs 题解
    题目链接:CF或者洛谷想了很久,然后想起做过的一道题:秃子酋长,一开始以为差不多,结果写着写着就发现不对劲了。最后写出了个神仙回滚莫队解法,感觉很妙,记录下。进入神仙分析时刻首先,我们来考虑一个事实,加上一个数以后,如果能找到它的前后驱,那么可以立马更新最优解,这个也即是瓶颈点。......
  • ABC338 题解(A-E)
    前言:F,G后续补充。A题意判断一个字符串,是否满足只有第一位为大写字母,其余为小写字母。Sol字面意思模拟即可。Code#include<bits/stdc++.h>#definelllonglong#defineN200005#defineendl"\n"#definefifirst#definesesecondusingnamespacestd;constll......
  • AndroidStudio 编辑xml布局文件卡死问题解决
    之前项目编写的都是正常,升级AndroidStudio后编辑布局文件就卡死,还以为是AndroidStudio文件。其实不然,我给整个项目增加了版权声明。所以全部跟新后,布局文件也增加了版权声明。估计AndroidStudio在解析布局文件时候因为有版权声明的原因导致卡死,所以删除版权声明就可以了。可以......
  • 洛谷题解-P1821 [USACO07FEB] Cow Party S
    https://www.luogu.com.cn/problem/P1821题目描述寒假到了,nnn头牛都要去参加一场在编号为xxx的牛的农场举行的派对,农场之间有mmm条有向路,每条路都有一定的长度。每头牛参加完派对后都必须回家,无论是去参加派对还是回家,每头牛都会选择最短路径,求这nnn头牛的最短路径(一个......
  • 洛谷题解-P1673 [USACO05FEB] Part Acquisition S
    https://www.luogu.com.cn/problem/P1673题目描述奶牛们接到了寻找一种新型挤奶机的任务,为此它们准备依次经过N(1≤N≤5×104)N(1\leN\le5\times10^4)N(1≤N≤5×104)颗行星,在行星上进行交易。为了方便,奶牛们已经给可能出现的K(1≤K≤103)K(1\leK\le10^3)K(1≤K≤103)......
  • CF739A Alyona and mex 题解
    题目传送门前置知识贪心|构造解法从贪心的角度分析,最小的\(\operatorname{mex}\)仅会与长度最小的区间有关;另外为使得\(\operatorname{mex}\)最大,当\(\operatorname{mex}\)等于区间长度的时候即为所求。记\(ans\)表示此时得到的答案。构造序列时,长度最小的区间一定......
  • CF1433E Two Round Dances 题解
    题目传送门前置知识圆排列解法\(\dfrac{Q_{n}^{\frac{n}{2}}Q_{\frac{n}{2}}^{\frac{n}{2}}}{A_{2}^{2}}\)即为所求。同时因为\(n\le20\)和没有模数,所以不需要处理逆元,暴力算即可。代码#include<bits/stdc++.h>usingnamespacestd;#definelllonglong#defineu......