CCF傻逼題,201709-5-除法---暴力可以過?????
阿新 • • 發佈:2018-11-01
這題特麼無語,史上最無語沒有之一,C++純暴力過 90????,JAVA純暴力過了????????????,tell me ,發生了什麼,這題為什麼能暴力。
CCF如果JAVA熟練,建議大家用JAVA。
http://118.190.20.162/view.page?gpid=T59
JAVA純暴力AC程式碼。。。。。。。
//import java.lang.reflect.Array; import java.math.*; import java.util.Arrays; import java.util.Scanner; //import om.sun.swing.internal.plaf.basic.resources.basic; public class Main { static int[] a= new int[100005]; public static void main(String[] args) { Scanner input = new Scanner(System.in); int n = input.nextInt(),m = input.nextInt(); for(int i= 1 ; i <= n ; i ++) { a[i] = input.nextInt(); } int op,l,r,v; for(int j=0;j<m;j++) { // op = input.nextInt(); l = input.nextInt(); r = input.nextInt(); if(op==1) { v = input.nextInt(); if(v == 1)continue; for(int i = l ; i <= r; i ++) { if(a[i] >= v && a[i] % v == 0) { a[i] /= v; } } } else { // l=input.nextInt(); // r=input.nextInt(); long ans=0; for(int i=l;i<=r;i++) { ans += a[i]; } System.out.println(ans); } } // System.out.println(ans); } }
C++純暴力,過 90%,這個可以理解。。。
#include<iostream> #include<algorithm> #include<cstring> #include<string> #include<vector> #include<cstdio> #include<cstdlib> #include<cmath> #include<queue> #include<map> #include<set> #include<stack> #include<bitset> using namespace std; typedef unsigned long long ull; typedef pair<int,int> P; const long long mod=1e9+7; const int maxn=1e5+5; const int INF=0x7fffffff; const int inf=0x3f3f3f3f; const double eps=1e-8; int A[maxn]; int n,m; int main() { scanf("%d%d",&n,&m); for(int i=1; i<=n; i++) { scanf("%d",&A[i]); } while(m--) { int op,l,r,v; scanf("%d%d%d",&op,&l,&r); if(op==1) { scanf("%d",&v); if(v==1)continue; while(l<=r) { if(A[l]>=v&&A[l]%v==0) { A[l]/=v; } l++; } } else { long long ans=0; while(l<=r) { ans+=A[l++]; } printf("%lld\n",ans); } } return 0; }
C++,AC程式碼。也是半個暴力。因為每個數去除最多隻能除 32次,(因為數的最大值只有1e6,每次就算只除2,也不能除多少次,所以這個更新可以暴力,並不會超時。複雜度最高也只有 32 * N * logN,重點在於處理字首和),不會再多,所以只需要用一個樹狀陣列維護字首和即可,每次更新值,直接暴力能不能除,然後再更新值即可。
考察兩點:1.暴力更新值(注意特判除1),2.樹狀陣列求字首和。
#include<iostream> #include<algorithm> #include<cstring> #include<string> #include<vector> #include<cstdio> #include<cstdlib> #include<cmath> #include<queue> #include<map> #include<set> #include<stack> #include<bitset> using namespace std; typedef unsigned long long ull; typedef pair<int,int> P; const long long mod=1e9+7; const int maxn=1e5+5; const int INF=0x7fffffff; const int inf=0x3f3f3f3f; const double eps=1e-8; int A[maxn]; long long bit[maxn]; int n,m; long long sum(int i) { long long ans=0; while(i>0) { ans+=bit[i]; i-=i&-i; } return ans; } void add( int i, int x) { while(i<=n) { bit[i]+=x; i += i&-i; } } int main() { scanf("%d%d",&n,&m); for(int i=1; i<=n; i++) { scanf("%d",&A[i]); add(i,A[i]); } while(m--) { int op,l,r,v; scanf("%d%d%d",&op,&l,&r); if(op==1) { scanf("%d",&v); if(v==1)continue; while(l<=r) { if(A[l]>=v&&A[l]%v==0) { add(l,0-A[l]+A[l]/v); A[l]/=v; } l++; } } else { printf("%lld\n",sum(r)-sum(l-1)); } } return 0; }
細心的孩子,肯定一定發現了。。。。。。。。。,JAVA暴力,6s 。C++樹狀陣列7s,我竟無言以對。暴力比樹狀陣列快,這資料出的挺好的。。。