玄学分块+暴力枚举+究极卡常 居然过了???
查看原帖
玄学分块+暴力枚举+究极卡常 居然过了???
439743
WangJingze楼主2023/7/26 01:09

rt https://www.luogu.com.cn/record/117448326

#include<bits/stdc++.h>
#define re register
#define us unsigned
#define il inline
#define min(a,b) a<b?a:b 
using namespace std;
const int MAXN=2e5+10;
us int a[MAXN],idx[MAXN],sum[MAXN];
vector<int> v[60];
us int n,k,p,block,x,ret=0;
il us int read(){
	re us int res=0; re char c=getchar();
	while(!isdigit(c)) c=getchar();
	while(isdigit(c)) res=(res<<1)+(res<<3)+c-48,c=getchar();
	return res;
}
il void write(re us int x){
	if(x>9) write(x/10);
	putchar(x-(x/10)*10+48); return;
}
il us int query(re us int l,re us int r){
	re us int ans=1e9;
	re us int bl=idx[l],br=idx[r];
	if(bl==br){
		for(re us int i=l;i<=r;++i){
			ans=min(ans,a[i]);
			if(ans<=p) return 1;
		}return ans<=p;
	}for(re us int i=l;idx[i]==bl;++i){
		ans=min(ans,a[i]); if(ans<=p) return 1;
	}for(re us int i=bl+1;i<br;++i){
		ans=min(ans,a[i]); if(ans<=p) return 1;
	}for(re us int i=r;idx[i]==br;--i){
		ans=min(ans,a[i]); if(ans<=p) return 1;
	}return ans<=p;
}
int main(){
	memset(sum,0x7f,sizeof(sum));
	n=read(),k=read(),p=read(); block=8193; 
	for(re us int i=1;i<=n;++i){
		x=read(),a[i]=read(); 
		idx[i]=(i-1)/block+1;
		sum[idx[i]]=min(sum[idx[i]],a[i]);
		v[x].push_back(i);
	}for(re us int i=0;i<k;++i){
		re us int siz=v[i].size();
		if(siz<2) continue;
		for(re us int j=0;j<siz;++j){
			for(re us int kk=1;j+kk<siz;++kk){
				//printf("%d  %d  %d\n",v[i][j],v[i][j+kk],query(v[i][j],v[i][j+kk]));
				ret+=query(v[i][j],v[i][j+kk]);
			}
		}	
	}
	write(ret);
	return 0;
}

可能是数据太水吧(大雾

2023/7/26 01:09
加载中...