链接:
https://www.nowcoder.com/acm/contest/105/H
来源:牛客网
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
n个桶按顺序排列,我们用1~n给桶标号。有两种操作:
1 l r c 区间[l,r]中的每个桶中都放入一个颜色为c的球 (1≤l,r ≤n,l≤r,0≤c≤60)
2 l r 查询区间[l,r]的桶中有多少种不同颜色的球 (1≤l,r ≤n,l≤r)
1 l r c 区间[l,r]中的每个桶中都放入一个颜色为c的球 (1≤l,r ≤n,l≤r,0≤c≤60)
2 l r 查询区间[l,r]的桶中有多少种不同颜色的球 (1≤l,r ≤n,l≤r)
输入描述:
有多组数据,对于每组数据: 第一行有两个整数n,m(1≤n,m≤100000) 接下来m行,代表m个操作,格式如题目所示。
输出描述:
对于每个2号操作,输出一个整数,表示查询的结果。
示例1
输入
10 10 1 1 2 0 1 3 4 1 2 1 4 1 5 6 2 2 1 6 1 7 8 1 2 3 8 1 8 10 3 2 1 10 2 3 8
输出
2 3 2 4 3
题解: 把每个颜色包含的区间存起来 只需判断两个区间是否有交集即可
判断两区间是否有交集:
if(max(a1, a2) < min(b1, b2))
{ return "有交集"}
else
{ return "无交集"}
需要用vector进行区间保存,
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<vector>
using namespace std;
struct note
{
vector<int>l,r;
} e[100];
int main()
{
int n,m,x,y,z,w;
while(~scanf("%d%d",&n,&m))
{
for(int i=0; i<=65; i++)
{
e[i].l.clear();
e[i].r.clear();
}
for(int i=0; i<m; i++)
{
scanf("%d",&x);
if(x==1)
{
scanf("%d%d%d",&y,&z,&w);
e[w].l.push_back(y); /// 保存每个颜色的区间
e[w].r.push_back(z);
}
else
{
int sum=0;
scanf("%d%d",&y,&z);
for(int i=0; i<=65; i++)
{
for(int j=0; j<e[i].l.size(); j++)
{
if(max(e[i].l[j],y)<=min(e[i].r[j],z)) ///判断两区间是否有交集
{
sum++;
break;
}
}
}
printf("%d\n",sum);
}
}
}
return 0;
}