QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#211665 | #7520. Monster Generator | zhouhuanyi | WA | 0ms | 3980kb | C++14 | 3.4kb | 2023-10-12 20:08:17 | 2023-11-04 18:37:23 |
Judging History
你现在查看的是最新测评结果
- [2023-11-04 16:34:13]
- hack成功,自动添加数据
- (//qoj.ac/hack/422)
- [2023-11-04 16:28:16]
- hack成功,自动添加数据
- (//qoj.ac/hack/420)
- [2023-10-12 20:08:17]
- 提交
answer
#include<iostream>
#include<cstdio>
#include<algorithm>
#define N 200
using namespace std;
long long read()
{
char c=0;
long long sum=0;
while (c<'0'||c>'9') c=getchar();
while ('0'<=c&&c<='9') sum=sum*10+c-'0',c=getchar();
return sum;
}
int sgn(__int128 x)
{
if (x>0) return 1;
else if (x==0) return 0;
else return -1;
}
struct reads
{
long long a,ta,b,tb;
__int128 ra,rb;
bool operator < (const reads &t)const
{
if (sgn(rb-ra)!=sgn(t.rb-t.ra)) return sgn(rb-ra)>sgn(t.rb-t.ra);
else if (rb-ra>=0) return ra<t.ra;
else return rb>t.rb;
}
};
reads st[N+1];
struct points
{
long long x,y;
bool operator < (const points &t)const
{
return x!=t.x?x<t.x:y<t.y;
}
};
points tongs[N+1],dque[N+1];
points operator + (points a,points b)
{
return (points){a.x+b.x,a.y+b.y};
}
points operator - (points a,points b)
{
return (points){a.x-b.x,a.y-b.y};
}
int n,tong[5*N*N+1],length,lengths,top;
long long m;
unsigned long long ans;
__int128 operator * (points a,points b)
{
return (__int128)(a.x)*b.y-(__int128)(a.y)*b.x;
}
bool check(points a,points b,points c)
{
return (b-a)*(c-a)>=0;
}
unsigned long long F(long long x)
{
if (x<0) return 0;
return (unsigned long long)((__int128)((x)*(x+1))>>1);
}
void solve(long long l,long long r)
{
long long res=0,res2=0,sl,sr;
lengths=top=0;
for (int i=1;i<=n;++i) st[i].ra=st[i].a+(__int128)(l)*st[i].ta,st[i].rb=st[i].b+(__int128)(l)*st[i].tb;
sort(st+1,st+n+1);
for (int i=1;i<=n;++i) tongs[++lengths]=(points){res2+st[i].ta,res+st[i].a},res+=st[i].a-st[i].b,res2+=st[i].ta-st[i].tb;
sort(tongs+1,tongs+lengths+1);
for (int i=1;i<=lengths;++i)
{
while (top>=2&&check(dque[top-1],dque[top],tongs[i])) top--;
dque[++top]=tongs[i];
}
for (int i=1;i<=top;++i)
{
sl=l,sr=r;
if (i>=2&&dque[i].x!=dque[i-1].x) sl=max(sl,(dque[i-1].y-dque[i].y+dque[i].x-dque[i-1].x-1)/(dque[i].x-dque[i-1].x));
if (i+1<=top)
{
if (dque[i].x==dque[i+1].x) sr=l-1;
else sr=min(sr,(dque[i].y-dque[i+1].y)/(dque[i+1].x-dque[i].x));
}
if (sl<=sr) ans+=(unsigned long long)(dque[i].x)*(F(sr)-F(sl-1))+(unsigned long long)(dque[i].y)*(unsigned long long)(sr-sl+1);
}
return;
}
int main()
{
n=read(),m=read();
for (int i=1;i<=n;++i) st[i].a=read(),st[i].ta=read(),st[i].b=read(),st[i].tb=read();
sort(st+1,st+n+1);
for (int i=1;i<=n;++i)
{
if (st[i].a<st[i].b&&st[i].ta>st[i].tb&&(st[i].b-st[i].a)%(st[i].ta-st[i].tb)==0) tong[++length]=(st[i].b-st[i].a)/(st[i].ta-st[i].tb);
if (st[i].a>st[i].b&&st[i].ta<st[i].tb&&(st[i].a-st[i].b)%(st[i].tb-st[i].ta)==0) tong[++length]=(st[i].a-st[i].b)/(st[i].tb-st[i].ta);
if (st[i].a<=st[i].b&&st[i].ta>st[i].tb) tong[++length]=(st[i].b-st[i].a)/(st[i].ta-st[i].tb)+1;
if (st[i].a>=st[i].b&&st[i].ta<st[i].tb) tong[++length]=(st[i].a-st[i].b)/(st[i].tb-st[i].ta)+1;
}
for (int i=1;i<=n;++i)
for (int j=1;j<=n;++j)
if (i!=j)
{
if (st[i].a<=st[j].a&&st[i].ta>st[j].ta) tong[++length]=(st[j].a-st[i].a+st[i].ta-st[j].ta-1)/(st[i].ta-st[j].ta);
if (st[i].b<=st[j].b&&st[i].tb>st[j].tb) tong[++length]=(st[j].b-st[i].b+st[i].tb-st[j].tb-1)/(st[i].tb-st[j].tb);
}
sort(tong+1,tong+length+1);
while (length&&tong[length]>m) length--;
length=unique(tong+1,tong+length+1)-tong-1,tong[length+1]=m+1;
for (int i=0;i<=length;++i) solve(tong[i],tong[i+1]-1);
printf("%llu\n",ans);
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 3824kb
input:
3 5 3 1 5 2 4 2 1 3 1 9 100 1
output:
113
result:
ok single line: '113'
Test #2:
score: 0
Accepted
time: 0ms
memory: 3908kb
input:
3 100000000 3 1 5 2 4 2 1 3 1 9 100 1
output:
35000000549999998
result:
ok single line: '35000000549999998'
Test #3:
score: -100
Wrong Answer
time: 0ms
memory: 3980kb
input:
10 1000000000000000000 776874380544333 197 471391764744275 33 159838820333814 107 677112662750393 41 962335658276824 48 255593531071176 11 127404116579775 209 268525254990127 34 647620110614714 76 897947476313307 13 146196843402516 221 772928712898807 39 637929916804442 2 716937021892338 15 64200226...
output:
17035700776961461648
result:
wrong answer 1st lines differ - expected: '17883317185357051350', found: '17035700776961461648'