【线段树】Traffic Jams in the Land(CF498D)
生活随笔
收集整理的這篇文章主要介紹了
【线段树】Traffic Jams in the Land(CF498D)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
正題
luogu
CF498D
題目大意
給n個1-6的數(shù),讓你進行以下操作:
解題思路
因為每個數(shù) ≤6\leq 6≤6,所以可以求出1-6的lcm為60,計算時只要知道時間對60取模的結(jié)果就可以知道是否會被整除
考慮使用線段樹,每個點維護當前區(qū)間開始時時間模60的結(jié)果會使用的時間即可
時間復雜度 O(60×nlogn)O(60\times n\ log\ n)O(60×n?log?n)
code
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define ll long long #define N 100100 using namespace std; int n,t,x,y,v[N]; char c[N]; struct node {int a[65]; }; node merge(node a,node b) {node c;for(int i=0;i<60;++i)c.a[i]=a.a[i]+b.a[(i+a.a[i])%60];return c; } struct Tree {#define ls x*2#define rs x*2+1node s[N<<2];void push_up(int x){s[x]=merge(s[ls],s[rs]);return;}void get(int x,int y){for(int i=0;i<60;++i)s[x].a[i]=1;for(int i=0;i*y<60;++i)s[x].a[i*y]=2;return;}void build(int x,int l,int r){if(l==r){get(x,v[l]);return;}int mid=l+r>>1;build(ls,l,mid);build(rs,mid+1,r);push_up(x);return;}void change(int x,int l,int r,int y,int z){if(l==r){get(x,z);return;}int mid=l+r>>1;if(y<=mid)change(ls,l,mid,y,z);else change(rs,mid+1,r,y,z);push_up(x);return;}node ask(int x,int L,int R,int l,int r){if(L==l&&R==r)return s[x];int mid=L+R>>1;if(r<=mid)return ask(ls,L,mid,l,r);else if(l>mid)return ask(rs,mid+1,R,l,r);else return merge(ask(ls,L,mid,l,mid),ask(rs,mid+1,R,mid+1,r));} }T; int main() {scanf("%d",&n);for(int i=1;i<=n;++i)scanf("%d",&v[i]);T.build(1,1,n);scanf("%d",&t);while(t--){scanf("%s%d%d",c,&x,&y);if(c[0]=='C')T.change(1,1,n,x,y);else printf("%d\n",T.ask(1,1,n,x,y-1).a[0]);}return 0; }總結(jié)
以上是生活随笔為你收集整理的【线段树】Traffic Jams in the Land(CF498D)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【随机】Kuroni and the P
- 下一篇: 2023 最后两个月,还有多少能干碎《咕