Monday, March 9, 2020

USACO Triangles -- Version3

triangles3-final

USACO 2020 February Contest, Silver

Problem 2. Triangles

In [1]:
%%time
fin = open("7.in", "r")
fout = open("triangles.out", "w")

N = int(fin.readline().strip())
print("N",N)

keyX = dict()
keyY = dict()
points = []
xpointset = set()
ypointset = set()

for i in range(N):
    X,Y = map(int,fin.readline().split())
    xpointset.add(X)
    ypointset.add(Y)
    points.append((X,Y))
    if X in keyX:      
        keyX[X].append(Y)
    else:
        keyX[X]=[Y]
    if Y in keyY:
        keyY[Y].append(X)
    else:
        keyY[Y]=[X]
N 60000
Wall time: 230 ms
In [2]:
%%time

sumbaseX = dict() # use x,y as index
sumbaseY = dict() # use x,y as index

# compute sumbaseY and store for x and all y's in list
for x in xpointset:
    n = len(keyX[x])
    if n>1:
        keyX[x].sort()
        lasty=keyX[x][0]
        lastsumy = sum([abs(a-lasty) for a in keyX[x]])
        sumbaseY[(x,lasty)]=lastsumy
        for i in range(1,n):
            lastsumy = lastsumy + (2*i-n)*(keyX[x][i]-lasty)
            lasty = keyX[x][i]
            sumbaseY[(x,lasty)]=lastsumy
    else:
        for z in keyX[x]:
            sumbaseY[(x,z)]=0   
            
# compute sumbaseX and store for y and all x's in list    
for y in ypointset:
    n = len(keyY[y])
    if n>1:
        keyY[y].sort()
        lastx=keyY[y][0]
        lastsumx = sum([abs(b-lastx) for b in keyY[y]])
        sumbaseX[(lastx,y)]=lastsumx
        for i in range(1,n):
            lastsumx = lastsumx + (2*i-n)*(keyY[y][i]-lastx)
            lastx = keyY[y][i]
            sumbaseX[(lastx,y)]=lastsumx
    else:
        for z in keyY[y]:
            sumbaseX[(z,y)]=0
Wall time: 190 ms
In [3]:
%%time
A=0
modval=1e9+7
for x,y in points:
    if (x,y) in sumbaseY and (x,y) in sumbaseX:
        A+=sumbaseY[(x,y)]*sumbaseX[(x,y)]
    
print("A",A) 
ans = int(A%modval)
print("ans",ans)
A 62502320243726728
ans 806210495
Wall time: 89.8 ms