高端贪心,好久没写splay调了好久……
以下v为价格,w为鲜嫩度 把牛和草都按v排升序,扫草,首先把v小于等于当前草的牛都丢进splay,这样一来splay里全是可选的牛了,按w排序,然后贪心的为当前的草取牛:w小于等于当前草的w的牛,取出来删除,ans加上当前草的价格(没有则跳过) 取牛的时候统计一下来判无解#include#include #include using namespace std;const int N=100005,inf=1e9+7;int n,m,tot,con,rot;struct phs{ int f,c[2],v,s;}t[N];struct qwe{ int v,w;}a[N],b[N];bool cmp(const qwe &a,const qwe &b){ return a.v '9'||p<'0') { if(p=='-') f=-1; p=getchar(); } while(p>='0'&&p<='9') { r=r*10+p-48; p=getchar(); } return r*f;}inline void ud(int x){ t[x].s=t[t[x].c[0]].s+t[t[x].c[1]].s+1;}void zhuan(int x,int &k){ int y=t[x].f,z=t[y].f,l=t[y].c[0]!=x,r=l^1; if(y!=k) t[z].c[t[z].c[0]!=y]=x; else k=x; t[x].f=z; t[y].c[l]=t[x].c[r]; t[t[y].c[l]].f=y; t[x].c[r]=y; t[y].f=x; ud(y); ud(x);}void splay(int x,int &k){ while(x!=k) {//cerr< <<" "< < 2) ans+=b[i].v,con++,shanchu(now);//,cerr< <<" "< < <