题目链接:点击打开链接
题目大意:略。
解题思路:区间交叉判定技巧。
AC 代码
#include<bits/stdc++.h> #include<cmath> #define mem(a,b) memset(a,b,sizeof a); using namespace std; typedef long long ll; struct T { vector<int> l,r; }t[70]; int main() { int n,m; while(~scanf("%d%d",&n,&m)) { for(int i=0;i<65;i++) { t[i].l.clear(); t[i].r.clear(); } int op,l,r,c; while(m--) { scanf("%d",&op); if(op==1) { scanf("%d%d%d",&l,&r,&c); t[c].l.push_back(l); // 将属于c颜色的桶编号区间保存下来 t[c].r.push_back(r); } else { int sum=0; scanf("%d%d",&l,&r); for(int i=0;i<65;i++) for(int j=0;j<t[i].l.size();j++) if(t[i].r[j]>=l && t[i].l[j]<=r) // 交叉写法,只要有交叉(包括边界),则定存在一种颜色 { sum++; break; } printf("%d\n",sum); } } } return 0; }