zoukankan      html  css  js  c++  java
  • 【BZOJ】【3211】花神游历各国

    线段树/暴力


      线段树区间开方

      唉,我傻逼了一下,TLE了一发,因为没考虑到0的情况……

      好吧简单来说一下,线段树动态查询区间和大家都会做……比较麻烦的是这次的修改变成开方了,然而这并没有什么好虚的,注意到权值的范围是$10^9$,我们随手打个表可以发现,对$10^9$不断开根的结果是:1000000000,31622,177,13,3,1。也就是说,每个数,它开根的次数并没有多少(联想一下CF 250的那道区间取模的题!)所以我们维护一个区间最大值,每次暴力对每个数开根就可以了(如果区间最大值为0或1就可以跳过咯)

     1 /**************************************************************
     2     Problem: 3211
     3     User: Tunix
     4     Language: C++
     5     Result: Accepted
     6     Time:1276 ms
     7     Memory:6364 kb
     8 ****************************************************************/
     9  
    10 //BZOJ 3211
    11 #include<vector>
    12 #include<cmath>
    13 #include<cstdio>
    14 #include<cstring>
    15 #include<cstdlib>
    16 #include<iostream>
    17 #include<algorithm>
    18 #define rep(i,n) for(int i=0;i<n;++i)
    19 #define F(i,j,n) for(int i=j;i<=n;++i)
    20 #define D(i,j,n) for(int i=j;i>=n;--i)
    21 #define pb push_back
    22 using namespace std;
    23 inline int getint(){
    24     int v=0,sign=1; char ch=getchar();
    25     while(ch<'0'||ch>'9'){ if (ch=='-') sign=-1; ch=getchar();}
    26     while(ch>='0'&&ch<='9'){ v=v*10+ch-'0'; ch=getchar();}
    27     return v*sign;
    28 }
    29 const int N=1e5+10,INF=~0u>>2;
    30 typedef long long LL;
    31 /******************tamplate*********************/
    32  
    33 int n,m,a[N],mx[N<<2];
    34 LL sm[N<<2];
    35 #define L (o<<1)
    36 #define R (o<<1|1)
    37 #define mid (l+r>>1)
    38 void maintain(int o){
    39     mx[o]=max(mx[L],mx[R]);
    40     sm[o]=sm[L]+sm[R];
    41 }
    42 void build(int o,int l,int r){
    43     if (l==r){mx[o]=sm[o]=a[l];}
    44     else{
    45         build(L,l,mid);
    46         build(R,mid+1,r);
    47         maintain(o);
    48     }
    49 }
    50 void update(int o,int l,int r,int ql,int qr){
    51     if (mx[o]==1 || mx[o]==0) return;
    52     if (l==r){mx[o]=sm[o]=sqrt(mx[o]);}
    53     else{
    54         if (ql<=mid) update(L,l,mid,ql,qr);
    55         if (qr>mid) update(R,mid+1,r,ql,qr);
    56         maintain(o);
    57     }
    58 }
    59 LL ans;
    60 void query(int o,int l,int r,int ql,int qr){
    61     if (ql<=l && qr>=r) ans+=sm[o];
    62     else{
    63         if (ql<=mid) query(L,l,mid,ql,qr);
    64         if (qr>mid) query(R,mid+1,r,ql,qr);
    65     }
    66 }
    67 int main(){
    68 #ifndef ONLINE_JUDGE
    69     freopen("3211.in","r",stdin);
    70     freopen("3211.out","w",stdout);
    71 #endif
    72     n=getint();
    73     F(i,1,n) a[i]=getint();
    74     build(1,1,n);
    75     m=getint();
    76     F(i,1,m){
    77         int cmd=getint(),l=getint(),r=getint();
    78         if (cmd==1){
    79             ans=0;
    80             query(1,1,n,l,r);
    81             printf("%lld
    ",ans);
    82         }else update(1,1,n,l,r);
    83     }
    84     return 0;
    85 }
    View Code

    3211: 花神游历各国

    Time Limit: 5 Sec  Memory Limit: 128 MB
    Submit: 1327  Solved: 511
    [Submit][Status][Discuss]

    Description

     

    Input

     

    Output

    每次x=1时,每行一个整数,表示这次旅行的开心度

    Sample Input

    4
    1 100 5 5
    5
    1 1 2
    2 1 2
    1 1 2
    2 2 3
    1 1 4

    Sample Output

    101
    11
    11

    HINT

    对于100%的数据, n ≤ 100000,m≤200000 ,data[i]非负且小于10^9


    Source

    [Submit][Status][Discuss]
  • 相关阅读:
    html基础教程2
    HTML的基础教程
    JS中响应函数和for循环执行问题
    Cookie显示上次访问时间出现错误的问题
    完全卸载VSCode--解决卸载重新安装后还有原来配置的问题
    servlet中输出HTML标签浏览器不能正常显示
    Java中Servlet输出中文乱码问题
    eclipse下配置Tomcat(没有Tomcat8及以上版本问题)
    Java多线程通信之wait()和notify()方法
    Java中synchronize关键字
  • 原文地址:https://www.cnblogs.com/Tunix/p/4584152.html
Copyright © 2011-2022 走看看