栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

zoj 3800 Calculation

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

zoj 3800 Calculation

#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<algorithm>#include<map>#include<queue>#include<stack>#include<set>#include<cmath>#include<vector>#define inf 0x3f3f3f3f#define Inf 0x3FFFFFFFFFFFFFFFLL#define eps 1e-8#define pi acos(-1.0)using namespace std;typedef long long ll;const int maxn = 100000+10;int a[maxn],conv[maxn],GS[55],n,m,Q,tot;pair<int,int>Sp[maxn];ll ans[maxn];struct Node{    int L,g,id;    Node(){}    Node(int L,int g,int id):L(L),g(g),id(id){}};vector<Node>querys[maxn];int gcd(int a,int b) {return b==0?a:gcd(b,a%b);}struct SegTree{    ll sum[maxn<<2];    int addv[maxn<<2];    void build(int l,int r,int rt)    {        sum[rt] = addv[rt] = 0;        if(l == r) return ;        int m =(l + r)>>1;        build(l,m,rt<<1);        build(m+1,r,rt<<1|1);    }    void PushUp(int rt)    {        sum[rt] = sum[rt<<1] + sum[rt<<1|1];    }    void PushDown(int l,int r,int rt)    {        if(addv[rt])        { addv[rt<<1] += addv[rt]; addv[rt<<1|1] += addv[rt]; int m = (l + r)>>1; sum[rt<<1] += (ll)addv[rt]*(m-l+1); sum[rt<<1|1] += (ll)addv[rt]*(r-m); addv[rt] = 0;        }    }    void Update(int L,int R,int l,int r,int rt)    {        if(l >= L && r <= R)        { addv[rt] ++; sum[rt] += (r-l+1); return ;        }        PushDown(l,r,rt);        int m = (l + r)>>1;        if(m >= L) Update(L,R,l,m,rt<<1);        if(m < R) Update(L,R,m+1,r,rt<<1|1);        PushUp(rt);    }    ll Query(int L,int R,int l,int r,int rt)    {        if(l >= L && r <= R) return sum[rt];        PushDown(l,r,rt);        int m = (l+r)>>1;        ll res = 0;        if(m >= L) res += Query(L,R,l,m,rt<<1);        if(m < R) res += Query(L,R,m+1,r,rt<<1|1);        return res;    }}tree[51];void solve(){    tot = 0;    for(int i = 0;i < m;++i)        tree[i].build(1,n,1);    int tmp,pos,L,R;    Node node;    for(int i = 1;i <= n;++i)    {        for(int j = 0;j < tot;++j)        { tmp = gcd(Sp[j].first,a[i]); Sp[j].first = tmp;        }        if(tot > 0 && Sp[tot-1].first == a[i]) Sp[tot-1].second++;        else Sp[tot++] = make_pair(a[i],1);        if(tot)        { tmp = 1; for(int j = 1;j < tot;++j) {     if(Sp[j].first == Sp[tmp-1].first)         Sp[tmp-1].second += Sp[j].second;     else         Sp[tmp++] = Sp[j]; } tot = tmp;        }        int cnt = 0;        for(int j = 0;j < tot;++j)        { tmp = Sp[j].first; pos = conv[tmp]; if(pos != -1) {     L = cnt + 1;     R = cnt + Sp[j].second;     tree[pos].Update(L,R,1,n,1); } cnt += Sp[j].second;        }        for(int j = 0; j < (int)querys[i].size();++j)        { node = querys[i][j]; ans[node.id] = tree[conv[node.g]].Query(node.L,i,1,n,1);        }    }}int main(){    while(~scanf("%d%d%d",&n,&m,&Q))    {        memset(conv,0xff,sizeof(conv));        for(int i = 0;i <= n;++i) querys[i].clear();        for(int i = 1;i <= n;++i) scanf("%d",&a[i]);        for(int i = 0;i < m;++i)        { scanf("%d",&GS[i]); conv[GS[i]] = i;        }        int L,R,g;        for(int i = 1;i <= Q;++i)        { scanf("%d%d%d",&L,&R,&g); L++; querys[R].push_back(Node(L,g,i));        }        solve();        for(int i = 1;i <= Q;++i) printf("%lldn",ans[i]);    }    return 0;}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/369007.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号