题目链接: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;
}