思路:把序列轉換成一顆n+1個節點n條邊邊權分別為a1 a2 ....an的樹(鏈),每乙個區間相當於樹上的一條路徑,那麼問題就轉換為求樹上任意兩點間路徑的異或和,令dis[i]為根節點到i的路徑異或和,對於兩個點u和v,dis[u]^dis[v]對答案的貢獻為
顯然,第i位為0和第i位為1 的兩個數異或才會對答案有貢獻,另cnt[i]為在第i位為1的數量,那麼在第i位異或為1的方案數就是
#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;
typedef long long ll;
#define m(a,b) memset(a,b,sizeof(a))
#define pb push_back
const int maxn = 100000+10;
const ll mod = 1000000007;
struct edge e[maxn<<1];
int head[maxn],tot;
ll dis[maxn],cnt[maxn];
ll p[40];
void addedge(int u,int v,ll val)
void dfs(int u)
dfs(v);
}return ;
}int main()
int n;
scanf("%d",&n);
tot=0;
for (int i=1;i<=n+1;++i)
for (int i=1;i<=n;++i)
dis[1]=0;
dfs(1);
ll ans=0;
++n;
for (int i=0;i<32;++i)
printf("%lld\n",ans);
return 0;
}
P3917 異或序列
p3917 異或序列 暴力字首異或列舉每乙個區間,再求和,60分。正解 按每一位來做 對於區間 l,r 如果它對答案有貢獻,區間中1的個數一定是奇數,可以按每一位取 1 1 include2 include3 include4 include5 include6 include7 include8 ...
二進位制亂搞 Luogu3917 異或序列
題面 luogu3917 我的做法好像比較傻。看到這種題首先想到字首。首先字首xor是不是很資辭?我的做法呢就是先把所有數按二進位制位拆開,然後每一位都做兩次字首。首先對數字做一次字首xor,記到 s 陣列裡,再對s陣列做一次字首和,記到ss 裡。然後我們可以對於每一位列舉起始位置i,然後從i開始向...
問題 A 異或序列
時間限制 1 sec 記憶體限制 128 mb 提交 188 解決 86 提交 狀態 討論版 命題人 admin 題目描述 已知乙個長度為n的整數數列a1,a2,an,給定查詢引數l r,問在al,al 1,ar區間內,有多少子串行滿足異或和等於k。也就是說,對於所有的x,y l x y r 滿足a...