Submission #382023

#TimeUsernameProblemLanguageResultExecution timeMemory
382023dorijanlendvajIntergalactic ship (IZhO19_xorsum)C++14
100 / 100
175 ms6508 KiB
#include <bits/stdc++.h>
#define x first
#define y second
#define pii pair<int,int>
using ll=long long;
using ull=unsigned long long;
#define pb push_back
#define eb emplace_back
#define vi vector<int>
#define vl vector<ll>
#define all(a) begin(a),end(a)

using namespace std;

const int N=3010,MOD=1e9+7;
const char en='\n';
const ll LLINF=1ll<<60;

int mult(ll a,ll b)
{
	return a*b%MOD;
}

void ad(int&a,int b)
{
	a+=b;
	if (a>=MOD) a-=MOD;
}

int q,n,h[N],cn[N][N],cn2[N][10],cn3[N][10][10];
ull has[N][10];

int main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	const int POL=(MOD+1)/2,CET=mult(POL,POL);
	int an=0;
	mt19937_64 rng(324);
	cin>>n;
	for (int i=0;i<n;++i) cin>>h[i];
	cin>>q;
	for (int z=0;z<q;++z)
	{
		int l,r,a;
		cin>>l>>r>>a;
		--l;
		++cn[l][a];
		--cn[r][a];
		ull re=rng();
		for (int b=0;b<7;++b) if (a&(1<<b))
		{
			++cn2[l][b];
			--cn2[r][b];
			has[l][b]^=re;
			has[r][b]^=re;
			for (int c=b+1;c<7;++c) if (a&(1<<c))
			{
				++cn3[l][b][c];
				--cn3[r][b][c];
			}
		}
	}
	for (int i=1;i<n;++i)
	{
		for (int b=0;b<128;++b) cn[i][b]+=cn[i-1][b];
		for (int b=0;b<7;++b) cn2[i][b]+=cn2[i-1][b],has[i][b]^=has[i-1][b];
		for (int b=0;b<7;++b) for (int c=b+1;c<7;++c) cn3[i][b][c]+=cn3[i-1][b][c];
	}
	for (int b=0;b<7;++b) for (int c=0;c<7;++c)
	{
		int mu=1<<(b+c);
		for (int i=0;i<n;++i) for (int j=i+1;j<n;++j)
		{
			int mu2=2*(i+1)*(n-j);
			if (cn2[i][b] && cn2[j][c] && has[i][b]!=has[j][c]) ad(an,mult(mult(mu,mu2),CET));
			if (cn2[i][b] && cn2[j][c] && has[i][b]==has[j][c] && (((h[i]>>b)&1)==((h[j]>>c)&1))) ad(an,mult(mult(mu,mu2),POL));
			if (cn2[i][b] && !cn2[j][c] && (h[j]&(1<<c))) ad(an,mult(mult(mu,mu2),POL));
			if (!cn2[i][b] && cn2[j][c] && (h[i]&(1<<b))) ad(an,mult(mult(mu,mu2),POL));
			if (!cn2[i][b] && !cn2[j][c] && (h[j]&(1<<c)) && (h[i]&(1<<b))) ad(an,mult(mu,mu2));
		}
	}
	for (int b=0;b<7;++b) for (int i=0;i<n;++i)
	{
		int mu=1<<(b*2);
		int mu2=(i+1)*(n-i);
		if (cn2[i][b]) ad(an,mult(mult(mu,mu2),POL));
		if (!cn2[i][b] && (h[i]&(1<<b))) ad(an,mult(mu,mu2));
	}
	for (int b=0;b<7;++b) for (int c=b+1;c<7;++c) for (int i=0;i<n;++i)
	{
		int cnbc=cn3[i][b][c],cnb=cn2[i][b]-cn3[i][b][c],cnc=cn2[i][c]-cn3[i][b][c];
		int mu=1<<(b+c);
		int mu2=2*(i+1)*(n-i);
		if ((cnb && cnbc) || (cnc && cnbc) || (cnb && cnc)) ad(an,mult(mult(mu,mu2),CET));
		else
		{
			if (cnb && (h[i]&(1<<c))) ad(an,mult(mult(mu,mu2),POL));
			if (cnc && (h[i]&(1<<b))) ad(an,mult(mult(mu,mu2),POL));
			if (cnbc && (((h[i]>>b)&1)==((h[i]>>c)&1))) ad(an,mult(mult(mu,mu2),POL));
			if (!cnb && !cnc && !cnbc && (h[i]&(1<<b)) && (h[i]&(1<<c))) ad(an,mult(mu,mu2));
		}
	}
	for (int i=0;i<q;++i) an=mult(an,2);
	cout<<an<<en;
}

#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...