MnZn 刚学OI eps ms , 求助为什么这样瞎搞能过此题
查看原帖
MnZn 刚学OI eps ms , 求助为什么这样瞎搞能过此题
439743
WangJingze楼主2023/9/3 16:15

提交记录

#include<bits/stdc++.h>
#define re register
#define ui unsigned int
#define ul unsigned long long
#define il inline
#define min(a,b) a<b?a:b 
using namespace std;
namespace IO {
	const ui MAXSIZE = 1 ;
	char buf[MAXSIZE], *p1, *p2;
	#define gc() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, MAXSIZE, stdin), p1 == p2) ? EOF: *p1++)
	il ui read(){
		re ui res=0; re char c=gc();
		while(!isdigit(c)) c=gc();
		while(isdigit(c)) res=(res<<1)+(res<<3)+(c^48),c=gc();
		return res;
	}
	il void write(re ul x){
		if(x>9) write(x/10);
		putchar(x-(x/10)*10+48); return;
	}
} using namespace IO;
const ui MAXN=2e6+10,MAXK=1e4+10;
ui a[MAXN],idx[MAXN],sum[MAXN];
vector<ui> v[MAXK];
ul ret=0;
ui n,k,p,block,x;
il bool query(re ui l,re ui r){
	re ui ans=1e9;
	re ui bl=idx[l],br=idx[r];
	if(bl==br){
		for(re ui i=l;i<=r;++i){
			ans=min(ans,a[i]);
			if(ans<=p) return 1;
		}return ans<=p;
	}for(re ui i=l;idx[i]==bl;++i){
		ans=min(ans,a[i]); if(ans<=p) return 1;
	}for(re ui i=bl+1;i<br;++i){
		ans=min(ans,sum[i]); if(ans<=p) return 1;
	}for(re ui i=r;idx[i]==br;--i){
		ans=min(ans,a[i]); if(ans<=p) return 1;
	}return ans<=p;
}
signed main(){
	for(re ui i=1;i<=MAXN-10;++i) sum[i]=1e9;
	n=read(),k=read(),p=read(); block=sqrt(n); 
	for(re ui 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 ui i=0;i<k;++i){
		re ui siz=v[i].size();
		if(siz<2) continue;
		for(re ui j=0;j<siz;++j){
			for(re ui kk=1;j+kk<siz;++kk){
				if(query(v[i][j],v[i][j+kk])){
					ret+=siz-(j+kk); break;
				}
			}
		}	
	}write(ret);
	return 0;
}
2023/9/3 16:15
加载中...