标签:return int lowbit scanf 门外 1537 while ans
时间限制: 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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。