1 条题解

  • 0
    @ 2018-12-11 12:02:09
    /*
    由于数据生成器的问题 
    如下三种算法都能ac 
    
    如下是原本的数据范围
    对于30%的数据,n<100000,q=1
    对于60%的数据,n<100,q<100000
    对于100%的数据,n<100000,q<100000 
    */
    #define method_3
    #ifdef method_1
    /*
    30分做法 直接模拟
    */
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    #include<set>
    #include<map>
    #include<queue>
    #include<stack>
    #include<vector>
    #include<cstring>
    #include<cstdlib>
    using namespace std;
    typedef long long ll;
    const int maxn=100000+5;
    const ll INF=0x3f3f3f3f3f3f3f3fll;
    int n,q;
    int a[maxn];
    int u,v;
    int main() {
        ios::sync_with_stdio(false);
        freopen("偷拍硕哥7.in","r",stdin);
        cin>>n>>q;
        for(int i=1; i<=n; i++) {
            cin>>a[i];
        }
        while(q--) {
            cin>>u>>v;
            int cnt=0;
            for(int i=u; i<=v; i++) {
                if(a[i]==0) cnt++;
            }
            cout<<cnt<<endl;
        }
        return 0;
    }
    #endif
    #ifdef method_2
    /*
    60分做法
    由于询问较多
    可以预处理出答案表
    */
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    #include<set>
    #include<map>
    #include<queue>
    #include<stack>
    #include<vector>
    #include<cstring>
    #include<cstdlib>
    using namespace std;
    typedef long long ll;
    const int maxn=1000+5;
    const ll INF=0x3f3f3f3f3f3f3f3fll;
    int n,q;
    int a[maxn];
    int ans[maxn][maxn];
    int u,v;
    int main() {
        ios::sync_with_stdio(false);
        freopen("偷拍硕哥7.in","r",stdin);
        cin>>n>>q;
        for(int i=1; i<=n; i++) {
            cin>>a[i];
        }
        for(int i=1; i<=n; i++) {
            for(int j=i; j<=n; j++) {
                int cnt=0;
                for(int k=i;k<=j;k++){
                    if(a[k]==0) cnt++;
                }
                ans[i][j]=cnt;
            }
        }
        /*
        for(int i=1; i<=n; i++) {
            for(int j=i; j<=n; j++) {
                
                cout<<ans[i][j]<<" ";
            }
            cout<<endl;
        }
        */
        while(q--) {
            cin>>u>>v;
            cout<<ans[u][v]<<endl;
        }
        return 0;
    }
    #endif
    #ifdef method_3
    /*
    100分做法 
    对方法二进行前缀和优化即可 
    */
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    #include<set>
    #include<map>
    #include<queue>
    #include<stack>
    #include<vector>
    #include<cstring>
    #include<cstdlib>
    using namespace std;
    typedef long long ll;
    const int maxn=1000+5;
    const ll INF=0x3f3f3f3f3f3f3f3fll;
    int n,q;
    int a[maxn];
    int sum[maxn];
    int u,v;
    int main() {
        ios::sync_with_stdio(false);
    //  freopen("偷拍硕哥7.in","r",stdin);
        cin>>n>>q;
        sum[0]=0;
        for(int i=1; i<=n; i++) {
            cin>>a[i];
            if(a[i]==0) sum[i]=sum[i-1]-1;
            else sum[i]=sum[i-1]+1;
        }
    //  for(int i=1; i<=n; i++) cout<<sum[i]<<" ";
        while(q--) {
            cin>>u>>v;
            cout<<(v-u+1-(sum[v]-sum[u-1]))/2<<endl;
        }
        return 0;
    }
    #endif
    
    
  • 1

信息

难度
5
分类
(无)
标签
(无)
递交数
157
已通过
57
通过率
36%
被复制
5
上传者