捞
  • 板块灌水区
  • 楼主NahX_
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/5/2 20:55
  • 上次更新2024/5/2 23:48:41
查看原帖
捞
667795
NahX_楼主2024/5/2 20:55

题目

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=3e5+5;
int st[N][35],f[N][35],a[N];
signed main(){
	int n;cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		for(int j=1;j<=35;j++)f[i][j]=-1;
	}
	for(int i=0;i<=log2(n)+1;i++){
		for(int j=1;j<n;j++){
			if(!i)f[j][i]=j+1,st[j][i]=a[j]|a[j+1];
			else{
				if(j+pow(2,i)<=n){
					f[j][i]=f[f[j][i-1]][i-1];
					st[j][i]=st[j][i-1]|st[f[j][i-1]][i-1];
				}else f[j][i]=-1;
			}
		}
	}
	int sum=0;
	for(int i=1;i<=n;i++){
		int l=1,r=i-1;
		while(l<=r){
			int mid=l+r>>1;
			int su=0,t=mid;
			for(int j=log2(n)+1;j>=0;j--){
				if(f[t][j]<=i&&f[t][j]!=-1)su=su|st[t][j],t=f[t][j];
			}
			if(su<=a[i])r=mid-1;
			else l=mid+1;
		}
		int id=r+1;
		//cout<<id<<endl;
		l=i+1,r=n;
		while(l<=r){
			int mid=l+r>>1;
			int su=0,t=i;
			for(int j=log2(n)+1;j>=0;j--){
				if(f[t][j]<=mid&&f[t][j]!=-1){
					su=su|st[t][j],t=f[t][j];
				}
			}
			if(su<=a[i])l=mid+1;
			else r=mid-1;
		}
		int id1=l-1;
		int c=0;
		for(int j=i+1;j<=id1;j++){                     
			if(a[j]==a[i])++c;
		}
		sum-=c*(c+1)/2;	
		sum+=id1-id+(i-id)*(id1-i);
	}
	cout<<n*(n-1)/2-sum;
	return 0; 
}

hack

input:69
3 4 2 4 5 2 0 5 2 8 8 0 0 8 6 4 3 0 0 1 2 5 8 1 7 4 6 0 6 1 8 4 2 0 4 3 5 6 2 8 3 7 7 6 0 3 8 6 2 6 0 2 4 5 0 3 6 8 8 8 3 2 2 6 7 8 5 3 5
out:2249
ans:2262
2024/5/2 20:55
加载中...