排排序,找找做题的感觉...
对了,longlong用C++ 错了几次,我也是linux选手了....
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
#define MOD 1000000007
#define LL __int64
struct node
{
int u,c,num;
LL l;
}p[];
int flag[];
LL sum[];
int cmp(node a,node b)
{
if(a.u == b.u)
return a.c > b.c;
else
return a.u < b.u;
}
int cmp1(node a,node b)
{
return a.num < b.num;
}
int main()
{
int t,cas = ,n,m,q,i,st,maxz;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&n,&m,&q);
for(i = ;i < n;i ++)
flag[i] = ;
for(i = ;i < m;i ++)
scanf("%d%d%I64d",&p[i].u,&p[i].c,&p[i].l);
sort(p,p+m,cmp);
p[].num = ;
for(i = ;i < m;i ++)
{
if(p[i].u != p[i-].u)
p[i].num = ;
else
p[i].num = p[i-].num + ;
}
sort(p,p+m,cmp1);
sum[] = p[].l;
flag[p[].num] = ;
maxz = ;
for(i = ;i < m;i ++)
{
if(p[i].num != p[i-].num)
flag[p[i].num] = i;
sum[i] = sum[i-] + p[i].l;
maxz = max(maxz,p[i].num);
}
printf("Case #%d:\n",cas++);
for(i = ;i < q;i ++)
{
scanf("%d",&st);
if(st <= )
printf("0\n");
else if(st >= maxz)
printf("%I64d\n",sum[m-]);
else
printf("%I64d\n",sum[flag[st+]-]);
}
}
return ;
}