题目描述
输入
输出
摘自题解。。orz我还是太菜了
#include<bits/stdc++.h> using namespace std; typedef long long LL; #define m first #define w second const int SIZE=1e5+7; int c[SIZE]; struct shoe{ int w,m; } p[SIZE]; inline int lowbit(int x) { return x&-x; } void update(int x) { for(;x<SIZE;x+=lowbit(x)) ++c[x]; } int query(int x) { int res=0; for(;x>0;x-=lowbit(x)) res+=c[x]; return res; } bool cmp(shoe s1,shoe s2){ return (s1.m < s2.m); } int main(){ freopen("test.in","r",stdin); int n,M,W; while((scanf("%d%d%d",&n,&M,&W)!= EOF)) { for(int i=0;i<n;++i) scanf("%d",&p[i].m); for(int i=0;i<n;++i) scanf("%d",&p[i].w); sort(p,p+n,cmp); int l=0,r=n-1; LL ans=0; memset(c,0,sizeof(c)); for(;r>=0;r--) { for(;l<n&&p[l].m+p[r].m<=M;++l) update(p[l].w); if(W-p[r].w>0) ans+=query(W-p[r].w); } for(int i=0;i<n;++i) if(p[i].m*2<=M&&p[i].w*2<=W) ans--; ans/=2; printf("%lld ",ans); } return 0; }