제출 #382136

#제출 시각아이디문제언어결과실행 시간메모리
382136vanicIntergalactic ship (IZhO19_xorsum)C++14
47 / 100
2085 ms262148 KiB
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
#include <cassert>
#include <bitset>

using namespace std;

typedef long long ll;

const int maxn=1005, mod=1e9+7, maxq=1e5+5, Log=7;

inline int sum(int a, int b){
	if(a+b>=mod){
		return a+b-mod;
	}
	if(a+b<0){
		return a+b+mod;
	}
	return a+b;
}

inline int mul(int a, int b){
	return (ll)a*b%mod;
}

int n, m;
int a[maxn];
int sol;
int q[maxq][3];
int komb[maxn][maxn][Log][Log][2][2];

void precompute(){
	bool p1, p2;
	for(int i=0; i<n; i++){
		for(int j=i; j<n; j++){
			for(int k=0; k<Log; k++){
				for(int l=0; l<Log; l++){
					p1=a[i]&(1<<k);
					p2=a[j]&(1<<l);
					komb[i][j][k][l][p1][p2]=1;
				}
			}
		}
	}
	for(int qq=0; qq<m; qq++){
		for(int i=0; i<n; i++){
			for(int j=i; j<n; j++){
				for(int k=0; k<Log; k++){
					for(int l=0; l<Log; l++){
						if(q[qq][0]<=i && q[qq][1]>=i && q[qq][0]<=j && q[qq][1]>=j && (1<<k)&q[qq][2] && (1<<l)&q[qq][2]){
							komb[i][j][k][l][0][0]=sum(komb[i][j][k][l][0][0], komb[i][j][k][l][1][1]);
							komb[i][j][k][l][0][1]=sum(komb[i][j][k][l][0][1], komb[i][j][k][l][1][0]);
							komb[i][j][k][l][1][0]=komb[i][j][k][l][0][1];
							komb[i][j][k][l][1][1]=komb[i][j][k][l][0][0];
							
						}
						else if(q[qq][0]<=i && q[qq][1]>=i && (1<<k)&q[qq][2]){
							komb[i][j][k][l][0][0]=sum(komb[i][j][k][l][0][0], komb[i][j][k][l][1][0]);
							komb[i][j][k][l][0][1]=sum(komb[i][j][k][l][0][1], komb[i][j][k][l][1][1]);
							komb[i][j][k][l][1][0]=komb[i][j][k][l][0][0];
							komb[i][j][k][l][1][1]=komb[i][j][k][l][0][1];
						}
						else if(q[qq][0]<=j && q[qq][1]>=j && (1<<l)&q[qq][2]){
							komb[i][j][k][l][0][0]=sum(komb[i][j][k][l][0][0], komb[i][j][k][l][0][1]);
							komb[i][j][k][l][0][1]=komb[i][j][k][l][0][0];
							komb[i][j][k][l][1][0]=sum(komb[i][j][k][l][1][0], komb[i][j][k][l][1][1]);
							komb[i][j][k][l][1][1]=komb[i][j][k][l][1][0];
						}
						else{
							komb[i][j][k][l][0][0]=mul(komb[i][j][k][l][0][0], 2);
							komb[i][j][k][l][0][1]=mul(komb[i][j][k][l][0][1], 2);
							komb[i][j][k][l][1][0]=mul(komb[i][j][k][l][1][0], 2);
							komb[i][j][k][l][1][1]=mul(komb[i][j][k][l][1][1], 2);
						}
					}
				}
			}
		}
	}
}

void rijesi(){
	int kofa;
	for(int i=0; i<n; i++){
		for(int j=i; j<n; j++){
			if(i!=j){
				kofa=2*(i+1)*(n-j);
			}
			else{
				kofa=(i+1)*(n-j);
			}
			for(int k=0; k<Log; k++){
				for(int l=0; l<Log; l++){
					sol=sum(sol, mul(mul(1<<(k+l), kofa), komb[i][j][k][l][1][1]));
				}
			}
		}
	}
}

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin >> n;
	for(int i=0; i<n; i++){
		cin >> a[i];
	}
	cin >> m;
	for(int i=0; i<m; i++){
		cin >> q[i][0] >> q[i][1] >> q[i][2];
		q[i][0]--;
		q[i][1]--;
	}
	precompute();
/*	for(int i=0; i<n; i++){
		for(int j=i; j<n; j++){
			for(int k=0; k<2; k++){
				for(int l=0; l<2; l++){
					cout << komb[i][j][k][l][1][1] << ' ';
				}
				cout << '\n';
			}
			cout << '\n';
		}
		cout << '\n';
	}*/
	rijesi();
	cout << sol <<  '\n';
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...