1. 程式人生 > >CCF傻逼題,201709-5-除法---暴力可以過?????

CCF傻逼題,201709-5-除法---暴力可以過?????

這題特麼無語,史上最無語沒有之一,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,我竟無言以對。暴力比樹狀陣列快,這資料出的挺好的。。。