码迷,mamicode.com
首页 > 其他好文 > 详细

#10115 「一本通 4.1 例 3」校门外的树

时间:2019-08-29 23:17:28      阅读:90      评论:0      收藏:0      [点我收藏+]

标签:答案   msu   nbsp   space   ref   学校   来源   bit   操作   

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% 的数据,1n,m1001≤n,m≤100;

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

对于 %100% 的数据,1n,m5×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));
    }
}

 

 

 

#10115 「一本通 4.1 例 3」校门外的树

标签:答案   msu   nbsp   space   ref   学校   来源   bit   操作   

原文地址:https://www.cnblogs.com/fdezlsq/p/11432279.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!