首页 > 其他分享 >CF-938(C-E)

CF-938(C-E)

时间:2024-04-18 20:45:07浏览次数:23  
标签:cin int rep CF 取反 938 ans ta

CF-938

C

没啥好分析的,就记录一下我因为没有清空s[n+1]、上取整写成了下取整卡了一个多小时(╬▔皿▔)╯

const int N=2e5+5;
int a[N],p[N],s[N];
void solve(){
	int n,k;cin>>n>>k;
	int sum=0;
	rep(i,1,n){
		cin>>a[i];
		p[i]=p[i-1]+a[i];
	}
	if(p[n]<=k){
		cout<<n<<endl;
		return;
	}
	s[n+1]=0;//
	per(i,n,1){
		s[i]=s[i+1]+a[i];
	}
	int ans=0;
	int l=0,r=n,mid;
	while(r-l>1){
		mid=l+r>>1;
		if(p[mid]<(k+1)/2) l=mid;
		else r=mid;
	}
	//r为第一个p[i]>=(k+1)/2的下标 
	if(p[r]>(k+1)/2) ans+=r-1;
	else if(p[r]==(k+1)/2) ans+=r;
	l=1,r=n+1;
	while(r-l>1){
		mid=l+r>>1;
		if(s[mid]<(k+1)/2) r=mid;
		else l=mid;
	}
    //l为第一个p[i]>=(k+1)/2的下标 
	if(s[l]>k/2) ans+=n-l;
	else if(s[l]==k/2) ans+=n-l+1;
	cout<<ans<<endl;
}

D

可惜我赛前不久还做过滑动窗口的题,赛时却一直调不出来 /_ \

分析

就是在数组a中找有多少个长度为m的子段,满足子段内元素与b数组的元素至少有k个相同,我们可以枚举长度为m的子段,用桶数组维护当前子段的元素种类数,更新就是当长度大于m时,减去子段第一个元素的种类数,再判断一下此时该元素的种类数是否小于b数组中的种类数,是的话匹配数now--

代码

const int N=2e5+5,M=1e6+5;
int a[N],b[N],tb[M],ta[M];
void solve(){
	int n,m,k;cin>>n>>m>>k;
	rep(i,1,n){
		cin>>a[i];
	}
	rep(i,1,m){
		cin>>b[i];
		tb[b[i]]++;
	}
	int j=0,now=0,ans=0;
	rep(i,1,n){
		ta[a[i]]++;//对于每个新元素,将其加入桶中
		if(ta[a[i]]<=tb[a[i]]) now++;
		j=i-m;
		if(j>=1){//子段长度大于m时,删除第一个元素的种类数
			ta[a[j]]--;
			if(ta[a[j]]<tb[a[j]]) now--;//若相等则说明删除该元素对匹配数无影响		
		}
		if(j>=0&&now>=k) ans++;
	}
    //清空桶数组,用memset会t
	rep(i,1,n) ta[a[i]]=0;
	rep(i,1,m) tb[b[i]]=0;
 	cout<<ans<<endl;
}

E

这题让我想起了之前还没补的一道题 3492: 王阿姨处理信号,也是01字符串,也需要做区间处理……

知识点

利用异或差分数组进行区间取反

常用在只有01两种元素的序列中

int n;string s;cin>>n>>s;
	s=' '+s;
	int l,r;cin>>l>>r;
	//将区间[l,r]取反
	d[l]^=1,d[r+1]^=1;
	rep(i,1,n){
		d[i]^=d[i-1];
		cout<<((s[i]-'0')^d[i]);
	}

分析

从大到小枚举取反区间的长度k,若遇到s[i]=0,则对[i,i+k-1]进行区间取反,若有k合法就跳出

代码

const int N=1e4+5;
int d[N];
void solve(){
	int n;string s;cin>>n>>s;
	s=' '+s;
	per(k,n,1){//枚举取反区间 
		bool f=1;
		rep(i,1,n) d[i]=0;//异或差分数组,d[l]=d[r]=1表示[l,r-1]均取反 		
		rep(i,1,n){
			d[i]^=d[i-1];//类似差分数组做前缀和还原为当前数 
			int x=(s[i]-'0');
			//cout<<k<<" "<<i<<" "<<x<<endl; 
			if(x^d[i]==0){
			/*
			若x=d[i]=1,表示当前数此前已被取反为0,需要再取反
			若x=d[i]=0,表示当前数原本就是0,需要取反 
			*/
				if(i+k-1>n){//若取反区间的终点大于n,由于已无法操作,故当前k不可行 
					f=0;
					break;
				} 
				d[i]^=1;
				d[i+k]^=1;
			} 
		}
		if(f){
			cout<<k<<endl;
			break;
		} 
	}
}

