1 条题解
-
0yejun LV 10 MOD @ 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
- 上传者