Submission #349445

# Submission time Handle Problem Language Result Execution time Memory
349445 2021-01-17T15:41:03 Z S2speed Spiral (BOI16_spiral) C++17
27 / 100
142 ms 63596 KB
#include<bits/stdc++.h>
#include<fstream>
 
using namespace std;

#pragma GCC optimize ("Ofast")

#define all(x) x.begin() , x.end()
#define gcd __gcd 
typedef long long int ll;
typedef pair<ll , ll> pll;
typedef pair<int , int> pii;
typedef long double db;
struct piii {
	int first , second , third;
};

const ll MAXN = 2e3 + 20 , md = 1e9 + 7;
 
ll tav(ll n , ll k){
	ll res = 1;
	while(k > 0){
		if(k & 1){
			res *= n;
			res %= md;
		}
		n *= n;
		n %= md;
		k /= 2;
	}
	return res;
}

ll a[MAXN][MAXN] , ps[MAXN][MAXN];

int main(){
	ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	
	ll n , v;
	cin>>n>>v;
	if(n > MAXN){
		while(v--){
			ll x1 , x2 , y1 , y2;
			cin>>x1>>y1>>x2>>y2;
			if(x1 == 0 && y1 == 0){
				cout<<"1\n";
				continue;
			}
			ll q = max(abs(x1) , abs(y1)) , p = tav(2 * q - 1 , 2) + 1;
			if(x1 == q && y1 == -q){
				cout<<tav(2 * q + 1 , 2)<<'\n';
				continue;
			}
			if(x1 == q){
				cout<<(p + y1 + q - 1) % md<<'\n';
				continue;
			}
			p += 2 * q - 1;
			if(y1 == q){
				cout<<(p + q - x1) % md<<'\n';
				continue;
			}
			p += 2 * q;
			if(x1 == -q){
				cout<<(p + q - y1) % md<<'\n';
				continue;
			}
			p += 2 * q;
			cout<<(p + x1 + q) % md<<'\n';
		}
		return 0;
	}
	for(ll x1 = -n ; x1 <= n ; x1++){
		for(ll y1 = -n ; y1 <= n ; y1++){
			if(x1 == 0 && y1 == 0){
				a[x1 + n][y1 + n] = 1;
				continue;
			}
			ll q = max(abs(x1) , abs(y1)) , p = tav(2 * q - 1 , 2) + 1;
			if(x1 == q && y1 == -q){
				a[x1 + n][y1 + n] = tav(2 * q + 1 , 2);
				continue;
			}
			if(x1 == q){
				a[x1 + n][y1 + n] = (p + y1 + q - 1) % md;
				continue;
			}
			p += 2 * q - 1;
			if(y1 == q){
				a[x1 + n][y1 + n] = (p + q - x1) % md;
				continue;
			}
			p += 2 * q;
			if(x1 == -q){
				a[x1 + n][y1 + n] = (p + q - y1) % md;
				continue;
			}
			p += 2 * q;
			a[x1 + n][y1 + n] = (p + x1 + q) % md;
		}
	}
	ps[0][0] = a[0][0];
	for(int i = 1 ; i < 2 * n + 1 ; i++){
		ps[i][0] = (ps[i - 1][0] + a[i][0]) % md;
	}
	for(int j = 1 ; j < 2 * n + 1 ; j++){
		ps[0][j] = (ps[0][j - 1] + a[0][j]) % md;
		for(int i = 1 ; i < 2 * n + 1 ; i++){
			ps[i][j] = ps[i][j - 1] + ps[i - 1][j] - ps[i - 1][j - 1] + a[i][j] + md;
			ps[i][j] %= md;
		}
	}
	while(v--){
		ll ans = 0 , x1 , x2 , y1 , y2;
		cin>>x1>>y1>>x2>>y2; swap(x1 , x2); swap(y1 , y2);
		x1 += n;
		x2 += n;
		y1 += n;
		y2 += n;
		ans += ps[x1][y1];
		if(x2 > 0){
			ans -= ps[x2 - 1][y1] - md;
		}
		if(y2 > 0){
			ans -= ps[x1][y2 - 1] - md;
		}
		if(x2 > 0 && y2 > 0){
			ans += ps[x2 - 1][y2 - 1];
		}
		cout<<ans % md<<'\n';
	}
	return 0;
}
# Verdict Execution time Memory Grader output
1 Correct 142 ms 63596 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 364 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 142 ms 63596 KB Output is correct
2 Incorrect 1 ms 364 KB Output isn't correct
# Verdict Execution time Memory Grader output
1 Incorrect 1 ms 364 KB Output isn't correct
# Verdict Execution time Memory Grader output
1 Correct 142 ms 63596 KB Output is correct
2 Correct 1 ms 364 KB Output is correct
3 Incorrect 1 ms 364 KB Output isn't correct