首页 > 其他分享 >洛谷 P8264 [Ynoi Easy Round 2020] TEST_100

洛谷 P8264 [Ynoi Easy Round 2020] TEST_100

时间:2023-06-21 17:01:54浏览次数:52  
标签:洛谷 lp int P8264 Ynoi pos solve Lp text

题目 Link

我们不妨来考虑所有询问都是 \(l=1,r=n\) 的情形,这种情况下需要对每个值处理出他经过一系列变换后变成了什么数。

考虑用 \(\text{solve}(p,l,r)\) 表示我们现在要计算 \(x\in[l,r]\) 的这些数在经过 \(x\leftarrow |x-a_p|,x\leftarrow |x-a_{p+1}|\),一直到 \(x\leftarrow |x-a_n|\) 这些 \(n-p+1\) 个变换后会变成什么数。分类讨论一下:

  • 若 \(l\le a_p\le r\),我们找到 \([l,a_p],[a_p+1,r]\) 中较长的一段,那么较短的一段可以完全由较长的一段推出,因此我们可以舍弃较短的一段,然后继续向 \(p+1\) 递归。
  • 若 \(a_p<l\),那么可以转到 \(\text{solve}(p+1,l-a_p,r-a_p)\),然后相当于要把传回来的这个序列平移到 \([l,r]\) 的范围内。
  • 若 \(a_p>r\),类似地也可以转到 \(\text{solve}(p+1,a_p-r,a_p-l)\),然后翻转一下再平移到 \([l,r]\) 的范围内。

实现的时候可以用 \(\text{solve}(p,l,r,lp,d,\Delta)\) 表示把 \([l,r]\) 的答案填到 \(\text{ans}[lp\cdots lp+\Delta\times d-1]\) 上,\(\Delta=-1\) 则表示反着填。

解决了这个问题之后,区间查询也是简单的:把序列分成 \(B\) 块,对第 \(i\) 块预处理 \([0,V]\) 每个数填进去的答案 \(f(i,j)\),查询的时候先暴力跳散块,再利用 \(f\) 数组快速跳过整块。这样复杂度是 \(O(BV+\frac{nm}{B}+nB)\),不妨设 \(n,m\) 同阶,那么取 \(B=\frac{n}{\sqrt{V}}\) 就有复杂度 \(O(n\sqrt{V})\),空间复杂度也是 \(O(n\sqrt{V})\)。

由于散块暴力跳的过程实际上很快,实际实现的时候可能块长需要取大一点,也就是 \(B\) 取小一点。

//-DYUNQIAN -std=c++14 -O2 -Wall
#include<bits/stdc++.h>

#define ll long long

using namespace std;

inline int read(){
	int x=0,f=1;char c=getchar();
	for(;(c<'0'||c>'9');c=getchar()){if(c=='-')f=-1;}
	for(;(c>='0'&&c<='9');c=getchar())x=x*10+(c&15);
	return x*f;
}

const int N=1e5+5;
const int V=1e7;
const int B=75;

int ans[B+5][V+5],a[N],n,m,L[B+5],R[B+5],bl[N];

void solve(int id,int p,int tar,int l,int r,int st,int len,int d){
	if(p==tar+1){
		int p=st;
		for(int i=l;i<=r;i++)ans[id][p]=i,p+=d;
		return ;
	}
	if(a[p]<l){solve(id,p+1,tar,l-a[p],r-a[p],st,len,d);return ;}
	if(a[p]>r){solve(id,p+1,tar,a[p]-r,a[p]-l,st+(len-1)*d,len,-d);return ;}
	int Lp=a[p]-l,Rp=r-a[p];int pos=st+(a[p]-l)*d;
	if(Lp>Rp){
		solve(id,p+1,tar,0,a[p]-l,pos,Lp+1,-d);
		//[ pos , pos-(Lp+1)*d ] 
		for(int i=1;i<=Rp;i++)ans[id][pos+i*d]=ans[id][pos-i*d];
		//[ pos+d , pos+Rp*d ]
	}
	else{
		solve(id,p+1,tar,0,r-a[p],pos,Rp+1,d);
		for(int i=1;i<=Lp;i++)ans[id][pos-i*d]=ans[id][pos+i*d];
	}
}

int query(int l,int r,int v){
	if(bl[l]==bl[r]){
		for(int i=l;i<=r;i++)v=abs(v-a[i]);
		return v;
	}
	for(int i=l;i<=R[bl[l]];i++)v=abs(v-a[i]);
	for(int i=bl[l]+1;i<=bl[r]-1;i++)v=ans[i][v];
	for(int i=L[bl[r]];i<=r;i++)v=abs(v-a[i]);
	return v;
}

signed main(void){

	n=read(),m=read();int lans=0;
	for(int i=1;i<=n;i++)a[i]=read();
	int S=(int)(n/B)+10;
	memset(L,63,sizeof(L));
	for(int i=1;i<=n;i++)bl[i]=(i-1)/S+1,L[bl[i]]=min(L[bl[i]],i),R[bl[i]]=i;
	for(int i=1;i<=bl[n];i++)solve(i,L[i],R[i],0,V,0,V+1,1);
	for(int i=1;i<=m;i++){
		int l=read(),r=read(),v=read();
		l^=lans,r^=lans,v^=lans;
		cout<<(lans=query(l,r,v))<<'\n';
	}

	return 0;
}

