首页 > 其他分享 >231116校内赛

231116校内赛

时间:2023-11-16 19:34:41浏览次数:26  
标签:231116 qmx 校内 int st -- qmn define

T1 玩具序列

很简单的一道T1但某人的 st 表炸成灰灰了

首先明确我们是需要维护区间最大和最小,那么容易想到的有以下几个:线段树,st 表,单调队列

对于线段树和 st 表而言 \(3e6\) 的数据都有点卡时间

st 表还卡空间,而且预处理慢的离谱,虽然最后卡过去了

如此看来单调队列则是不二之选,我们用双指针挪移了之后便维护一下两个单调队列

在队头出队时记得答案的更改是按队头原序列上的下一个点算而非是新的队头

#include<bits/stdc++.h>
#define N 3000010
using namespace std;
int n,k,mx,mn = 1,a[N],qmx[N],qmn[N],hmx = 1,hmn = 1,tmx,tmn;
signed main(){
	freopen("sequence.in","r",stdin);
	freopen("sequence.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>k>>n;
	for(int i = 1;i<=n;i++)
		cin>>a[i];
	for(int i = 1;i<=n;i++){
		while(hmx<=tmx&&a[qmx[tmx]]<a[i]) tmx--;		
		while(hmn<=tmn&&a[qmn[tmn]]>a[i]) tmn--;
		qmx[++tmx] = i;
		qmn[++tmn] = i;
		while(a[qmx[hmx]]-a[qmn[hmn]]>k){
			if(qmx[hmx]<=qmn[hmn]) mn = qmx[hmx]+1,hmx++;
			else mn = qmn[hmn]+1,hmn++;
		}
		mx = max(mx,i-mn+1);
	}
	cout<<mx;
	return 0;
}

T2 排列

首先我们可以得到 $f(x,y) = f(x/d,y/d) $

所以我们可以只考虑二者互质的情况

还可以发现 \(x+y\) 的值不变,所以只有 \(x+y\) 为 \(2\) 的倍数的情况值才不为 \(0\)

所以只考虑 \(x,y\) 同为奇数的情况

设 \(x>y\) ,所以 \(f(x,y) = f(2y,x-y)+1\)

可以发现,\(x-y,2y\) 都是偶数

所以同时除二

\(f(x,y) = f(y,\frac {x-y}{2})+1\)

每次除二之后 \(gcd(\frac{x-y}{2},y) = 1\)

所以当 \(x+y\) 为二的整数次幂时 \(\log_2(x+y)\) ,且只有这种情况有值

可以得出 \(f(x,y) = k\) 的个数有大约 \(k2^k\) 个

\(k\) 不超过 \(\log n\) 所以总数不超过 \(\mathcal O(n\log n)\) 个

现在我们就可以进一步简化这个问题,把他简化为一个二位偏序问题

#include<bits/stdc++.h>
#define N 3000010
#define pii pair<int,int>
#define fi first
#define se second
using namespace std;
struct node{
	int l,r,id;
}q[N];
int n,m,a[N],pos[N],ans[N],t[N];
vector<pii>g[N];
bool cmp(node x,node y){
	return x.l<y.l;
}
void add(int x,int v){
	for(;x<=n;x+=(x&-x))
		t[x]+=v;
}
int query(int x){
	int res = 0;
	for(;x;x-=(x&-x))
		res+=t[x];
	return res;
}
int main(){
	freopen("perm.in","r",stdin);
	freopen("perm.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n;
	for(int i = 1;i<=n;i++){
		cin>>a[i];
		pos[a[i]] = i;
	}
	int sum = 4,val = 2;
	while(sum<=2*n){
		for(int i = 1;i*2<sum;i++){
			int x = i,y = sum-i;
			if(y>n) continue;
			if(__gcd(x,y)!=1) continue;
			for(int j = 1;j*y<=n;j++){
				int l = pos[j*x],r = pos[j*y];
				if(l>r) swap(l,r);
				g[l].emplace_back(r,val);
			}
		}
		sum<<=1;
		val++;
	}
	cin>>m;
	for(int i = 1;i<=m;i++){
		cin>>q[i].l>>q[i].r;
		q[i].id = i;
	}
	sort(q+1,q+m+1,cmp);
	int t = n;
	for(int i = m;i>=1;i--){
		while(t>=q[i].l){
			for(pii j: g[t])
				add(j.fi,j.se);
			t--;
		}
		ans[q[i].id] = query(q[i].r);
	}
	for(int i = 1;i<=m;i++)
		cout<<ans[i]<<"\n";
	return 0;
}

标签:231116,qmx,校内,int,st,--,qmn,define
From: https://www.cnblogs.com/cztq/p/17837093.html

相关文章

  • 20231116
    今天是个大晴天,18摄氏度,不知道为什么一堆人穿冬季校服。看来还是说明体锻太少了,大家都虚了。哦,上文和下文没有关系。下文是昨天总结出来的,也是也不是,是上高中后总结出来的。形式主义其实是一群傻逼满脑子都是他们认为的理想化,我觉得这种人脑子相当于是被格式化了。也是,生活中接......
  • 231114校内模拟赛
    T1平凡原题链接首先,我们容易发现直接求\(A\)不是最小的子序列的排列的个数有些困难#include<bits/stdc++.h>#definemod998244353#defineN1000010#defineintlonglongusingnamespacestd;intn,k,a[N],t[N],vis[N],ans,all,pos;signedmain(){ freopen("ordina......
  • 231110校内赛
    T1拼图首先一点需要明白的是横向移动和纵向移动并无关联接着我们可以花费\(\mathcalO(k)\)的时间来枚举左右最长长度和上下最长长度我们只需要在两次循环时分别排个序,左右和上下分别排序对于左右移动时,我们枚举每一个点在最左或最右的情况,计算出当前最小的长度,并更新最小......
  • 231108校内赛
    T1最大公约数数据极水,啥都能过第一种方法,暴力剪枝,直接飞过,\(\mathcalO(N^2\logn)\)过\(30\)万不解释玛德有人在提交时不写输出直接爆零#include<bits/stdc++.h>#defineN300010usingnamespacestd;intn,k,ans,a[N];intgcd(inta,intb){ returnb==0?a:gcd(b,......
  • 231106校内赛
    T1点分树很简单的思路,暴力跳父亲,就是去除当前数最后一个\(1\)再计算当前子树的答案,记得减去已经算过的子树的答案#include<bits/stdc++.h>#defineN10000010#definemod998244353#defineintlonglongusingnamespacestd;intn,q,ans,fac[N],inv[N];vector<int>g;......
  • 231105校内赛
    T1构造题没啥好说的,大样例一眼出规律#include<bits/stdc++.h>#defineN310usingnamespacestd;intn,l[N][N],r[N][N],a[N][N];intmain(){ freopen("squ.in","r",stdin); freopen("squ.out","w",stdout); ios::sync_with_stdio(0......
  • 231101校内赛
    T1茵蒂克丝模拟题,用一个栈模拟就完了,挺简单的有人没看见是非负数#include<bits/stdc++.h>#definepiipair<int,int>#definefifirst#definesesecond#defineN1000010usingnamespacestd;intn,k,a[N],ans[N],cnt,top,tot;piistk[N],b[N];boolcmp(piix,piiy){......
  • 231030校内赛
    T1新的阶乘有三种做法,第一种也就是我写的这种容易被评测机波动坑,复杂度玄学考虑处理出每个数的质因数,然后就暴力除每个数的质因数的种类次非常的简单,也容易被卡第二种是与第一种差距不大,就是在线性筛中处理出质因数之后,再对每个数除以线筛中处理的质因数,将它的答案加到除数和......
  • 231023校内赛
    T1区间题解很容易想到的一点是如果\(k\)足够大,那么把区间单独放到一个组里总比多个区间在一个组优对于多个区间来说,区间之间如果两两不包含的话这道题会是比较好做的就可以注意到如果一个大区间包含了一个小区间,那么大区间要么单独一组,要么和小区间同一组,这样会是比较优的......
  • 231019校内赛
    T1机器人题解傻逼题,但是有人\(90\)分一开始十分想直接暴力\(2^n\)判断每一步选不选求出所有可能性但是会发现它有制约关系有些步走了之后,有些就必须走了所以需要用一个数组记录当前位置走没走过,或者是不是障碍注意走没走过不能直接赋值\(1,0\)因为回溯时会直接将前......