首页 > 其他分享 >abc365_E

abc365_E

时间:2024-09-06 22:15:29浏览次数:4  
标签:sum long while oplus abc365 位为

abc365 E-Xor Sigma Problem

思路

本题首先可以想到用前缀异或和维护,我们记作\(b_i=a_1\oplus a_2 \oplus ··· \oplus a_i\),所求的式子就变成了\(\sum^{n-2}_{i=0}\sum^n_{j=i+2}b_i\oplus b_j\),直接求是\(O(n^2)\)的,考虑如何快速求出\(\sum^{x-1}_{i=0}b_i\oplus b_x\)

因为这是位运算,所以我们不难想到按位考虑,我们记\(g_{i,j}\)为当前考虑范围内第\(q\)位为\(p(0,1)\)的个数,我们动态维护\(b1...i\)总的\(g_{q,p}\),当我们枚举到第\(b_{i+1}\)时,如果此时的第\(j\)位为\(1\),那么\(g_{i,0}\)将是有贡献的,反之同理

代码

来自Andy1262

#include<bits/stdc++.h>
using namespace std;
inline long long read(){
	long long ans=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-') f=-f;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		ans=(ans<<3)+(ans<<1)+c-48;
		c=getchar();
	}
	return ans*f;
} 
void write(long long x){
	if(x<0){
		putchar('-');
		x=-x;
	}
	if(x<10) putchar(x+48);
	else{
		write(x/10);
		putchar(x%10+48);
	}
}
long long n;
long long a[200005],b[200005];
long long g[35][2];
long long ans;
signed main(){
	n=read();
	for(long long i=1;i<=n;i++){
		a[i]=read();
		b[i]=a[i]^b[i-1];
	}
	for(long long i=0;i<=28;i++) g[i][0]++;//将b[0]加进去 
	for(long long i=1;i<=n;i++){
		for(long long j=0;j<=28;j++){
			ans+=g[j][bool((b[i])&(1<<j))^1]*(1<<j);//按位统计答案 
		}
		for(long long j=0;j<=28;j++){
			g[j][bool((b[i])&(1<<j))]++;//按位更新g数组 
		}
	}
	for(long long i=1;i<=n;i++) ans-=a[i];//除去长度为1的区间 
	write(ans);
	return 0;
}

更妙的题解

标签:sum,long,while,oplus,abc365,位为
From: https://www.cnblogs.com/mgnisme/p/18401145

相关文章

  • 题解:AT_abc365_c [ABC365C] Transportation Expenses
    题意已知\[\sum_{i=1}^{n}\min(x,a_i)\lem\]问\(x\)最大为多少。思路由于答案具有单调性,所以考虑二分答案。但是有一点要注意,当\(\sum_{i=1}^{n}a_i\lem\)时,应该输出infinite。因为此时的\(x\)可以为任意一个数。ACcode#include<bits/stdc++.h>#defineintun......
  • 题解:AT_abc365_d [ABC365D] AtCoder Janken 3
    D-AtCoderJanken3题解题意:高桥和青木要玩石头剪刀布,给你一个长度为\(n\)的字符串\(s\),\(s\)表示青木在第\(i\)局游戏中的动作(R表示石头,P表示布,S表示剪刀。)。高桥不可以在任何一局中输给青木(即:高桥和青木只可以平局或高桥赢青木),且高桥第\(i\)局出的和第\(i-1\)局......
  • 【题解】ABC365(A~E)
    前四题30min切,然后T5死磕70min+几发小唐错,距离比赛结束还有16s交最后一发,AC了。目录A.LeapYear题目描述思路代码B.SecondBest题目描述思路代码C.TransportationExpenses题目描述思路代码D.AtCoderJanken3题目描述思路代码E.XorSigmaProblem题目描述思路代码A.Lea......
  • ABC365F Takahashi on Grid 题解
    ##题目大意有一个网格图,对于$i=1,2,\dotsn$,第$i$列的$[L_i,U_i]$上的单元格是可到达的,形如下面这张图。![](https://img.atcoder.jp/abc365/4d07a40c98eda33ee86b773e564681c7.png)图中对于$i=1,2,\dots7$,$[L_i,U_i]$分别为:```15331311142435```......
  • ABC365
    Alink题目已经说的很明白了,判断即可。点击查看代码#include<bits/stdc++.h>usingnamespacestd;inty;signedmain(){ cin>>y; if(y%4!=0)cout<<365; elseif(y%4==0&&y%100!=0)cout<<366; elseif(y%100==0&&y%400!......
  • ABC365
    A.LeapYear模拟代码实现importcalendary=int(input())ifcalendar.isleap(y):print(366)else:print(365)B.SecondBest模拟代码实现n=int(input())a=list(map(int,input().split()))print(a.index(sorted(a)[-2])+1)C.TransportationEx......
  • ABC365(A-D)未补
    A-LeapYear(模拟)题意:给定一个数字n,如果n不是4的倍数,输出365;如果n是4的倍数但不是100的倍数,输出366;如果n是100的倍数但不是400的倍数,输出365;如果n是400的倍数,输出366分析:模拟题目即可代码:#include<bits/stdc++.h>usingnamespacestd;intmain(){intn;cin>>n;......