T2全部RE求助
  • 板块P6851 onu
  • 楼主cmll02
  • 当前回复2
  • 已保存回复2
  • 发布时间2020/10/7 10:21
  • 上次更新2023/11/5 11:44:26
查看原帖
T2全部RE求助
171487
cmll02楼主2020/10/7 10:21

问题出在 (*) 处,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;
}
2020/10/7 10:21
加载中...