首页 > 其他分享 >[HNOI/AHOI2018] 转盘

[HNOI/AHOI2018] 转盘

时间:2023-11-02 15:45:36浏览次数:34  
标签:ch 前缀 AHOI2018 int max HNOI 物品 最大值 转盘

首先可以发现一定不会停下,因为把停下的时间转化为开头往前挪一步不会使得其他物品的限制变紧

考虑在最后一次经过某个物品时取这个物品,那么枚举终点进行一个时光倒流,断环为链后相当于从 \([n+1,2n]\) 的某个位置出发,一直往前走,使得经过物品 \(i\) 的时间 \(\ge T_i\)

设终点为 \(n+p\),结束时间为 \(t\),那么限制即 \(\forall i,t-(n+p-i)\ge T_i\),也就是 \(t=\max\limits_{i=1}^n(T_i-i+n+p)\),分离一下得到 \(t=\max\limits_{i=1}^n(T_i-i)+n+p\)

但是这个式子其实并不正确,因为断环为链之后前缀 \(p\) 到达的时间要加上一个 \(n\),所以说这个前缀内的最大值对 \(t\) 的贡献要减去 \(n\)

注意到如果序列中的最大值 \(mx\) 不在前缀中,那么 \(p\) 几乎没有影响,如果在前缀中,答案就是 \(\max(mx-n,\max\limits_{i=p+1}^n(T_i-i))+p\),若要更小就要把后面的最大值也包括到前缀中,那么一个物品能贡献到答案当且仅当其是后缀最大值,可以想到线段树维护单调栈,对所有后缀最大值算出最小的答案,复杂度 \(O(n\log^2n)\),代码不到 1k

点击查看代码
#include<bits/stdc++.h>
#define inf (int)2e9
#define N 100005
using namespace std;
int read(){
	int w=0,h=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')h=-h;ch=getchar();}
	while(ch>='0'&&ch<='9'){w=w*10+ch-'0';ch=getchar();}
	return w*h;
}
int n,m,p,ans;
namespace SGT{
#define ls k<<1
#define rs k<<1|1
#define mid ((l+r)>>1)
	int Max[N<<2],Min[N<<2];
	int Bound(int k,int l,int r,int x){
		if(l==r)return Max[k]>x?x+l:inf;
		return Max[rs]>x?min(Min[k],Bound(rs,mid+1,r,x)):Bound(ls,l,mid,x);
	}
	void Modify(int k,int l,int r,int x,int y){
		if(l==r)return void(Max[k]=y-x);
		x<=mid?Modify(ls,l,mid,x,y):Modify(rs,mid+1,r,x,y);
		Max[k]=max(Max[ls],Max[rs]);Min[k]=Bound(ls,l,mid,Max[rs]);
	}
}
using namespace SGT;
signed main(){
	n=read();m=read();p=read();
	for(int i=1;i<=n;i++)Modify(1,1,n,i,read());
	printf("%d\n",ans=Bound(1,1,n,Max[1]-n)+n);
	while(m--){
		int x=read()^(p*ans),y=read()^(p*ans);
		Modify(1,1,n,x,y);
		printf("%d\n",ans=Bound(1,1,n,Max[1]-n)+n);
	}
	return 0;
}

标签:ch,前缀,AHOI2018,int,max,HNOI,物品,最大值,转盘
From: https://www.cnblogs.com/pidan123/p/17805562.html

