题目链接:https://www.nowcoder.com/acm/contest/105/H
这道题是一道裸的线段树的题,但我还不会线段树....但是还有另外一种方法,就是用结构体+vector去存每种球的l和r区间,然后遍历每个种类的球在所给的区间里不同球的个数。感觉这种方法很巧妙,需要注意的是结构体开大点,卡65都会段错误,还有就是在ans++后就说明这个种类的球已经在这个区间里存在了,所以加个break跳出这个循环再去找其他的球,不然会超时。
AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
struct Node{
vector<int> l,r;
}c[70];
int n,m;
int main()
{
while(~scanf("%d%d",&n,&m)){
for(int i=0;i<=65;i++){
c[i].l.clear();
c[i].r.clear();
}
while(m--){
int k;
scanf("%d",&k);
if(k == 1){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
c[z].l.push_back(x);
c[z].r.push_back(y);
}
else{
int x,y;
int ans = 0;
scanf("%d%d",&x,&y);
for(int i=0;i<=65;i++){
for(int j=0;j<c[i].l.size();j++){
if(c[i].l[j] <= y && c[i].r[j] >= x){
ans++;
break;
}
}
}
printf("%d\n",ans);
}
}
}
return 0;
}