标签:答案 msu nbsp space ref 学校 来源 bit 操作
原题来自: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)); } }
标签:答案 msu nbsp space ref 学校 来源 bit 操作
原文地址:https://www.cnblogs.com/fdezlsq/p/11432279.html