推导部分和,python,蓝桥杯,并查集

问题描述

对于一个长度为 N 的整数数列 A1​,A2​,⋯AN​, 小蓝想知道下标 l 到 r 的部分和 ∑i=lr​=Al​+Al+1​+⋯+Ar​ 是多少?

然而, 小蓝并不知道数列中每个数的值是多少, 他只知道它的 M 个部分和 的值。其中第 i 个部分和是下标 li​ 到 ri​ 的部分和 ∑j=li​ri​​=Ali​​+Ali​+1​+⋯+Ari​​, 值是 Si​ 。

输入格式

第一行包含 3 个整数 N、M 和 Q 。分别代表数组长度、已知的部分和数量 和询问的部分和数量。

接下来 M 行, 每行包含 3 个整数 li​,ri​,Si​ 。

接下来 Q 行, 每行包含 2 个整数 l 和 r, 代表一个小蓝想知道的部分和。

输出格式

对于每个询问, 输出一行包含一个整数表示答案。如果答案无法确定, 输出 UNKNOWN。

样例输入

5 3 3
1 5 15
4 5 9
2 3 5
1 5
1 3
1 2

样例输出

15
6
UNKNOWN

评测用例规模与约定

对于 10% 的评测用例, 1≤N,M,Q≤10,−100≤Si​≤100 。

对于 20% 的评测用例, 1≤N,M,Q≤20,−1000≤Si​≤1000 。

对于 30% 的评测用例, 1≤N,M,Q≤50,−10000≤Si​≤10000 。

对于 40%40% 的评测用例, 1≤N,M,Q≤1000,−106≤Si​≤106 。

对于 60%60% 的评测用例, 1≤N,M,Q≤10000,−109≤Si​≤109 。

对于所有评测用例, 1≤N,M,Q≤105,−1012≤Si​≤1012,1≤li​≤ri​≤N。数据保证没有矛盾。

运行限制

  • 最大运行时间:3s
  • 最大运行内存: 512M

代码:

n,m,q=map(int,input().split())

class node():
    def __init__(self,w=0,v=0):
        self.w=w
        self.v=v

tree=[node() for i in range(n+1)]

for i in range(1,n+1):
    tree[i].v=i

def find(x):
    if (x==tree[x].v):
        return x
    tmp=tree[x].v
    tree[x].v=find(tree[x].v)
    tree[x].w+=tree[tmp].w
    return tree[x].v

def merge(x,y,s):
    x1=find(x-1)
    y1=find(y)
    if (x1==y1):return
    else:
        tree[x1].v=y1
        tree[x1].w=tree[y].w-tree[x-1].w+s
        return
def query(x,y):
    x=x-1
    if (find(x)!=find(y)):
        print("UNKNOWN")
        return
    else:
        print(tree[x].w-tree[y].w)
        return
    
for i in range(m):
    l,r,s=map(int,input().split())
    merge(l,r,s)
for i in range(q):
    l,r=map(int,input().split())
    query(l,r)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值