1537:【例 3】校门外的树
时间限制: 1000 ms 内存限制: 524288 KB
提交数: 497 通过数: 216
【题目描述】
原题来自: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 c1[50005],c2[50005]; int low(int x){return x&(-x);} int find(int l,int r){ int ans=0; for(int i=r;i;i-=low(i))ans+=c1[i]; for(int i=l-1;i;i-=low(i))ans-=c2[i]; return ans; } int main(){ int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=m;i++){ int k,l,r; scanf("%d%d%d",&k,&l,&r); if(k==1){ for(int i=l;i<=n+1;i+=low(i))c1[i]++; for(int i=r;i<=n+1;i+=low(i))c2[i]++; } else printf("%d\n",find(l,r)); } }
原文地址:https://www.cnblogs.com/fdezlsq/p/11432279.html
时间: 2024-09-30 09:17:14