标签:洛谷,lp,int,P8264,Ynoi,pos,solve,Lp,text
From: https://www.cnblogs.com/YunQianQwQ/p/17496681.html

相关文章

  • CF896E/洛谷 P4117 [Ynoi2018]五彩斑斓的世界/Welcome home, Chtholly
    分块。我们先来考虑修改对整块的影响。记值域为\(V=10^5\)。考虑对每一块维护\(V\)个集合\(S_1,S_2,\cdots,S_V\),第\(i\)个集合\(S_i\)维护了区间中所有\(=i\)的元素的一些信息,并维护区间的最大值\(m\),对于一次操作\(x\):若\(m\le2x\),我们暴力对每个\(i\in[x+1,......
  • [Ynoi2019 模拟赛] Yuno loves sqrt technology I
    题目Link分块,首先预处理所有整块之间的答案,这部分用类似莫队二离的手法可以改成\(O(n)\)次插入和\(O(n\sqrt{n})\)查询,然后根号平衡一手做到\(O(n\sqrt{n})\);空间自然也是能线性的。当然更直白的说法是,直接预处理\(f(i,j)\)表示前\(i\)块中\(>j\)的元素个数。然后考......
  • 洛谷 P8179 Tyres
    滴叉题/se/se题意直接复制了有\(n\)套轮胎,滴叉需要用这些轮胎跑\(m\)圈。使用第\(i\)套轮胎跑的第\(j\)圈(对每套轮胎单独计数)需要\(a_i+b_i(j-1)^2\)秒。滴叉需要进入维修站来更换轮胎,所消耗的时间为\(t\)秒。特别地,滴叉使用的第一套轮胎不需要进站更换。你需......
  • 洛谷P1578 奶牛浴场
    题目大意又是农夫约翰有一个$L\timesW$的矩阵,中间有$n$个障碍,你要框出面积最大的一块长方形,其中不能包含障碍。数据范围对于所有数据,\(0\len\le5\times10^3,1\leL,W\le3\times10^4\)题解首先,可以根据极大化思想设计一个基本算法:枚举上下左右四个边界......
  • 洛谷 P6821 [PA2012]Tanie linie
    洛谷传送门考虑恰好选\(k\)个子段怎么做。设恰好选\(i\)个子段的和最大值为\(h_k\)。可以得到\(h_{i+1}-h_i\leh_i-h_{i-1}\),因为\(h_i\toh_{i+1}\)的过程就是多选一个子段,贡献肯定不如上一次选即\(h_{i-1}\toh_i\)大。如果它不成立,那我们可以交换......
  • 洛谷P5322 [BJOI2019] 排兵布阵
    题目大意有s名对手,n座城堡,你有m名士兵如果一名玩家向第\(i\)座城堡派遣的士兵数严格大于对手派遣士兵数的两倍,那么这名玩家就占领了这座城堡,获得\(i\)分。求最大得分数据范围对于\(10\%\)的数据:\(s=1,n\le3,m\le10\)对于\(20\%\)的数据:\(s=1,n\le10,m\le1......
  • 【若归】 【LGR-142-Div.4】洛谷入门赛 #13赛后反思
    比赛链接:【LGR-142-Div.4】洛谷入门赛#13rk288,比前几次差(可能是因为rated?)A十年OI一场空,不开longlong见祖宗#include<bits/stdc++.h>usingnamespacestd;intmain(){ longlongintn; cin>>n; cout<<"8"<<12*(n-2)<<""<<6*(n-......
  • 洛谷 P6003 总结
    题目:洛谷P6003链接:洛谷,逐月题意有一个人欠了别人\(n\)单位牛奶,每一天他会还\(y=\max(m,\frac{n-g}{x})\)单位,\(g\)为之前还的牛奶,请求出最大的\(x\)使得这个人在\(k\)天后能换至少\(k\)单位牛奶。\(1\len,m,k\le10^{12},km<n\)。思路暴力......
  • 【LGR-141-Div.2】洛谷 6 月月赛 I (前两题)
    T1:金盏花传送门直接暴力枚举前6位的值即可,记得开longlong#include<bits/stdc++.h>usingnamespacestd;#defineintlonglonginty,z,ans=1e18;signedmain(){ scanf("%lld%lld",&y,&z); for(inti=100000;i<=999999;i++){ intx=i*1000000+y; ans=min......
  • 洛谷P1587 [NOI2016] 循环之美
    原文链接:[sol]P1587[NOI2016]循环之美-icyM3tra'sBlog此为备份。题目传送门0.前言提供一种式子较为简洁且不算难写的做法。以及介绍一种较为优秀的dp版杜教筛实现。1.式子推导我们知道纯循环小数一定可以写成分母形如\(k^a-1\)的分数。因此约分后的分母一定......