链接:点击打开链接
直接贪心按r从小到大排,然后再用树状数组维护区间现有路灯数,接着直接暴力就可以了。
代码:
#include<bits/stdc++.h>
const int mx=1e3+10;
typedef long long ll;
using namespace std;
int x,n,m,k,sum[mx];
bool vis[mx];
struct sec{
int l,r,t;
bool operator < (sec A)const{
if(r==A.r) return l<A.l;
return r<A.r;
}
}s[mx];
inline int lowbit(int x){
return x&(-x);
}
void addup(int p){
for(int i=p;i<=n;i+=lowbit(i)){
sum[i]++;
}
}
int query(int x){
int ans=vis[x--];
while(x>0){
ans+=sum[x];
x-=lowbit(x);
}
return ans;
}
int main(){
int t,pos,cases=1;
scanf("%d",&t);
while(t--){
scanf("%d%d%d",&n,&m,&k);
for(int i=0;i<=n;i++) sum[i]=0;
memset(vis,0,sizeof(vis));
for(int i=0;i<k;i++){
scanf("%d",&pos);
vis[pos]=1,addup(pos);
}
for(int i=0;i<m;i++) scanf("%d%d%d",&s[i].l,&s[i].r,&s[i].t);
sort(s,s+m);
int flag=0,ans=0;
for(int i=0;i<m;i++){
int r=s[i].r,l=s[i].l,t1=s[i].t;
if(t1>r-l+1){ flag=1; break; }
int now=query(r)-query(l-1);
now=t1-now;
while(now>0){
if(!vis[r]){
vis[r]=1,addup(r);
now--,ans++;
}
r--;
}
}
printf("Case %d: ",cases++);
printf("%d\n",flag ? -1:ans);
}
return 0;
}