首页 > 其他分享 >2024.1.21模拟赛 C题解

2024.1.21模拟赛 C题解

时间:2024-01-21 21:22:06浏览次数:20  
标签:q1 2024.1 q2 21 int 题解 t2 t1 Y1

简要题意

思路

首先有一个 \(O(nk)\) 的暴力dp,30pts

我们可以发扬人类智慧,构造势能函数 \(U_x=\sum_{未选择的点i}dis(i,x)+h_i\),当前在\(x\)点
定义\(f_i\)表示走到\(i\)点时势能函数的最小值,\(s_i\)表示\(i\)到起点的距离
容易发现只会跨过起点进行转移,于是 \(f_i=f_j+2\times (n-i或i-1)\times (s_i+s_j)\)

容易得到,\(f_i\)随着起点向两边递增,于是我们可以用两个指针维护两边当前还未更新的\(f_x,f_y\),每次选出小的去更新另一边,然后把指针向外移

再然后我们发现,dp柿子可以用斜率优化,这样我们就只用维护左右两边的凸包即可,正好斜率单调递增,复杂度\(O(n)\)

code

#include<bits/stdc++.h>
using namespace std;
#define N 300005
#define int long long
#define i8 __int128
int n,m,sum,d,h1=1,h2=1,t1,t2;
int s[N],f[N],q1[N],q2[N],pos[N];
int X1(int i){return -2*(n-i);}
int Y1(int i){return 2*(n-i)*s[i]+f[i];}
int xi1(int a,int b,int c){
	return (i8)(Y1(a)-Y1(b))*(X1(b)-X1(c))<(i8)(Y1(b)-Y1(c))*(X1(a)-X1(b));
}
int da1(int k,int a,int b){
	return (i8)k*(X1(b)-X1(a))>(Y1(b)-Y1(a));
}
void ins1(int i){
	while(t1>h1&&xi1(i,q1[t1],q1[t1-1])) t1--;
	q1[++t1]=i;
}
int f1(int i){
	while(h1<t1&&da1(s[i],q1[h1],q1[h1+1])) h1++;
	f[i]=min(f[i],Y1(q1[h1])-s[i]*X1(q1[h1]));
	return Y1(q1[h1])-s[i]*X1(q1[h1]);
}
int X2(int i){return -2*(i-1);}
int Y2(int i){return 2*(i-1)*s[i]+f[i];}
int xi2(int a,int b,int c){
	return (i8)(Y2(a)-Y2(b))*(X2(b)-X2(c))<(i8)(Y2(b)-Y2(c))*(X2(a)-X2(b));
}
int da2(int k,int a,int b){
	return (i8)k*(X2(b)-X2(a))>(Y2(b)-Y2(a));
}
void ins2(int i){
	while(t2>h2&&xi2(i,q2[t2],q2[t2-1])) t2--;
	q2[++t2]=i;
}
int f2(int i){
	while(h2<t2&&da2(s[i],q2[h2],q2[h2+1])) h2++;
	f[i]=min(f[i],Y2(q2[h2])-s[i]*X2(q2[h2]));
	return Y2(q2[h2])-s[i]*X2(q2[h2]);
}
signed main(){
	freopen("cut.in","r",stdin);
	freopen("cut.out","w",stdout);
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<n;i++){
		scanf("%lld",&d),pos[i+1]=pos[i]+d;
	}
	for(int i=1;i<=m;i++) s[i]=pos[m]-pos[i],sum+=s[i];
	for(int i=m+1;i<=n;i++) s[i]=pos[i]-pos[m],sum+=s[i];
	int p1,p2;p1=p2=m;
	memset(f,127,sizeof(f));f[m]=sum;
	ins1(p2),ins2(p1),p1--,p2++;
	while(p1>=1&&p2<=n){
		if(f1(p1)==f2(p2)) ins1(p2),ins2(p1),p1--,p2++;
		else if(f1(p1)<f2(p2)) ins2(p1),p1--;
		else ins1(p2),p2++;
	}
	printf("%lld\n",min(f[1],f[n]));
	return 0;
}