相关文章

  • 洛谷 P2290 [HNOI2004] 树的计数(Prufer序列,Cayley 公式)
    传送门解题思路关于Prufer序列的构造,见OI-wiki这里直接放结论:一个Prufer序列与一个无根树一一对应度数为\(d_i\)的节点在序列中出现了\(d_i-1\)次\(\sum(d_i-1)=n-2\)n个点的完全图的生成树有\(n^{n-2}\)种所以相当于n-2个数(有重复的)进行全排列,答案即为:\[\frac......
  • P3233 [HNOI2014] 世界树
    将关键点以深度为第一关键字,编号为第二关键字从小到大排序。建完虚树后依次考虑这些关键点可能的管辖的结点。每次在虚树上向上跳,当遇到某个已经被访问过的结点时,根据我们的排序条件,显然再往上的结点就一定不是当前关键点管辖的了。但是在向上跳的这条链上的子树内的结点不一定由......
  • P3217 [HNOI2011] 数矩形
    P3217[HNOI2011]数矩形题解前言提交记录本题其实并不是非常难想,那么为什么本蒟蒻还交了那么多发呢?cal函数求平方的时候传值未开longlong,我谔谔。正文题面省流:给定$n$个点求最大举行的面积,矩形的边可以不与坐标系垂直。如果每次枚举矩形的四个点的话,$O\left(n^4\rig......
  • P3214 [HNOI2011] 卡农 题解
    感觉不是很麻烦,可能就组合排列转化绕一点。。。抽象化题意给定\(n\)个元素,从中选出\(m\)个集合,要求:集合不为空,集合里不能有相同的元素\(m\)个集合都互不相同所有元素被选出的次数为偶数求方案数,并对\(100000007\)取模凭感觉是DP+组合数设\(dp[i][0/1]\)......
  • [HNOI2010] 平面图判定-平面图性质、带权并查集/2-sat
    [HNOI2010]平面图判定-平面图性质、带权并查集/2-sathttps://www.luogu.com.cn/problem/P3209题意:给一张\(n\)个点,\(m\)条边的哈密顿图,并且哈密顿回路已知,问是否是平面图,\(T\)组询问。\(1\leqT\leq100,1\leqn\leq200,1\leqm\leq10^4\)。转换挺奇妙的。极大平面......
  • P4425 HNOI/AHOI2018 转盘
    Day21。容易发现最优解里一定存在一种方案,为「一开始停留一段时间,然后一直往下一个取」的形式。通过调整容易证明。断环成链,直接列出式子:\[\text{ans}=\min\limits_{n\lei<2n}\max\limits_{i-n<j\lei}a_j-j+i\]令\(t_i=a_i-i(1\lei\le2n)\),然后让\(i\)平移\(n-1\)......
  • vue大转盘旋转效果-停在随机定位的奖品处
    代码有点乱,给予vue写的,奖品可以自定义数量抽奖也是随机生成了奖品的下标,然后停在该下标的位置里面有个大转盘的背景图,自己随便找个圆形图片放上去就行了<!--这个案例大概实现了停止在初始位置,误差在±10度左右增加了奖品分布--><template><divclass="hello"><div......
  • P3200 [HNOI2009] 有趣的数列
    原题这题我\(O(n^2)\)的做法竟然没有想出来,反思QwQ首先\(O(n^2)\)的做法很好想,我们考虑从小到大往数组里填数,显然我们要求任何时刻编号为奇数的位置要填的比编号为偶数的位置要不少才行于是我们设\(dp_{i,j,k}\)表示填了前\(i\)个数,奇数位填的个数为\(j\),偶数位填的个数为\(k\)......
  • P3214 [HNOI2011] 卡农
    原题首先我们先简化一下题意。为什么呢?因为这个题如果不简化题意是不太好做的我们考虑用二进制表示集合,这样题意为:有\(2^n-1\)个数,我们要从中选一个大小为\(m\)的无序子集,满足以下条件:集合中所有数的异或和为\(0\)集合中元素不可重复首先无序子集是吓人的,因为我们可......
  • vue 大转盘旋转效果
    场景如下:用户点击抽奖,转盘立刻线性提速转动,同时请求抽奖接口,旋转过程中等待接口返回抽奖信息接口返回信息后,转盘减速至停转网上找到animejs动画框架,想钻研的同学可以看一下,我没有用此框架实现,是手写的这个demo没有实现停在指定奖品上也没有实现完全停止后,正好停在0°<temp......