五一集训Day2

五一集训Day2

A

转化后的题意是维护带删除线性基,2e7个操作(插入和删除),并在每次操作完后求线性基的大小。

我们把每个添加操作的数的存在时间区间求出来,题意保证了每个数不会同时有两个。在插入的时候同时维护线性基上每一位的删除时间Ti,使得Ti由高往低递减。这样在删除的时候只会删除最低位的,不会造成影响,所以直接删。具体方法是插入一个数的时候,如果当前位有值(ai)且Ti<Tnow,把当前的值和时间都换成这一位的,然后正常构造。这样仍能满足线性基的性质(最小,能表示出所有数)

这个trick挺实用的,贴一下代码。

namespace solve3{
	
	    int a[32],T[32];int tt;
	    inline void insert(int x,int t){
	        for(int i=31;i>=0;--i){
	            if((x>>i)&1){
	                if(a[i]==0){
	                    a[i]=x;
	                    T[i]=t;
	                    tt++;
	                    break;
	                }else{
	                	if(t>T[i]){
	                		swap(a[i],x);
	                		swap(t,T[i]);
						}
					} 
	                x^=a[i];
	            }
	        }
	    }
	    void del(int x){
	    	for(int i=31;i>=0;--i){
	    		if(T[i]==x){
	    			a[i]=T[i]=0,tt--;break;
				}
			}
		}
	    inline int getans(){
	        return tt;
	    }
	unordered_map<int,int>mp;int las[N];
	int p[N],w[N];
	void solve(){
		FOR(i,1,q){
			int opt=read(),x=read();p[i]=opt;w[i]=x;
        	if(opt^2){
	            las[i]=q+1;
	            mp[x]=i;
	        }
	        else{
	        	las[mp[x]]=i;
	        }
	    }
	 	FOR(i,1,q){
	 		if(p[i]^2){
	 			insert(w[i],las[i]);
			 }else del(i);
			 ans^=(1<<(n-getans()));
			 //printf("%d
",(1<<(n-lb.getans())));
		}
        print(ans);
	}
}

C

[ans(l,r)=prod_{ ext{p is a prime}}prod_{k>0}(P^k)^{f(p^k)-f(p^{k+1})} ]

[=prod_{ ext{p is a prime}}p^{sum_{k>0}k(f(p^k)-f(p^{k+1}))} ]

[=prod_{ ext{p is a prime}}p^{sum_{k>0}f(p^k)} ]

于是莫队可以(NM^{0.5}logW),考虑继续优化

首先预处理出每个数的大质数因子,莫队直接算

然后预处理每个(p^k)的倍数的前缀和,个数为(O(frac {sqrt w}{log w} ))

总复杂度为(O((N+M)frac {sqrt w}{log w}))

B

每次枚举一个不相交与当前集合的子集,令这个集合的元素值相等。我们从小到大枚举子集的值,显然这个值不超过每个元素上限的最小值。总复杂度(O(3^N*N)),FWT可以做到(O(2^N*N^3)),不是很会...

原文地址:https://www.cnblogs.com/lcyfrog/p/12824797.html