【并查集分块】Codeforces 475D CGCDSSQ

来源:互联网 发布:2017年网络新项目 编辑:程序博客网 时间:2024/05/01 08:26

题目点这里


bin神说这题和他当年出的一道题差不多TAT

听了半天终于听懂了TAT。。。

利用gcd的递减性 从左往右把一段的gcd和最新的数相同的的放到一个并查集里去。。

可以证明段数是不会增加的 = =


#include <cstdio>#include <iostream>#include <map>using namespace std;const int Nmax = 1e5 + 5;int N, Q;int a[Nmax], f[Nmax], g[Nmax];map <int, long long> m;int find(int x) { return (x == f[x]) ? x : f[x] = find(f[x]); }inline void Union(int u, int v) { f[find(u)] = find(v); }inline int gcd(int a, int b){    if (!b) return a;    for (int t = a % b; t; a = b, b = t, t = a % b);    return b;}int main(){    ios :: sync_with_stdio(false);    cin >> N;    for (int i = 1; i <= N; ++ i) cin >> a[i];    for (int i = 1; i <= N + 1; ++ i) f[i] = i;        for (int i = N; i; -- i) {        int s = i, last = i;        g[i] = a[i];        for (int j = find(i + 1); j <= N; j = find(j + 1)) {            g[j] = gcd(a[i], g[j]);            if (g[j] ^ g[last]) {                m[g[last]] += last - s + 1;                s = last + 1;            }            else Union(last, j);            last = j;        }        m[g[N]] += N - s + 1;    }        for (cin >> Q; Q --; ) {        int x; cin >> x;        cout << m[x] << endl;    }        return 0;}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 工作跨省调动社保怎么办 工作中看到别人违反规定应该怎么办 深户调令过期了怎么办 特岗教师满三年怎么办 特岗教师想辞职怎么办 入职一周想离职怎么办 原单位买断工龄后档案怎么办 北京国企辞职后户口怎么办 工作档案弄丢了怎么办 沈阳大集体职工工龄漏算怎么办 集体职工工龄漏算怎么办 cad打开字体是问号怎么办 cad中字体显示问号怎么办 代扣代缴个税申报逾期申报怎么办 个税申报错了怎么办 个税公司报错了怎么办 个税为0没申报怎么办 建筑老项目无法取得发票怎么办 客户说选的地砖不好看怎么办 外国客户打电话来不敢接怎么办 电话营销遇到不礼貌的客户怎么办 去领导家被拒绝怎么办 共享电车没电了怎么办 享骑电单车没电怎么办 小车前轮刹车卡钳卡死了怎么办 耐克气垫鞋扎了怎么办 骑自行车右大腿根痛怎么办 骑车骑得膝盖疼怎么办 骑了自行车腿疼怎么办 群面没有被问题怎么办 群面没有被提问怎么办 校招解约学校不盖章怎么办 科目三老是跑偏怎么办 面试官说你不好怎么办 面试紧张心态调整不过来怎么办 面试官问缺乏经验怎么办 办好入职手续后就想辞职怎么办 新店长入职应该怎么办 刚入职怀孕了辞职店长不同意怎么办 派遣证丢了怎么办补办 出国留学回来怎么办派遣证