标签:q1,2024.1,q2,21,int,题解,t2,t1,Y1
From: https://www.cnblogs.com/hubingshan/p/17978401

相关文章

  • 闲话1.21
    颓。周日啊,大颓特颓......
  • 「闲话随笔」【数据删除】考试题解
    「闲话随笔」【数据删除】考试题解点击查看目录目录「闲话随笔」【数据删除】考试题解T2T3T4T5T6T7T1T8T9被教练斩了.级部为啥不让公布分数?哦好像确实不该.咋四机房就我还没停whk,那我还挺高贵的.昨天中午saidtoFLORIZ:感觉现在是提前体验退役生活了,回班之后小测......
  • 2024.1.21模拟赛 B题解
    题目大意略思路首先有一个50pts的网络流暴力考虑按照\(dp\)值分层,发现在同一层内,随着\(i\)递增,\(a_i\)递减由此可以进一步推出每一个点连接的出边,是下一层的一个区间,并且区间是单调的于是可以线段树优化建边,拿到60pts接着考虑模拟网络流,发现如果每次都选择第一条出边的话,就......
  • 初三选拔模拟赛题解
    目录T2T3T4T5T6T7给个正常的题解以正视听.不过说好的普及难度呢?如果有问题请指出.T2注意到答案一定可以取到最小区间的长度\(len\),一种方案是按\(0\dotslen-1\)循环填.T3大致有两种做法:维护每个手指的次数\(c_i\)和占用的键数\(t_i\),按\(\frac{c_i}{t_i+1}\)......
  • 2024-01-21 闲话
    chatwithyspmonwhateveryouwant!自主命题闲话确实有点消耗家底,尤其是对我这种没啥家底的人来说。所以能不能来和yspm聊天!想说什么说什么!在家的生活实在是太寂寞了,原先觉得GraphofThought是adaptive的,今天读了一下代码,发现不是adaptive的,幻想破灭的一集。去a......
  • 1.21 && 第二场模拟赛记
    写在前面:非常好模拟赛,9道题,3道不用写,三道原题,两道原题,一道东方题。根据等量代换可得有5道原题。t2原题CF740C赛时理解错题意了,具体咋想的我也忘了,但是我的构造方法是每个区间从0开始构造,如果不在区间内则任意输出。但是正解是找到最小区间然后按区间循环输出即可。......
  • 1.21闲话暨模拟赛题解
    未卜先知推歌:二重变革/洛天依,言和byDELA上午写了模拟赛,下午不给我发代码不让我改题不让我看题面,smjb模拟赛一共9道题,4道原题(2道原题,2道"原"题),抛去3道不写的一共6道题T1「尘世闲游」(原神题)没让写T2「一心净土」(原神题&&原题「CF740C」)题解我这里一共找到......
  • CF1375B Neighbor Grid 题解
    题意简述给你一个$n$行$m$列的矩阵,要求你让这个矩阵是“完美”的。“完美”的定义如下:若当前的格子里是一个正整数$k$,那么与这个网格相邻(有公共边)的$k$个格子也必须有一个正整数。若当前的格子里是$0$,那么不受上述的限制。你可以对任意的一个格子加上$1$,次数......
  • P5362 [SDOI2019] 连续子序列 题解--zhengjun
    题面传送门提供一种和其他题解完全不同的解法。记\(P_0\)为题中给出的序列,\(P_1\)为\(P_0\)取反的结果。记\(S_{l\simr}\)表示\(S_lS_{l+1}\dotsS_{r}\)。方便起见,\(P\)下标从\(0\)开始,其余的串都是从\(1\)开始。这里用\(P_{0,i}=\operatorname{popcount(i)}......
  • Github图床搭建,结合Picgo与jsdelivr的免费cdn加速,以及部分问题解决方案
    留份文档,便于后续查询===================用到的地址:Github:GitHubPicgo:PicGoisHere|PicGojsdelivr加速地址:https://cdn.jsdelivr.net/gh/Github用户名/仓库名@master===================1.创建一个GitHub仓库:进入你的GitHub首页,在右上角你会找到一个➕,在下拉菜单中......