|
- #include<bits/stdc++.h>
- #define int long long
- using namespace std;
- #pragma GCC optimize(2)
- inline int read(){
- int x=0,f=0;char ch=getchar();
- while(!isdigit(ch)){
- f|=ch=='-';
- ch=getchar();
- }
- while(isdigit(ch)){
- x=x*10+(ch^48);
- ch=getchar();
- }
- return f?-x:x;
- }
- inline void write(int x){
- if(x<0)
- putchar('-'),x=-x;
- if(x>9)
- write(x/10);
- putchar(x%10+'0');
- return;
- }
- int n,tot=0,f[2005],a[2005];
- struct node{
- int u,v,w;
- bool operator< (const node& a) const{
- return w>a.w;
- }
- }e[5000005];
- inline void add(int u,int v,int w){
- e[++tot].v=v;
- e[tot].u=u;
- e[tot].w=w;
- }
- inline int find(int x){
- if(f[x]==x)
- return x;
- else return f[x]=find(f[x]);
- }
- inline int kruskal(){
- int ans=0,cnt=0;
- for(int i=1;i<=tot;++i){
- int f1=find(e[i].u),f2=find(e[i].v);
- if(f1!=f2){
- f[f1]=f2;
- ans+=e[i].w;
- if(++cnt==n-1)
- break;
- }
- }
- return ans;
- }
- signed main(){
- n=read();
- for(int i=1;i<=n;++i)
- f[i]=i,a[i]=read();
- for(int i=1;i<=n;++i)
- for(int j=1;j<=n;++j)
- if(i!=j)
- add(i,j,a[i]^a[j]);
- sort(e+1,e+tot+1);
- write(kruskal());
- return 0;
- }
复制代码 怎么卡常啊,一直TLE,o2开了,inline用了,快读快写板子也用了,register不让用
怎么卡常啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
题目传送门
|
|