n 方过八万,建议加强时限到 2s?
  • 板块灌水区
  • 楼主wukaichen888
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/1/19 10:43
  • 上次更新2024/1/19 14:54:39
查看原帖
n 方过八万,建议加强时限到 2s?
723238
wukaichen888楼主2024/1/19 10:43

题目 | 提交记录

struct awa{
	int a,b,c,d,v;
	bool operator <(awa t) const{
		if(a!=t.a) return a<t.a;
		if(b!=t.b) return b<t.b;
		if(c!=t.c) return c<t.c;
		if(d!=t.d) return d<t.d;
		return v<t.v;
	}
}a[N];
bool cmp(pair<awa,int> x,pair<awa,int> y){
	return x.first.b<y.first.b;
}
bool cmp1(pair<awa,int> x,pair<awa,int> y){
	return x.first.c<y.first.c;
}
bool cmp2(pair<awa,int> x,pair<awa,int> y){
	return x.first.d<y.first.d;
}
int n,m;
long long f[N],g[N],f_[N>>3][256],g_[N>>3][256];
unsigned int h[2048][M],h1[2048][M],h2[2048][M];
pair<awa,int> b[N],b1[N],b2[N];
signed main(){
	//	for(int i=1;i<256;i+=2) g_[0][i]=1;
	std::ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> m;
	//	if(n>50000) return 0;
	for(int i=1;i<=n;++i) cin >> a[i].a >> a[i].b >> a[i].c >> a[i].d >> a[i].v;
	sort(a+1,a+1+n);
	for(int i=1;i<=n;++i) b[i]=b1[i]=b2[i]=pair<awa,int>(a[i],i);
	sort(b+1,b+1+n,cmp);
	sort(b1+1,b1+1+n,cmp1);
	sort(b2+1,b2+1+n,cmp2);
	//	for(int i=1;i<=n;++i) cout << i << ": " << a[i].a << " " << a[i].b << " " << a[i].c << " " << a[i].d << " " << a[i].v << endl;
	g[0]=1;
	for(int k=0;k<=(n>>11);++k){
		for(int j=1;j<=n>>5;++j) h[0][j]=h1[0][j]=h2[0][j]=0;
		for(int i=1,j=0,lp=0;i<=n;++i){
			int p=b[i].second;
			if(p>=(k<<11) && p<(k+1<<11)){
				p&=2047;
				memmove(h[p],h[lp],sizeof(h[0]));
				for(;j<=n && b[j].first.b<=b[i].first.b;++j){
					/*if(b[i].first.b>=b[j].first.b)*/ h[p][b[j].second>>5]|=1u<<(b[j].second&31);
					//					cout << "1: " << b[j].second << " " << (p|(k<<12)) << endl;
				}
				lp=p;
			}
		}
		for(int i=1,j=0,lp=0;i<=n;++i){
			int p=b1[i].second;
			if(p>=(k<<11) && p<(k+1<<11)){
				p&=2047;
				memmove(h1[p],h1[lp],sizeof(h1[0]));
				for(;j<=n && b1[j].first.c<=b1[i].first.c;++j){
					/*if(b1[i].first.c>=b1[j].first.c)*/ h1[p][b1[j].second>>5]|=1u<<(b1[j].second&31);
					//					cout << "2: " << b1[j].second << " " << (p|(k<<12)) << endl;
				}
				lp=p;
			}
		}
		for(int i=1,j=0,lp=0;i<=n;++i){
			int p=b2[i].second;
			if(p>=(k<<11) && p<(k+1<<11)){
				p&=2047;
				memmove(h2[p],h2[lp],sizeof(h2[0]));
				for(;j<=n && b2[j].first.d<=b2[i].first.d;++j){
					h2[p][b2[j].second>>5]|=1u<<(b2[j].second&31);
				}
				lp=p;
			}
		}
		for(int i=0;i<=2047;++i){
			for(int j=0;j<=n>>5;++j) h[i][j]&=h1[i][j]&h2[i][j];
			//			cout << h[i][0] << endl;
			h[i][(k<<6)|(i>>5)]&=0xffffffff^(1<<(i&31));
		}
		//		cout << g[0] << endl;
		//		cout << g[0] << endl;
		//		cout << g[0] << endl;
		//		cout << g[0] << endl;
		//		cout << g[0] << endl;
		for(int i=(k<<11),ii=0;i<(k+1<<11);++i,++ii){
//			if(i>=72000) return 0;
			//			cout << g[0] << endl;
			//			cout << g[0] << endl;
			//			cout << g[0] << endl;
			//			cout << g[0] << endl;
			//			cout << g[0] << endl;
			int t;
			long long* ff,*gg;
			for(int j=0;j<i;j+=32){
				t=h[ii][j>>5],ff=f_[j>>3],gg=g_[j>>3];
				if(ff[(t>>0)&255|0]>=f[i]) {
					if(ff[(t>>0)&255|0]>f[i]) f[i]=ff[(t>>0)&255|0],g[i]=gg[(t>>0)&255|0];
					else g[i]+=gg[(t>>0)&255|0];
				}
				if(ff[(t>>8)&255|256]>=f[i]) {
					if(ff[(t>>8)&255|256]>f[i]) f[i]=ff[(t>>8)&255|256],g[i]=gg[(t>>8)&255|256];
					else g[i]+=gg[(t>>8)&255|256];
				}
				if(ff[(t>>16)&255|512]>=f[i]) {
					if(ff[(t>>16)&255|512]>f[i]) f[i]=ff[(t>>16)&255|512],g[i]=gg[(t>>16)&255|512];
					else g[i]+=gg[(t>>16)&255|512];
				}
				if(ff[(t>>24)&255|768]>=f[i]) {
					if(ff[(t>>24)&255|768]>f[i]) f[i]=ff[(t>>24)&255|768],g[i]=gg[(t>>24)&255|768];
					else g[i]+=gg[(t>>24)&255|768];
				}
//				if(ff[(t>>8)&255|256]>=f[i]) f[i]=ff[(t>>8)&255|256];
//				if(ff[(t>>16)&255|512]>=f[i]) f[i]=ff[(t>>16)&255|512];
//				if(ff[(t>>24)&255|768]>=f[i]) f[i]=ff[(t>>24)&255|768];
				
				
				
				/*
				  if((j<i)&(h[ii][t]>>0)&(f[j|0]>f[i])&1) f[i]=f[j|0];
				  if((j<i)&(h[ii][t]>>1)&(f[j|1]>f[i])&1) f[i]=f[j|1];
				  if((j<i)&(h[ii][t]>>2)&(f[j|2]>f[i])&1) f[i]=f[j|2];
				  if((j<i)&(h[ii][t]>>3)&(f[j|3]>f[i])&1) f[i]=f[j|3];
				  if((j<i)&(h[ii][t]>>4)&(f[j|4]>f[i])&1) f[i]=f[j|4];
				  if((j<i)&(h[ii][t]>>5)&(f[j|5]>f[i])&1) f[i]=f[j|5];
				  if((j<i)&(h[ii][t]>>6)&(f[j|6]>f[i])&1) f[i]=f[j|6];
				  if((j<i)&(h[ii][t]>>7)&(f[j|7]>f[i])&1) f[i]=f[j|7];
				  if((j<i)&(h[ii][t]>>8)&(f[j|8]>f[i])&1) f[i]=f[j|8];
				  if((j<i)&(h[ii][t]>>9)&(f[j|9]>f[i])&1) f[i]=f[j|9];
				  if((j<i)&(h[ii][t]>>10)&(f[j|10]>f[i])&1) f[i]=f[j|10];
				  if((j<i)&(h[ii][t]>>11)&(f[j|11]>f[i])&1) f[i]=f[j|11];
				  if((j<i)&(h[ii][t]>>12)&(f[j|12]>f[i])&1) f[i]=f[j|12];
				  if((j<i)&(h[ii][t]>>13)&(f[j|13]>f[i])&1) f[i]=f[j|13];
				  if((j<i)&(h[ii][t]>>14)&(f[j|14]>f[i])&1) f[i]=f[j|14];
				  if((j<i)&(h[ii][t]>>15)&(f[j|15]>f[i])&1) f[i]=f[j|15];
				  if((j<i)&(h[ii][t]>>16)&(f[j|16]>f[i])&1) f[i]=f[j|16];
				  if((j<i)&(h[ii][t]>>17)&(f[j|17]>f[i])&1) f[i]=f[j|17];
				  if((j<i)&(h[ii][t]>>18)&(f[j|18]>f[i])&1) f[i]=f[j|18];
				  if((j<i)&(h[ii][t]>>19)&(f[j|19]>f[i])&1) f[i]=f[j|19];
				  if((j<i)&(h[ii][t]>>20)&(f[j|20]>f[i])&1) f[i]=f[j|20];
				  if((j<i)&(h[ii][t]>>21)&(f[j|21]>f[i])&1) f[i]=f[j|21];
				  if((j<i)&(h[ii][t]>>22)&(f[j|22]>f[i])&1) f[i]=f[j|22];
				  if((j<i)&(h[ii][t]>>23)&(f[j|23]>f[i])&1) f[i]=f[j|23];
				  if((j<i)&(h[ii][t]>>24)&(f[j|24]>f[i])&1) f[i]=f[j|24];
				  if((j<i)&(h[ii][t]>>25)&(f[j|25]>f[i])&1) f[i]=f[j|25];
				  if((j<i)&(h[ii][t]>>26)&(f[j|26]>f[i])&1) f[i]=f[j|26];
				  if((j<i)&(h[ii][t]>>27)&(f[j|27]>f[i])&1) f[i]=f[j|27];
				  if((j<i)&(h[ii][t]>>28)&(f[j|28]>f[i])&1) f[i]=f[j|28];
				  if((j<i)&(h[ii][t]>>29)&(f[j|29]>f[i])&1) f[i]=f[j|29];
				  if((j<i)&(h[ii][t]>>30)&(f[j|30]>f[i])&1) f[i]=f[j|30];
				  if((j<i)&(h[ii][t]>>31)&(f[j|31]>f[i])&1) f[i]=f[j|31];
				 */
				
				//				if((h[ii][j>>5]>>(j&31))&(f[j]>f[i])&1) f[i]=f[j];
			}
//			for(int j=0;j<i;j+=32){
//				t=h[ii][j>>5],ff=f_[j>>3],gg=g_[j>>3];
//				if(ff[(t>>0)&255|0]==f[i]) g[i]+=gg[(t>>0)&255|0];
//				//				if(i<=20) cout << i << " " << g[i] << endl;
//				if(ff[(t>>8)&255|256]==f[i]) g[i]+=gg[(t>>8)&255|256];
//				if(ff[(t>>16)&255|512]==f[i]) g[i]+=gg[(t>>16)&255|512];
//				if(ff[(t>>24)&255|768]==f[i]) g[i]+=gg[(t>>24)&255|768];
//				
//			}
			f[i]+=a[i].v;
			g[i]%=p;
			//			if(i<=n) cout << i << " " << f[i] << " " << g[i] << endl;
			//			cout << g[0] << endl;
			for(int j=0;j<=255;++j){
				if((j>>(i&7))&1){
					if(f[i]>f_[i>>3][j]) f_[i>>3][j]=f[i],g_[i>>3][j]=0;
				}
			}
			for(int j=0;j<=255;++j){
				if((j>>(i&7))&1 && f[i]==f_[i>>3][j]) g_[i>>3][j]+=g[i];
			}
		}
	}
	long long ans=*max_element(f+1,f+1+n);
	long long ans2=0;
	for(int i=1;i<=n;++i){
		if(f[i]==ans) ans2+=g[i];
	}
	cout << ans << endl << ans2%p << endl;
	return 0;
2024/1/19 10:43
加载中...