其他分享
首页 > 其他分享> > 1537:【例 3】校门外的树

1537:【例 3】校门外的树

作者:互联网


时间限制: 1000 ms         内存限制: 524288 KB
提交数: 2738     通过数: 1233

【题目描述】

原题来自:Vijos P1448

校门外有很多树,学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两种操作:

K=1K=1,读入 l,rl,r 表示在 ll 到 rr 之间种上一种树,每次操作种的树的种类都不同;

K=2K=2,读入 l,rl,r 表示询问 ll 到 rr 之间有多少种树。

注意:每个位置都可以重复种树。

【输入】

第一行 n,mn,m 表示道路总长为 nn,共有 mm 个操作;

接下来 mm 行为 mm 个操作。

【输出】

对于每个 k=2k=2 输出一个答案。

【输入样例】

5 4
1 1 3
2 2 5
1 2 4
2 3 5

【输出样例】

1
2

【提示】

数据范围与提示:

对于 20% 的数据,1≤n,m≤1001≤n,m≤100;

对于 %60% 的数据,1≤n≤103,1≤m≤5×1041≤n≤103,1≤m≤5×104 ;

对于 %100% 的数据,1≤n,m≤5×1041≤n,m≤5×104 ,保证 l,r>0l,r>0。

【代码】

#include<bits/stdc++.h>
using namespace std;
int n,m,k,l,r,c2[1000001],c1[1000001];
int lowbit(int x){
return x&(-x);
}
void add1(int x){
while(x<=n){
c1[x]++;
x+=lowbit(x);
}
return;
}
void add2(int x){
while(x<=n){
c2[x]++;
x+=lowbit(x);
}
return;
}
int sum1(int x){
int ans=0;
while(x>0){
ans+=c1[x];
x-=lowbit(x);
}
return ans;
}
int sum2(int x){
int ans=0;
while(x>0){
ans+=c2[x];
x-=lowbit(x);
}
return ans;
}
int main(){
scanf("%d %d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%d",&k);
if(k==1){
scanf("%d %d",&l,&r);
add1(l);
add2(r);
}
if(k==2){
scanf("%d %d",&l,&r);
printf("%d\n",sum1(r)-sum2(l-1));
}
}
return 0;
}

标签:return,int,lowbit,scanf,门外,1537,while,ans
来源: https://www.cnblogs.com/sk2021035/p/16512129.html