3211: 花神游历各国
Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 1541 Solved: 585
[ 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
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
11
11
HINT
对于100%的数据, n ≤ 100000,m≤200000 ,data[i]非负且小于10^9
Source
好吧,原本做过类似的原题,,可按原来的写法怎么都不过,可能就像上一行的说的,数据加强了吧,弱啊
ac代码
/**************************************************************
Problem: 3211
User: kxh1995
Language: C++
Result: Accepted
Time:1920 ms
Memory:5504 kb
****************************************************************/
#include<stdio.h>
#include<string.h>
#include<math.h>
struct s
{
long long sum;
int flag;
}node[400100];
void build_tr(int l,int r,int tr)
{
if(l==r)
{
scanf("%lld",&node[tr].sum);
if(node[tr].sum==0||node[tr].sum==1)
node[tr].flag=1;
return;
}
int m=(l+r)>>1;
build_tr(l,m,tr<<1);
build_tr(m+1,r,tr<<1|1);
node[tr].sum=node[tr<<1].sum+node[tr<<1|1].sum;
node[tr].flag=node[tr<<1].flag&node[tr<<1|1].flag;
}
void update(int L,int R,int l,int r,int tr)
{
if(node[tr].flag==1)
return;
if(l==r)
{
node[tr].sum=(long long)sqrt((double)node[tr].sum);
if(node[tr].sum==1||node[tr].sum==0)
node[tr].flag=1;
return;
}
int m=(l+r)>>1;
if(L<=m)
{
update(L,R,l,m,tr<<1);
}
if(m<R)
{
update(L,R,m+1,r,tr<<1|1);
}
node[tr].sum=node[tr<<1].sum+node[tr<<1|1].sum;
node[tr].flag=node[tr<<1].flag&node[tr<<1|1].flag;
}
long long query(int L,int R,int l,int r,int tr)
{
if(L<=l&&r<=R)
{
return node[tr].sum;
}
int m=(l+r)>>1;
long long ans=0;
if(L<=m)
ans+=query(L,R,l,m,tr<<1);
if(m<R)
ans+=query(L,R,m+1,r,tr<<1|1);
return ans;
}
int main()
{
int n,c=0;;
while(scanf("%d",&n)!=EOF)
{
build_tr(1,n,1);
int q;
scanf("%d",&q);
while(q--)
{
int c,a,b;
scanf("%d%d%d",&c,&a,&b);
if(a>b)
{
int t=a;
a=b;
b=t;
}
if(c==2)
{
update(a,b,1,n,1);
}
else
{
printf("%lld\n",query(a,b,1,n,1));
}
}
}
}