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

zoj 3765 Lights

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

zoj 3765 Lights

#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>#include <vector>#include <queue>#include <set>#include <map>#include <string>#include <math.h>#include <stdlib.h>#include <time.h>using namespace std;#define Key_value ch[ch[root][1]][0]const int MAXN = 300010;int pre[MAXN],ch[MAXN][2],key[MAXN],size[MAXN];int root,tot1;int sum0[MAXN],sum1[MAXN];int st[MAXN]; int s[MAXN],tot2;int a[MAXN];int status[MAXN];int n,q;long long gcd(long long a,long long b){    if(b == 0)return a;    else return gcd(b,a%b);}void NewNode(int &r,int father,int k,int _st){    if(tot2) r = s[tot2--];    else r = ++tot1;    pre[r] = father;    ch[r][0] = ch[r][1] = 0;    key[r] = k;    st[r] = _st;    if(_st == 0){sum0[r] = k; sum1[r] = 0;}    else {sum1[r] = k; sum0[r] = 0;}    size[r] = 1;}void push_up(int r){    int lson = ch[r][0], rson = ch[r][1];    size[r] = size[lson] + size[rson] + 1;    sum0[r] = sum1[r] = 0;    sum0[r] = gcd(sum0[lson],sum0[rson]);    sum1[r] = gcd(sum1[lson],sum1[rson]);    if(st[r])sum1[r] = gcd(sum1[r],key[r]);    else sum0[r] = gcd(sum0[r],key[r]);}void push_down(int r){}void Build(int &x,int l,int r,int father){    if(l > r)return;    int mid = (l + r)/2;    NewNode(x,father,a[mid],status[mid]);    Build(ch[x][0],l,mid-1,x);    Build(ch[x][1],mid+1,r,x);    push_up(x);}void Init(){    root = tot1 = tot2 = 0;    ch[root][0] = ch[root][1] = size[root] = pre[root] = 0;    sum0[root] = sum1[root] = 0;    NewNode(root,0,0,0);    NewNode(ch[root][1],root,0,0);    for(int i = 0;i < n;i++)        scanf("%d%d",&a[i],&status[i]);    Build(Key_value,0,n-1,ch[root][1]);    push_up(ch[root][1]);    push_up(root);}void Rotate(int x,int kind){    int y = pre[x];    push_down(y);    push_down(x);    ch[y][!kind] = ch[x][kind];    pre[ch[x][kind]] = y;    if(pre[y])        ch[pre[y]][ch[pre[y]][1]==y] = x;    pre[x] = pre[y];    ch[x][kind] = y;    pre[y] = x;    push_up(y);}void Splay(int r,int goal){    push_down(r);    while(pre[r] != goal)    {        if(pre[pre[r]] == goal)        { Rotate(r,ch[pre[r]][0] == r);        }        else        { int y = pre[r]; int kind = ch[pre[y]][0] == y; if(ch[y][kind] == r) {     Rotate(r,!kind);     Rotate(r,kind); } else {     Rotate(y,kind);     Rotate(r,kind); }        }    }    push_up(r);    if(goal == 0)root = r;}int Get_kth(int r,int k){    push_down(r);    int t = size[ch[r][0]] + 1;    if(t == k)return r;    if(t > k)return Get_kth(ch[r][0],k);    else return Get_kth(ch[r][1],k-t);}void Insert(int pos,int _val,int _st){    Splay(Get_kth(root,pos+1),0);    Splay(Get_kth(root,pos+2),root);    NewNode(Key_value,ch[root][1],_val,_st);    push_up(ch[root][1]);    push_up(root);}void erase(int r){    if(!r)return;    s[++tot2] = r;    erase(ch[r][0]);    erase(ch[r][1]);}void Delete(int pos){    Splay(Get_kth(root,pos),0);    Splay(Get_kth(root,pos+2),root);    erase(Key_value);    pre[Key_value] = 0;    Key_value = 0;    push_up(ch[root][1]);    push_up(root);}void Change(int pos){    Splay(Get_kth(root,pos),0);    Splay(Get_kth(root,pos+2),root);    st[Key_value] ^= 1;    push_up(Key_value);    push_up(ch[root][1]);    push_up(root);}void Modify(int pos,int _val){    Splay(Get_kth(root,pos),0);    Splay(Get_kth(root,pos+2),root);    key[Key_value] = _val;    push_up(Key_value);    push_up(ch[root][1]);    push_up(root);}int Query(int L,int R,int _st){    int ans ;    Splay(Get_kth(root,L),0);    Splay(Get_kth(root,R+2),root);    if(_st == 0)ans = sum0[Key_value];    else ans = sum1[Key_value];    if(ans == 0)ans = -1;    return ans;}int main(){    while(scanf("%d%d",&n,&q) == 2)    {        Init();        char op[10];        while(q--)        { scanf("%s",op); if(op[0] == 'Q') {     int L,R,_st;     scanf("%d%d%d",&L,&R,&_st);     printf("%dn",Query(L,R,_st)); } else if(op[0] == 'I') {     int pos,val,_st;     scanf("%d%d%d",&pos,&val,&_st);     Insert(pos,val,_st); } else if(op[0] == 'D') {     int pos;     scanf("%d",&pos);     Delete(pos); } else if(op[0] == 'R') {     int pos;     scanf("%d",&pos);     Change(pos); } else if(op[0] == 'M') {     int pos,val;     scanf("%d%d",&pos,&val);     Modify(pos,val); }        }    }    return 0;}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/378147.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

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

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