码迷,mamicode.com
首页 > 其他好文 > 详细

【BZOJ3211&3038】花神游历各国&上帝造题的七分钟2(CodeVS)

时间:2016-01-06 17:34:52      阅读:353      评论:0      收藏:0      [点我收藏+]

标签:

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

SPOJ2713 gss4 数据已加强

思路:线段树并不能区间开方,但直接暴力修改是会超时的,只要加入一点点优化:若是该区间值为0||1那么就不必再修改了,注意也需要左右子树得出父节点。

上帝造题的七分钟2:不保证l<r,然后再加上读入和输出优化,还有开!long!long!少开long long 弄得我百思不得其解。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#define MAXN 100000
using namespace std;
long long lazy[MAXN*5],a[MAXN],b[MAXN*5];
long long segtree[MAXN*5];
int n,m;
long long  getin()
{
    char ch = getchar(); 
    long long  data = 0; 
    while (ch < 0 || ch > 9) 
        ch = getchar(); 
    do 
    { 
        data = data*10 + ch-0; 
        ch = getchar(); 
    } while (ch >= 0 && ch <= 9); 
    return data; 
}
void putout(long long t){
    long long  ans[40]={0},i=0;
    for(;t;t/=10)    ans[++i]=t%10;
    for(;i;i--)    putchar(0+ans[i]);
    putchar(\n);
}
void adddata(int now)
{
    segtree[now]=segtree[(now<<1)]+segtree[(now<<1)+1];
}
void buildtree(int now,int l,int r)
{
    if (l==r)    {segtree[now]=a[l];        if (segtree[now]==1 || segtree[now]==0)    b[now]=1; return;}
    int mid=(l+r)>>1;
    buildtree((now<<1),l,mid);
    buildtree((now<<1)+1,mid+1,r);
    adddata(now);
    b[now]=b[(now<<1)]&b[(now<<1)+1];
}
long long query(int now,int l,int r,int begin,int end)
{
    if (begin<=l && end>=r)    return     segtree[now];
    long long mid=(l+r)>>1,ans=0;
    if (begin<=mid)    ans+=query((now<<1),l,mid,begin,end);
    if (end>mid)    ans+=query((now<<1)+1,mid+1,r,begin,end);
    return ans;
}
void intchange(int now,int l,int r,int begin,int end)
{
    if (b[now]==1)    return;
    if (l==r)    {segtree[now]=floor(sqrt(segtree[now]));    if (segtree[now]==1 || segtree[now]==0)    b[now]=1;    return;}
    int mid=(l+r)>>1;
    if (begin<=mid)    intchange((now<<1),l,mid,begin,end);
    if (end>mid)    intchange((now<<1)+1,mid+1,r,begin,end);
    adddata(now);
    b[now]=b[(now<<1)]&b[(now<<1)+1];
}
int main()
{
    int i;
    long long  x,y,z;
    n=getin();
    for (i=1;i<=n;i++)    a[i]=getin();
    buildtree(1,1,n);
    m=getin();
    for (i=1;i<=m;i++)
    {
        x=getin();
        y=getin();
        z=getin();
        if (y>z)    swap(y,z);
        if (x==1)    putout(query(1,1,n,y,z));
        else    intchange(1,1,n,y,z);
    }
    return 0;
}

 

【BZOJ3211&3038】花神游历各国&上帝造题的七分钟2(CodeVS)

标签:

原文地址:http://www.cnblogs.com/DMoon/p/5106091.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!