求助 WA 4个点
查看原帖
求助 WA 4个点
367387
cainiaoshanglu楼主2024/9/9 16:08

rt.

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <random>
#include <ctime>
#include <map>
#include <queue>
#define int long long
using namespace std;

const int md=1e9+7;
void read(int &x){
	x=0;
	int f=1;
	char c=getchar();
	while(!('0'<=c && c<='9')){
		if(c=='-'){
			f=-1;
		}
		c=getchar();
	} 
	while('0'<=c && c<='9'){
		x=(x<<3)+(x<<1)+(c^48);
		c=getchar();
	}
	x*=f;
}
int n,k,a[100010],b[100010],cnt=0;
map<vector<int>,int> mp;
map<int,int> diff[100010];
pair<int,int> ps[100010];
int getlw(int l,int r,int k){
	if(l==-1){
		return 0;
	}
	return __builtin_popcount(l&((1ll<<k)-(1ll<<__lg(l^r))))+1;
}
vector<int> gethsh(){
	vector<int> res;
	for(int i=2;i<=n;i++){
		res.push_back(b[i]-b[i-1]);
	}
	return res;
}
signed main(){
	read(n);
	read(k);
	for(int i=1;i<=n;i++){
		read(a[i]);
	}
	for(int i=0;i<=min(60ll,k);i++){
		int mn=4e18;
		for(int j=1;j<=n;j++){
			ps[j]=make_pair(a[j]&((1ll<<i)-1),j);
			mn=min(mn,b[j]=a[j]>>i);
		}
		sort(ps+1,ps+n+1);
		ps[0]=make_pair(-1ll,0ll);
		ps[n+1]=make_pair((1ll<<i)-1,0ll);
		for(int j=0;j<=n;j++){
			if(ps[j].second){
				mn=min(mn,--b[ps[j].second]);
			}
			if(mn<0){
				break;
			}
			if(ps[j].first!=ps[j+1].first){
				auto h=gethsh();
				if(mp.find(h)==mp.end()){
					mp[h]=++cnt;
				}
				int cur=mp[h],tp=min(mn,k-i-getlw(ps[j].first,ps[j+1].first,i));
				//printf("[%lld %lld %lld %lld]\n",i,ps[j].first,ps[j+1].first,getlw(ps[j].first,ps[j+1].first,i));
				if(tp>=0){
					diff[cur][b[1]+1]--;
					diff[cur][b[1]-tp]++;
				}
			}
		}
	}sqrt^4(nq/4)
	int res=0;
	for(auto i:mp){
		int cnt=0,lst=0;
		for(auto j:diff[i.second]){
			//printf("[%lld %lld]",j.first,j.second);
			if(cnt){
				res=(res+j.first-lst)%md;
			}
			lst=j.first;
			cnt+=j.second;
		}
		//putchar('\n');
	}
	printf("%lld",res%md);
	return 0;
}
2024/9/9 16:08
加载中...