10WA求助

P1311 [NOIP2011 提高组] 选择客栈

```cpp #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; } ```
by _ikun_newperson @ 2023-07-27 19:29:47


|