首页 > 其他分享 >AcWing 216. Rainbow的信号

AcWing 216. Rainbow的信号

时间:2022-10-25 11:38:15浏览次数:134  
标签:216 Rainbow last val int wi 异或 端点 AcWing


题目链接:​​传送门​

将权值转化成二进制来看,最多30位
枚举每一位并且枚举一个右端点
通过这个右端点判断有多少个左端点符合条件,累计贡献
要注意单独讨论左端点等于右端点时的情况
还有可能右端点在左端点左边,这时交换左右端点,所以下面的答案要乘二
除了左右端点重合的情况,当前的情况发生的概率是
具体的,要分情况讨论
当枚举的右端点当前这一位为

  1. 对于或运算|,由于只要有一位是就是,当前位已经为,所以左端点的取法有种,就是从取到右端点的左边一位
  2. 对于与运算&,只要有一个就是,所以我们记录上一个出现的位置,那么左端点可以选择的区间就是,因为这一段区间内都是
  3. 对于异或运算^,可能异或偶数个使当前值为,还可能异或奇数个才能使当前值为

当枚举的右端点当前这一位为

  1. 对于或运算|,区间中有一个为就可以,所以我们记上一个出现的位置为,由于都为,所以左端点可选的区间就是
  2. 对于与运算&,没有左端点能与起来为
  3. 对于异或运算^,同上讨论,累加当前数来统计异或数
#include <bits/stdc++.h>
#define

using namespace std;
int w[A], n, last[2];
double ansxor, ansor, ansand;

int main(int argc, char const *argv[]) {
cin >> n;
for (int i = 1; i <= n; i++) scanf("%d", &w[i]);
auto calc = [&](int dig) -> void {
int c1 = 0, c2 = 0; last[0] = last[1] = 0;
double val = (double)(1 << dig) / n / n;
for (int i = 1; i <= n; i++) {
int wi = (w[i] >> dig) & 1;
if (wi) ansxor += val, ansor += val, ansand += val;
if (wi) ansxor += val * c1 * 2, ansor += val * (i - 1) * 2, ansand += val * (i - last[0] - 1) * 2;
else ansxor += val * c2 * 2, ansor += val * last[1] * 2;
c1++; if (wi) swap(c1, c2);
last[wi] = i;
}
};
for (int i = 0; i <= 31; i++) calc(i);
cout << fixed << setprecision(3) << ansxor << " " << ansand << " " << ansor << endl;
}


标签:216,Rainbow,last,val,int,wi,异或,端点,AcWing
From: https://blog.51cto.com/lyle/5794322

相关文章

  • AcWing 100. IncDec序列
    题目链接:​​传送门​​将序列转化成差分数列那么题目就变成了对一个数组可进行三种操作对两个元素一个加一一个减一或对一个元素加一或对一个元素减一其实后面两种操作......
  • AcWing 297. 赤壁之战
    题目链接:很容易想到一个dp:表示长度为,以结尾的上升子序列的个数转移的话就是从到枚举一个表示长度,再从到枚举一个,再从到枚举一个转移就是如果,表示可以接在后面,那么复杂度,......
  • AcWing 296. 清理班次2
    题目链接:​​传送门​​洛谷上的​​P4644[USACO05DEC]CleaningShifts​​​之前没发题解太高兴了数据结构优化dp的例题表示处理到处的最小花费拿一个线段树维护最小值......
  • AcWing 281. 硬币
    题目链接:​​传送门​​只是询问一个可行性那么二进制拆分加一个bitset就行了#include<bits/stdc++.h>#defineusingnamespacestd;typedeflonglongll;intn,m,a[A],......
  • AcWing 1221 四平方和
    \(AcWing\)\(1221\).四平方和+自定义排序(重载<)+二分题目传送门一、题目大意四平方和定理,又称为拉格朗日定理:每个正整数都可以表示为至多\(4\)个正整数的平方和......
  • AcWing80 骰子的点数(线性dp)
    #definepbpush_backclassSolution{public:vector<int>numberOfDice(intn){intf[15][100];//投i次,总和为j的投掷可能memset(f,0,sizeof(......
  • AcWing 895.最长上升子序列Ⅰ
    题目链接:http://www.acwing.com/problem/content/897/浅浅复习放AC代码1#include<bits/stdc++.h>2usingnamespacestd;34constintN=1010;5intn;......
  • AcWing 154.滑动窗口
    AcWing154.滑动窗口题目描述给定一个大小为n≤10^6的数组。有一个大小为k的滑动窗口,它从数组的最左边移动到最右边。你只能在窗口中看到k个数字。每次滑动窗口......
  • 2022下半年 Acwing 第二篇:归并模板
    归并其实和快排比较类似,所以模板的记忆也大差不差。不能省懒!voidmerge_sort(intq[],intl,intr){if(l>=r)return;intmid=l+r>>1;merge_s......
  • ACWing 可达性统计
    ACWing可达性统计bitset可以说是一个多位二进制数,每八位占用一个字节,因为支持基本的位运算,所以可用于状态压缩,n位bitset执行一次位运算的时间复杂度可视为n/32.bitset<......