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