日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【线段树】Traffic Jams in the Land(CF498D)

發(fā)布時(shí)間:2023/12/3 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【线段树】Traffic Jams in the Land(CF498D) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

正題

luogu
CF498D


題目大意

給n個(gè)1-6的數(shù),讓你進(jìn)行以下操作:

  • 修改其中一個(gè)數(shù)
  • 從第x個(gè)數(shù)走到第y個(gè)數(shù)(x≤yx\leq yxy),到達(dá)一個(gè)點(diǎn)時(shí),如果當(dāng)前時(shí)間能被該數(shù)整除,那么時(shí)間+2,否則+1(初始時(shí)間為0),問走到y(tǒng)的時(shí)間

  • 解題思路

    因?yàn)槊總€(gè)數(shù) ≤6\leq 66,所以可以求出1-6的lcm為60,計(jì)算時(shí)只要知道時(shí)間對60取模的結(jié)果就可以知道是否會被整除

    考慮使用線段樹,每個(gè)點(diǎn)維護(hù)當(dāng)前區(qū)間開始時(shí)時(shí)間模60的結(jié)果會使用的時(shí)間即可

    時(shí)間復(fù)雜度 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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。