问题出在 (*) 处,j<0了,不知道咋回事,求助dalao
#include <stdio.h>
#include <algorithm>
#include <string.h>
inline long long read()
{
long long num = 0; char c = getchar();
while (c<48 || c>57)c = getchar();
while (c >= 48 && c <= 57)num = (num << 3) + (num << 1) + (c ^ 48), c = getchar();
return num;
};
/*#define test(x) if(x)\
{\
while(1)int *q=new int[9999999];\
}/**/
struct C{
long long i,hs,d;
}c[100005],d[100005];
long long q,u[100005],ans[100005];
bool cmp(C a,C b)
{
return ((a.hs==b.hs)?(a.d<b.d):(a.hs<b.hs));
}
inline long long getk(long long as,long long bs,long long ae,long long be,long long cc)
{
long long al=ae-as+1,bl=be-bs+1;
if(al>bl){q-=(al-bl)*cc;al=bl;ae=al+as-1;}
// printf("q:%d\n",q);
// else if(al<bl)
{
long long j=be;
for(long long i=ae;i>=as;i--)
{
if((c[i].d<=d[j].d)&&(j>=bs))
{
ans[c[i].i]=(d[j].i+2);
q+=(cc+d[j].d);
// printf("d=%d %d , q = %d(win)\n",d[i].hs,d[i].d,q);
u[j]+=1;
u[i]+=2;;
j--;
}
}
j=be;
for(long long i=ae;i>=as;i--)
{
if((u[i]<=1))
{
while((u[j]&1)&&j>bs)j--;
// u[j]^=1;
q+=(d[j].d-cc);
ans[c[i].i]=(d[j].i+2);
// printf("d=%d %d , q = %d(lose)\n",d[i].hs,d[i].d,q);
// u[i]=u[i]^2;//此处j<0(*)
}
}
}
/* if(al==bl)
{
}*/
}
inline long long max(long long a,long long b)
{
return (a>b?a:b);
}
signed main()//l[i]?¨¤¡§a¡§o??¨¢?3?¨¨3?¨¨?¡§¡§
{
long long m=read(),n=read(),cc=read(),v=read(),maxf=0;//v is tot. c is once;
// memset(ans,-1,sizeof(ans));
for(long long i=0;i<m;i++)
{
long long a=read(),b=read();
d[i].i=i;
d[i].hs=a;
d[i].d=b;
}
for(long long i=0;i<n;i++)
{
long long a=read(),b=read();
maxf=max(maxf,a);
c[i].i=i;
c[i].hs=a;
c[i].d=b;
}
std::sort(c,c+n,cmp);
std::sort(d,d+m,cmp);
long long ci=0,di=0;
for(long long i=1;i<=maxf;i++)
{
if(c[ci].hs!=i)
{
while(d[di].hs==i)di++;
}
else
{
long long as=ci,bs=di;
while(c[ci].hs==i)ci++;
if(d[di].hs!=i)continue;
while(d[di].hs==i)di++;
getk(as,bs,ci-1,di-1,cc);
}
}
printf("%lld\n",q+v);
for(long long i=0;i<n;i++)printf("%lld\n",ans[i]-1);
return 0;
}