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