[BZOJ5267]特工

一个套路题...但还是得写一下这个套路避免以后忘了

题目中的运算$f(i,j)=(i|j)\text^i$对单位二进制满足$f(0,0)=f(1,0)=f(1,1)=1,f(0,1)=0$

先考虑求正变换,即是求$b_i=\sum\limits_{j=0}^{n-1}\left[2|\text{bit}(f(i,j))\right]a_j$

用类似FWT的过程求$b$

假设我们已经对$l\leq i\leq mid$求出$b_i=\sum\limits_{j=l}^{mid}[2|\text{bit}(f(i,j))]a_j$,已经对$mid+1\leq i\leq r$求出$b_i=\sum\limits_{j=mid+1}^r[2|\text{bit}(f(i,j))]a_j$,现在我们想对$l\leq i\leq r$求$b_i=\sum\limits_{j=l}^r[2|\text{bit}(f(i,j))]a_j$

①对$l\leq i\leq mid$,$\sum\limits_{j=mid+1}^r[2|\text{bit}(f(i,j))]a_j=\sum\limits_{j=mid+1}^ra_j-b_{i+\frac{len}2}$(因为$b_{i+\frac{len}2}$的最高位是$f(1,1)=1$,我们要求的东西的最高位是$f(0,1)=0$,所以$\text{bit}(f(i,j))$奇偶性变化)

②对$mid+1\leq i\leq r$,$\sum\limits_{j=l}^{mid}[2|\text{bit}(f(i,j))]=b_{i-\frac{len}2}$(因为$b_{i-\frac{len}2}$的最高位是$f(0,0)=1$,我们要求的东西的最高位是$f(1,0)=1$,所以$\text{bit}(f(i,j))$奇偶性不变)

写成FWT的格式是$\begin{cases}a_{[0]}'=s_{[1]}-a_{[1]}+a_{[0]}\\a_{[1]}'=a_{[1]}+a_{[0]}\end{cases}$,立得逆变换$\begin{cases}a_{[0]}=\frac{a_{[1]}'+a_{[0]}'-s_{[1]}}2\\a_{[1]}=\frac{a_{[1]}'-a_{[0]}'+s_{[1]}}2\end{cases}$

这种类型的题目大部分可以这样推导出来

剩下一个小问题就是求$s_{[1]}$,一般题目中给的这个运算能让你快速求它,比如这道题中$s_{[1]}=b_{r}-b_{mid}$

时间复杂度$O(n\log_2n)$

#include<stdio.h>
typedef long long ll;
#define NUM(x) ('0'<=x&&x<='9')
char c[40000010];
int ns;
inline ll rd(){
	while(!NUM(c[ns]))ns++;
	ll x=0;
	while(NUM(c[ns]))x=(x<<3)+(x<<1)+c[ns++]-'0';
	return x;
}
ll a[1048576];
int n;
void trans(ll*a){
	int i,j,k;
	ll s,u,v;
	for(i=n;i>1;i>>=1){
		for(j=0;j<n;j+=i){
			s=a[j+i-1]-a[j+i/2-1];
			for(k=0;k<i>>1;k++){
				u=a[j+k];
				v=a[i/2+j+k];
				a[j+k]=(u+v-s)/2;
				a[i/2+j+k]=(-u+v+s)/2;
			}
		}
	}
}
int main(){
	c[fread(c,1,40000010,stdin)]=0;
	int i;
	n=rd();
	for(i=0;i<n;i++)a[i]=rd();
	trans(a);
	for(i=0;i<n;i++)printf("%lld ",a[i]);
}

转载于:https://www.cnblogs.com/jefflyy/p/9384868.html

Olllll类似js解密 alert("hello world"); 加密如下: Olllll="(";OOOlll=")";OOOOll=" ";OOllll="x";OOOOOl="r";OOOOOOOll="S";OOOOOO="i";OOOOlOOll="t";OOOOOOO="n";OOOOOlll="i";OOOOOOOO="g";lllOllll="o";OOOOOOll="t";OOOOllll="o";OOOlllll="n";llllOlll="d";lllllOll="e";llOlllll="C";lllllOOl="x";llllOOll=")}";lllOOlll="C";llOOllll="h";llllllOl="(";lOOlllll="a";LOOOllll="r";lllOOOll="n";llOOOlll="f";lOOOllll="u";llllOOOl="c";OOllllll="f";llOOOOll=".";lllOOOOl=" l = ";lOOOOlll="r";lOOOOOll="o";llOOOOOl="m";lOOOOOOl="{r";llOOOOOOl="e";lOlOOOOOl="t";lOOlOOOOl="u";lOOOlOOOl="r";lOOOOlOOl="n";lOOOOOlOl="v";lOOOOOOll="a";lOOOOOLll="r";eval(lOOOOOlOl+lOOOOOOll+lOOOOOLll+lllOOOOl+llOOOlll+lOOOllll+lllOOOll+llllOOOl+OOOOOOll+OOOOOlll+OOOOllll+OOOlllll+Olllll+OOllll+OOOlll+lOOOOOOl+llOOOOOOl+lOlOOOOOl+lOOlOOOOl+lOOOlOOOl+lOOOOlOOl+OOOOll+OOOOOOOll+OOOOlOOll+OOOOOl+OOOOOO+OOOOOOO+OOOOOOOO+llOOOOll+OOllllll+lOOOOlll+lOOOOOll+llOOOOOl+lllOOlll+llOOllll+lOOlllll+LOOOllll+llOlllll+lllOllll+llllOlll+lllllOll+llllllOl+lllllOOl+llllOOll);eval(l(79)+l(61)+l(102)+l(117)+l(110)+l(99)+l(116)+l(105)+l(111)+l(110)+l(40)+l(109)+l(41)+l(123)+l(114)+l(101)+l(116)+l(117)+l(114)+l(110)+l(32)+l(83)+l(116)+l(114)+l(105)+l(110)+l(103)+l(46)+l(102)+l(114)+l(111)+l(109)+l(67)+l(104)+l(97)+l(114)+l(67)+l(111)+l(100)+l(101)+l(40)+l(77)+l(97)+l(116)+l(104)+l(46)+l(102)+l(108)+l(111)+l(111)+l(114)+l(40)+l(109)+l(47)+l(49)+l(48)+l(48)+l(48)+l(48)+l(41)+l(47)+l(57)+l(57)+l(41)+l(59)+l(125));eval(""+O(96030093)+O(106926335)+O(99999154)+O(112867378)+O(114849703)+O(39605038)+O(33668093)+O(102969103)+O(99998079)+O(106920773)+O(106923469)+O(109894686)+O(31683141)+O(117813559)+O(109892929)+O(112860509)+O(106927645)+O(99003254)+O(33667386)+O(40590980));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值