链接:点击打开链接


直接贪心按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;
}