免费网站中文源码下载,珠海网站开发公司,家居网站页面设计图片,做3d任务的网站传送门 文章目录题意#xff1a;思路#xff1a;题意#xff1a; n≤1e6,ai≤2e6n\le1e6,a_i\le2e6n≤1e6,ai≤2e6
思路#xff1a;
由于(ajak)(a_j \And a_k)(ajak)打的括号#xff0c;所以应该放在一起考虑#xff0c;现在我们可以枚举aia_iai思路题意 n≤1e6,ai≤2e6n\le1e6,a_i\le2e6n≤1e6,ai≤2e6
思路
由于(ajak)(a_j \And a_k)(ajak)打的括号所以应该放在一起考虑现在我们可以枚举aia_iai由于是或操作所以我们肯定是从高位到低位贪心的选如果当前iii右边有两个数他们这一位都是111那么答案这一位一定是111。当然如果aia_iai的这一位也是111就不需要考虑这一位了直接跳过就好。现在问题转换成了如何快速判断当前这位右边是否存在一个超集它这一位是111。 很容易想到用sosdpsosdpsosdp来预处理出所有超集这样处理出来的是整个数组的但是怎么判断当前位右边是否有至少两个呢我们可以记一个超集的最右边的两个位置当i≥i\gei≥当前第二大的位置的时候这一位就不能要。 实现起来就很简单辣。
// Problem: F. Bits And Pieces
// Contest: Codeforces - Manthan, Codefest 19 (open for everyone, rated, Div. 1 Div. 2)
// URL: https://codeforces.com/contest/1208/problem/F
// Memory Limit: 256 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org)//#pragma GCC optimize(Ofast,no-stack-protector,unroll-loops,fast-math)
//#pragma GCC target(sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tunenative)
//#pragma GCC optimize(2)
#includecstdio
#includeiostream
#includestring
#includecstring
#includemap
#includecmath
#includecctype
#includevector
#includeset
#includequeue
#includealgorithm
#includesstream
#includectime
#includecstdlib
#define X first
#define Y second
#define L (u1)
#define R (u1|1)
#define pb push_back
#define mk make_pair
#define Mid (tr[u].ltr[u].r1)
#define Len(u) (tr[u].r-tr[u].l1)
#define random(a,b) ((a)rand()%((b)-(a)1))
#define db puts(---)
using namespace std;//void rd_cre() { freopen(d://dp//data.txt,w,stdout); srand(time(NULL)); }
//void rd_ac() { freopen(d://dp//data.txt,r,stdin); freopen(d://dp//AC.txt,w,stdout); }
//void rd_wa() { freopen(d://dp//data.txt,r,stdin); freopen(d://dp//WA.txt,w,stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pairint,int PII;const int N2000005,mod1e97,INF0x3f3f3f3f;
const double eps1e-6;int n;
int a[N];
PII pos[N];void add(int val,int id) {//if(id-1) return;if(pos[val].X-1) {pos[val].Xid;return;} else if(pos[val].Y-1) {if(pos[val].Xid) return;pos[val].Yid;if(idpos[val].X) pos[val].Ypos[val].X,pos[val].Xid;} else {if(idpos[val].X||idpos[val].Y) return;if(idpos[val].X) pos[val].Ypos[val].X,pos[val].Xid;else if(idpos[val].Y) pos[val].Yid; }
}int main()
{
// ios::sync_with_stdio(false);
// cin.tie(0);scanf(%d,n);memset(pos,-1,sizeof(pos));for(int i1;in;i) scanf(%d,a[i]),add(a[i],i);for(int i0;i21;i) for(int j0;jN;j) {if(ji1) {add(j^(1i),pos[j].X);add(j^(1i),pos[j].Y);}}int ans0;for(int i1;in-2;i) {int now0;for(int j20;j0;j--) {if(a[i]j1) continue;now1j;if(nowN||pos[now].Yi||pos[now].Y-1) now-1j; }ansmax(ans,a[i]|now);}printf(%d\n,ans);return 0;
}
/**/