标签:cin,int,rep,CF,取反,938,ans,ta
From: https://www.cnblogs.com/mono-4/p/18144361

相关文章

  • CF1933D Turtle Tenacity: Continual Mods
    思路:此题其实很简单,不要被邪恶的出题人迷惑了双眼。此题判断有解一共有两种情况。通过题意可以知道将原数组排序后如果\(b_{1}\neb_{2}\),那么最后的结果一定\(\ne0\),这是第一种情况。第二种情况其实就是第一种情况的变形,在排序后\(b_{1}=b_{2}\)的情况下,如果\(b\)......
  • Winform项目中纯代码创建WCF服务
    接口:[ServiceContract(CallbackContract=typeof(IViewCallback),SessionMode=SessionMode.Required)]publicinterfaceIViewService{[OperationContract]voidServiceTest();}类:[ServiceBehavior(InstanceContextMode=......
  • at_cf17final_j Tree MST 题解
    题目链接点击打开链接题目解法还是挺有收获的题解法1完全图求\(mst\),首先应该考虑\(boruvka\)算法现在的问题转化成了求\(O(\logn)\)次每个点\(x\)到不在\(x\)的连通块中的点的最短边这个可以换根\(dp\)求子树内的是好求的,只要记录所有连通块的最小值和次小值......
  • CF81C Average Score 题解
    题目简述给定一个长度为$n$的序列,在其中取出$x$个数,构成一个数列$a$,剩下的$y$个数构成数列$b$。若第$i$个数在数列$a$中,$ans_i$等于$1$,否则等于$2$,请你给出一种方案使得两数列的平均数之和最大且$ans$的字典序最小.题目分析我们先考虑$x=y$的情况,在这种情......
  • [CF457A]Golden System
    CF457AGoldenSystem十分精妙的一道题,斐波那契数列和黄金比例\(\Phi\)的内在有着奇妙的联系。我们设\(x=\frac{\sqrt{5}+1}{2}\),则根据题目给出的规律,有\(x^2=x+1\)。下面我们通过列举,试图找出规律:\(x^0=1\)\(x^1=x\)\(x^2=x+1\)\(x^3=2x+1\)\(x^4=3x+2\)\(x^5=5x+3\)......
  • CF1939C
    题意有一个会重复k次的数组,每个人都可以那不超过t种礼物,礼物必须是顺序发的,不能第一个发给第二个,求最少的人的个数。首先每一个人都必须要取尽可能多的礼物,然后按这个模拟即可。那么我们就要搞出每一个点往后跳到那里。这个最容易想到的应该是主席树加二分,根据两只\(\log\)跑得......
  • CF1955H The Most Reckless Defense
    给敌人加血可以看成是减少防御塔的攻击力,那么一个塔对敌人能造成的最大伤害即为\(500\pir^2-3^r\),注意到\(r=12\)时已经小于\(0\)了,所以半径不会很大,又因为每个\(r\)只能选一次,所以有效的塔很少,考虑状压\(dp\)。具体地,我们设\(f_{i,S}\)表示前\(i\)个塔中,被选到的塔......
  • [BSidesCF 2019]Kookie
    [BSidesCF2019]Kookie提示我们使用admin账户登录,并且明示了当前存在一个cookie账户其密码为monster登录并抓包,可以观察到设置了一个Cookie,内容为username=cookie的键值对。显然这里Cookie中的键值对的值作为了服务端在用户通过账户密码登录之后再次访问时验证身份的凭证,将其......
  • CF154C Double Profiles 题解
    CF154CDoubleProfiles题解思路解析题目说的很明白,求有多少个无序点对\((i,j)\),使得与\(i\)直接相连的点集与直接与\(j\)相连的点集完全相等。我们想到如果直接判断每个\(i,j\)肯定会超时,所以我们想把每一个与任意一点直接相连的点集进行压缩,可以想到使用字符串哈希的......
  • CF1097F Alex and a TV Show 题解
    题目链接点击打开链接题目解法很牛的套路啊!看到集合并,且只要求奇偶性的问题,第一个想到\(bitset\)\(1,2,4\)操作都是好维护的,关键是第\(3\)个操作看到$\gcd$,首先想到莫反令\(c_{x,i}\)为集合\(x\)中数\(i\)的出现次数则\(c_{x,i}=\sum\limits_{i|j}\sum\limit......