zoukankan      html  css  js  c++  java
  • CodeForces1420B

    题意

    给出(T)组数据,每组数据给出一个(n)(n)个数,

    要求 找出 ((i,j)) 有几对,有两个要求:

    • (i < j)

    • (a_{i} & a_{j} geq a_{i} oplus a_{j}) 。(与 和 异或)

    思路

    for循环从2开始判断每个元素,判断条件是 if((a[i]&a[i-1])>=(a[i]^a[i-1])),

    先设两个变量cnt和ans,一个cnt表示最高位相同的元素有几个,一个ans表示输出的对数,

    如果满足这个判断条件,说明其位数相同,所以cnt++;当下一个元素仍然满足这个条件的话,就相当于a[i-2]、a[i-1]、a[i]的最高位位数相同,所以ans+=cnt。

    注意

    cnt和ans需要开long long,其他的不用。

    AC代码

    #include<iostream>
    #include<string.h>
    #include<algorithm>
    #include<stdio.h>
    #include<cmath>
    #include<list>
    #include<stdlib.h>
    #include<map>
    #include<stack>
    #include<stdio.h>
    #include<queue>
    using namespace std;
    typedef long long ll;
    #define sc(T) scanf("%d",&T)
    #define scc(x,y) scanf("%d %d",&x,&y)
    #define pr(T) printf("%d
    ",T)
    #define f(a,b,c) for (int a=b;a<c;a++)
    #define ff(a,b,c) for (int a=b;a>c;a--)
    #define inf 0x3f3f3f3f
    #define mem(a,b) memset(a,b,sizeof(a))
    #define eps 1e-9
    #define PI acos(-1)
    
    int a[100010];
    
    int main()
    {
        int T;
        sc(T);
        while(T--)
        {
            int n;
            cin>>n;
            for(int i=1; i<=n; i++)
                sc(a[i]);
            sort(a+1,a+n+1);
            ll cnt=0,ans=0;
            //  ai&aj ≥ ai⊕aj
            for(int i=2; i<=n; i++)
            {
                if((a[i]&a[i-1])>=(a[i]^a[i-1])) // 注意优先级加括号
                    cnt++,ans+=cnt;
                else
                    cnt=0;
            }
            cout<<ans<<endl;
        }
        return 0;
    }
    
  • 相关阅读:
    OpenJudge 3765(最大权闭合图,最小割
    多校8-1010 HDU5389 (dp
    570D Codeforces Round #316 (Div. 2) D(dfs序,时间戳,二分
    CodeForces
    hiho一下!
    HDU 4123(树上任意点到其他点的最远距离,rmq
    Oracle创建索引;查询索引
    HBase启动和停止命令
    flink dom4j冲突异常
    flink checkpoint状态储存三种方式选择
  • 原文地址:https://www.cnblogs.com/OFSHK/p/13735963.html
Copyright © 2011-2022 走看看