2017/10/22(vjudge--BJFU周赛第七周)

来源:互联网 发布:应用程序软件下载 编辑:程序博客网 时间:2024/05/22 17:27

https://vjudge.net/contest/193373#overview
A
首先这个题是&运算,然后自然想到是位运算,然后还有一个点,就是如果一个连续的区间都是1,那么它的任何一个自区间都是符合条件的,那么只要计算出它的子区间即可,这样就只需要遍历一遍。一个区间的子区间有n*(n+1)

#include<iostream>using namespace std;int num[100005];bool vis[100005][23];int main(){    int t;    scanf("%d",&t);    int bound[23];    int i,j;    int c=1;    for(i=1;i<=22;i++)    {        bound[i]=c;        c=c<<1;    }    while(t--)    {        int n;        scanf("%d",&n);        for(i=0;i<n;i++)            scanf("%d",&num[i]);        for(i=0;i<n;i++)        {            int cnt=num[i];            for(j=1;j<=22;j++)            {                vis[i][j]=cnt&1;                cnt=cnt>>1;            }        }        long long ans=0;        for(i=1;i<=22;i++)        {            int len=0;            for(j=0;j<n;j++)            {                if(vis[j][i])                    len++;                else                {                    ans+=(len*(len+1))/2*bound[i];                    len=0;                }            }            ans+=(len*(len+1))/2*bound[i];            //这段代码可以说是非常巧妙了        }        printf("%lld\n",ans);    }    return 0;} 

H
H题其实是比较明显的dp题,对于每一个盒子都有跳右一格或者是跳同一个颜色,啊呸,不对,是对于每一个盒子都有从左边一个跳过来或者是从左边最近的同一个颜色的跳过来,其实这真的是两种不同的思想,这大概就是dp吧,想的是“终止”。

C
lowband
两种情况,一种是两个的和比mod大,另一种是两个的和比mod小
G
dp或者dfs
I
①判断不合法的情况②判断怎么填
H
dp题
D
全模拟