麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發(fā)設(shè)計 > 正文

51Nod - 1674 分治

2019-11-14 08:45:17
字體:
供稿:網(wǎng)友

題意:

lyk擁有一個區(qū)間。它規(guī)定一個區(qū)間的價值為這個區(qū)間中所有數(shù)and起來的值與這個區(qū)間所有數(shù)or起來的值的乘積。例如3個數(shù)2,3,6。它們and起來的值為2,or起來的值為7,這個區(qū)間對答案的貢獻為2*7=14。現(xiàn)在lyk有一個n個數(shù)的序列,它想知道所有n*(n+1)/2個區(qū)間的貢獻的和對1000000007取模后的結(jié)果是多少。例如當這個序列為{3,4,5}時,那么區(qū)間[1,1],[1,2],[1,3],[2,2],[2,3],[3,3]的貢獻分別為9,0,0,16,20,25。Input
第一行一個數(shù)n(1<=n<=100000)。接下來一行n個數(shù)ai,表示這n個數(shù)(0<=ai<=10^9)。Output
一行表示答案。Input示例
33 4 5Output示例
70

思路:

完全沒思路,看網(wǎng)上題解的。分治,這方面能力還是弱。對于一段區(qū)間[l,r],求出中點mid,然后遞歸解決[l,mid-1]和[mid,r]的子問題,還有就是題目所要求的區(qū)間左端點在[l,mid-1],右端點在[mid,r]的情況,這里其實就是在[l,mid-1]中枚舉左端點,然后在[mid,r]中枚舉右端點。這里關(guān)鍵要注意到,在求[mid,r]內(nèi)的and前綴和以及or前綴和會發(fā)現(xiàn)大部分的值都是相同的,因為1e9的二進制位數(shù)只有大約log(1e9)位,這樣只要把[mid,r]區(qū)間的前綴和的值壓縮一下,數(shù)值相同的一段看作一個數(shù),并把這段長度儲存在cnt數(shù)組中,這樣前綴和長度不會超過log(1e9)。這樣再對[l,mid-1]區(qū)間遍歷一遍,對每個位置再暴力掃一遍[mid,r]的前綴和,復(fù)雜度是O(n*logn)。這樣分治,最后總復(fù)雜度是O(nlognlogn)。

代碼:

#include <bits/stdc++.h>using namespace std;typedef long long ll;const int MAXN = 1e5 + 10;const ll MOD = 1e9 + 7;ll ans;ll a[MAXN], cnt[MAXN], OR[MAXN], AND[MAXN];void solve(int l, int r) {    if (l == r) return;    int mid = (l + r + 1) >> 1;    int pos = mid;    OR[pos] = AND[pos] = a[mid];    cnt[pos] = 1;    for (int i = mid + 1; i <= r; i++) {        if (OR[pos] != (OR[pos] | a[i]) || AND[pos] != (AND[pos] & a[i])) {     //   當前and(or)前綴和與前一個and(or)前綴和不一致。            ++pos;            OR[pos] = OR[pos - 1] | a[i];            AND[pos] = AND[pos - 1] & a[i];            cnt[pos] = 1;        }        else ++cnt[pos];    }    ll resor = a[mid - 1], resand = a[mid - 1];    for (int i = mid - 1; i >= l; i--) {        resor |= a[i];        resand &= a[i];        for (int j = mid; j <= pos; j++) {            ans = (ans + (resor | OR[j]) * (resand & AND[j]) % MOD * cnt[j] % MOD) % MOD;        }    }    solve(l, mid - 1);    solve(mid, r);}int main() {    int n;    scanf("%d", &n);    ans = 0;    for (int i = 1; i <= n; i++) {        scanf("%I64d", &a[i]);        ans = (ans + a[i] * a[i] % MOD) % MOD;    }    solve(1, n);    PRintf("%I64d/n", ans);    return 0;}
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 黄色成人av在线 | 永久免费在线观看av | 91精品福利视频 | 曰批全过程120分钟免费69 | 免费放黄网站在线播放 | www.国产一区.com | 欧美成人毛片 | 成人毛片免费在线 | 极品一级片 | av电影手机在线看 | 草久视频在线观看 | 欧美成人午夜一区二区三区 | 午夜免费网 | 亚洲国产精品久久久久久久久 | 操操日日 | 亚洲小视频在线播放 | 特黄一级小说 | 欧美一级做一a做片性视频 日韩黄色片免费看 | av成人在线观看 | 久久福利精品 | 国产99页| 久久国产成人精品国产成人亚洲 | 欧美成人免费在线视频 | 精品一区二区三区不卡 | 欧美wwwwww| 久草视频免费 | 羞羞视频免费网站含羞草 | 色婷婷一区二区三区 | 国产日产精品一区四区介绍 | 欧美aⅴ在线观看 | 欧美一级毛片欧美一级成人毛片 | 福利在线国产 | 日韩黄色免费电影 | 久草在线视频网 | 高清在线观看av | 黄色免费av | 日本欧美一区二区三区在线播 | 国产91对白叫床清晰播放 | 全黄性色大片 | 亚洲午夜久久久久 | 免费在线观看毛片视频 |