Submission #287022

# Submission time Handle Problem Language Result Execution time Memory
287022 2020-08-31T09:10:05 Z oolimry Intergalactic ship (IZhO19_xorsum) C++14
9 / 100
803 ms 197368 KB
#include <bits/stdc++.h>
#define all(x) (x).begin(), (x).end()
#define sz(x) (int) (x).size()
using namespace std;
typedef long long lint;
typedef pair<int,int> ii;

int arr[1005];
struct query{ int l, r, x; };

vector<query> queries;

bool in(int x, int bit){
	return ((x & (1 << bit)) != 0);
}

lint mod = 1000000007;
lint two[500005];
lint ans = 0;

inline lint odd(int N){
	if(N == 0) return -10234523;
	else return N-1;
}
inline lint even(int N){
	if(N == 0) return 0;
	else return N-1;
}
inline void fix(lint &x){
	x %= mod;
}

int cnt[7][7][1005][1005];

int main(){
	ios_base::sync_with_stdio(false); cin.tie(0);
	
	lint n; cin >> n;
	for(int i = 1;i <= n;i++) cin >> arr[i];
	
	int Q; cin >> Q;
	for(int q = 0;q < Q;q++){
		queries.push_back({});
		query &QQ = queries.back();
		cin >> QQ.l >> QQ.r >> QQ.x;
	}
	
	for(query q : queries){
		int l = q.l, r = q.r, x = q.x;
		for(int bit = 0;bit < 7;bit++){
			for(int bit2 = 0;bit2 < 7;bit2++){	
				if(!in(x, bit) || !in(x, bit2)) continue;
				cnt[bit][bit2][l][r]++;
			}
		}
	}
	
	for(int bit = 0;bit < 7;bit++){
		for(int bit2 = 0;bit2 < 7;bit2++){
			for(int l = 1;l <= n;l++){
				for(int r = n;r >= l;r--){
					cnt[bit][bit2][l][r] += cnt[bit][bit2][l-1][r];
					cnt[bit][bit2][l][r] += cnt[bit][bit2][l][r+1];
					cnt[bit][bit2][l][r] -= cnt[bit][bit2][l-1][r+1];
				}
			}
		}
	}

	two[0] = 1;
	for(int i = 1;i <= 500004;i++) two[i] = (two[i-1] * 2) % mod;

	for(lint a = 1;a <= n;a++){
		for(lint b = a;b <= n;b++){
			for(int aBit = 0;aBit < 7;aBit++){
				for(int bBit = 0;bBit < 7;bBit++){
					
					lint none = 0;
					lint onlyA = cnt[aBit][aBit][a][a];
					lint onlyB = cnt[bBit][bBit][b][b];
					lint both = cnt[aBit][bBit][a][b];
					onlyA -= both;
					onlyB -= both;
					none = Q - onlyA - onlyB - both;
					
					///don't use "both"
					
					lint base = min(a,b) * (n - max(a,b) + 1);
					fix(base);
					
					lint p1 = 0;
					
					if(in(arr[a], aBit)) p1 += even(onlyA);
					else p1 += odd(onlyA);
					
					if(in(arr[b], bBit)) p1 += even(onlyB);
					else p1 += odd(onlyB);
					
					p1 += none;
					p1 += even(both);
					p1 += (aBit + bBit);				
					if(a != b) p1++;

					if(p1 >= 0){
						ans += base * two[p1];
						fix(ans);					
					}
                  
					///use "both"
					lint p2 = 0;
					
					if(in(arr[a], aBit)) p2 += odd(onlyA);
					else p1 += even(onlyA);
					
					if(in(arr[b], bBit)) p2 += odd(onlyB);
					else p2 += even(onlyB);
					
					p2 += none;
					p2 += odd(both);
					p2 += (aBit + bBit);						
					if(a != b) p2++;
					
					if(p2 >= 0){
						ans += base * two[p2];
						fix(ans);					
					}
					
				}
			}
		} 
	}
	
	cout << ans << "\n";
}
# Verdict Execution time Memory Grader output
1 Correct 6 ms 4864 KB Output is correct
2 Correct 6 ms 5376 KB Output is correct
3 Incorrect 7 ms 6400 KB Output isn't correct
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 6 ms 4864 KB Output is correct
2 Correct 6 ms 5376 KB Output is correct
3 Incorrect 7 ms 6400 KB Output isn't correct
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 60 ms 25088 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 803 ms 197368 KB Output is correct
2 Correct 777 ms 197240 KB Output is correct
3 Correct 738 ms 197276 KB Output is correct
4 Correct 721 ms 197112 KB Output is correct
# Verdict Execution time Memory Grader output
1 Incorrect 10 ms 10240 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 10 ms 10240 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 6 ms 4864 KB Output is correct
2 Correct 6 ms 5376 KB Output is correct
3 Incorrect 7 ms 6400 KB Output isn't correct
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 6 ms 4864 KB Output is correct
2 Correct 6 ms 5376 KB Output is correct
3 Incorrect 7 ms 6400 KB Output isn't correct
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 6 ms 4864 KB Output is correct
2 Correct 6 ms 5376 KB Output is correct
3 Incorrect 7 ms 6400 KB Output isn't correct
4 Halted 0 ms 0 KB -