zoukankan      html  css  js  c++  java
  • CF498D Traffic Jams in the land

    传送门

    线段树的题……种类特别多。有的时候除了区间以外其实你不知道他和线段树有毛线关系,比如这道题。

    这个题咋做……?首先看到这个题会觉得特别头疼,因为难以处理当前时间的关系,好像除了模拟没什么别的办法。不过看一下数据范围,a[i] <= 6?  

    这么小的话,那么这些数的最小公倍数只有60,那么,所有大于60的时间都可以被取模,我们可以看成是小于60的时间。既然如此……

    那我们可以对于每一个节点都开一个长为60的数组,记录在以i时间开始的情况下走过这一个区域要多长时间,这个就很好维护,如果是倍数的话时间就为2,否则为1.然后,合并也很好想,只要枚举时间,然后一个大区域里所花的时间就是左边区间花的时间+右区间从某一时刻(左区间开始+左区间话费)的时间之和。

    然后我们就可以啦!注意这道题问的是经过的道路,所以对于终点我们要-1(因为到终点不用再走了,否则会计算到下一条路径)

    看一下代码(线段树真神奇,我真菜)

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<algorithm>
    #include<queue>
    #include<cstring>
    #include<utility>
    #include<map>
    #define pr pair<int,int>
    #define mp make_pair
    #define fi first
    #define sc second
    #define rep(i,a,n) for(int i = a;i <= n;i++)
    #define per(i,n,a) for(int i = n;i >= a;i--)
    #define enter putchar('
    ')
    using namespace std;
    typedef long long ll;
    const int M = 100005;
    const int N = 10000005;
    
    int read()
    {
        int ans = 0,op = 1;
        char ch = getchar();
        while(ch < '0' || ch > '9')
        {
        if(ch == '-') op = -1;
        ch = getchar();
        }
        while(ch >='0' && ch <= '9')
        {
        ans *= 10;
        ans += ch - '0';
        ch = getchar();
        }
        return ans * op;
    }
    
    struct seg
    {
        int tim[65];
    }t[M<<2];
    
    int n,q,x,y;
    char s[5];
    
    void pushup(int p)
    {
        rep(i,0,59) t[p].tim[i] = t[p<<1].tim[i] + t[p<<1|1].tim[(i+t[p<<1].tim[i])%60];
    }
    
    void build(int p,int l,int r)
    {
        if(l == r)
        {
        int x = read();
        rep(i,0,59)
        {
            if(i%x) t[p].tim[i] = 1;
            else t[p].tim[i] = 2;
        }
        return;
        }
        int mid = (l+r) >> 1;
        build(p<<1,l,mid),build(p<<1|1,mid+1,r);
        pushup(p);
    }
    
    void modify(int p,int l,int r,int pos,int val)
    {
        if(l == r)
        {
        rep(i,0,59)
        {
            if(i % val) t[p].tim[i] = 1;
            else t[p].tim[i] = 2;
        }
        return;
        }
        int mid = (l+r) >> 1;
        if(pos <= mid) modify(p<<1,l,mid,pos,val);
        else modify(p<<1|1,mid+1,r,pos,val);
        pushup(p);
    }
    
    int query(int p,int l,int r,int kl,int kr,int ti)
    {
        if(l == kl && r == kr) return t[p].tim[ti%60];
        int mid = (l+r) >> 1;
        if(kr <= mid) return query(p<<1,l,mid,kl,kr,ti);
        else if(kl > mid) return query(p<<1|1,mid+1,r,kl,kr,ti);
        else
        {
        int g = query(p<<1,l,mid,kl,mid,ti);
        return g + query(p<<1|1,mid+1,r,mid+1,kr,(ti+g)%60);
        }
    }
    
    int main()
    {
        n = read(),build(1,1,n);
        q = read();
        rep(i,1,q)
        {
        scanf("%s",s);
        if(s[0] == 'A') x = read(),y = read(),printf("%d
    ",query(1,1,n,x,y-1,0));
        else x = read(),y = read(),modify(1,1,n,x,y);
        }
        return 0;
    }
  • 相关阅读:
    Nginx +keepalived
    iptables
    编译安装HTTPD 2.4.9版本
    Apache+lvs高可用+keepalive(主从+双主模型)
    LVS-HA
    corosync+pacemaker实现高可用(HA)集群
    NTP
    私人定制自己的linux小系统
    大数据处理-bitmap是个神马东西
    CSS3制作苹果风格键盘
  • 原文地址:https://www.cnblogs.com/captain1/p/9795257.html
Copyright © 2011-2022 走看看