G. WiFi Password(线段树)

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了G. WiFi Password(线段树)相关的知识,希望对你有一定的参考价值。

G. WiFi Password(线段树)

容易发现可以尺取,然后需要 一个支持单点修改的数据结构,显然线段树可以。然后没了。

// Problem: G. WiFi Password
// Contest: Codeforces - 2017 ACM Jordanian Collegiate Programming Contest
// URL: https://codeforces.ml/gym/101608/problem/G
// Memory Limit: 256 MB
// Time Limit: 2000 ms
// Date: 2021-07-31 10:07:58
// --------by Herio--------

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull; 
const int N=1e5+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a,b) memset(a,b,sizeof a)
#define PII pair<int,int>
#define fi first
#define se second
#define pb emplace_back
#define SZ(a) (int)a.size()
#define ios ios::sync_with_stdio(false),cin.tie(0) 
void Print(int *a,int n){
	for(int i=1;i<n;i++)
		printf("%d ",a[i]);
	printf("%d\\n",a[n]); 
}
//区间修改 区间求和
#define il inline 
#define lx x<<1
#define rx x<<1|1
#define len(x) (a[x].r-a[x].l+1)
struct node{
	int l,r,s[20];
}a[N<<2];
il void re(int x){
	for(int i=0;i<20;i++) a[x].s[i]=a[lx].s[i]+a[rx].s[i];
}
il void ptg(int x,int y,int op){
	for(int i=0;i<20;i++)
		if(y>>i&1){
			if(op) a[x].s[i]++;
			else a[x].s[i]--;
		}
}
il void bud(int x,int l,int r){
	a[x].l=l,a[x].r=r;for(int i=0;i<20;i++) a[x].s[i]=0;
	if(l==r){
		return;
	}
	int m=(l+r)>>1;bud(lx,l,m),bud(rx,m+1,r);
	re(x);
}
il void upd(int x,int p,int val,int op){
	if(a[x].l==a[x].r) {
		ptg(x,val,op);return;
	}
	int m=(a[x].l+a[x].r)>>1;
	if(p<=m) upd(lx,p,val,op);
	else upd(rx,p,val,op);
	re(x);
}
il int que(int x,int l,int r){
	if(a[x].l>=l&&a[x].r<=r){
		int ans=0;
		for(int i=0;i<20;i++)
			ans+=(a[x].s[i]>=1)*(1<<i);
		return ans;
	}
	int m=(a[x].l+a[x].r)>>1;int ans=0;
	if(l<=m) ans|=que(lx,l,r);
	if(r>m) ans|=que(rx,l,r);
	return ans;
}
int b[N];
int main(){
	freopen("wifi.in","r",stdin);
	int T;scanf("%d",&T);
	while(T--){
		int n,m;scanf("%d%d",&n,&m);
		for(int i=1;i<=n;i++) scanf("%d",&b[i]);
		bud(1,1,n);int ans=0;
		for(int i=1,l=1;i<=n;i++){
			upd(1,i,b[i],1);
			while(l<=i&&que(1,l,i)>m) upd(1,l,b[i],0),l++;
			ans=max(ans,i-l+1);
		}
		printf("%d\\n",ans);
	}
	return 0;
}

以上是关于G. WiFi Password(线段树)的主要内容,如果未能解决你的问题,请参考以下文章

G. Matematical Transformation(树链剖分+线段树)

G. Matematical Transformation(树链剖分+线段树)

G. Matematical Transformation(树链剖分+线段树)

ACM-ICPC 2018 南京赛区网络预赛 G. Lpl and Energy-saving Lamps (弱线段树)

2018 Arab Collegiate Programming Contest (ACPC 2018) G. Greatest Chicken Dish (线段树+GCD)

(WAWAWAWAWAWAW) G. Periodic RMQ Problem