bzoj 3211

线段树区间开方。。重写一遍就AC了,神马情况。。。。

 1 #include<bits/stdc++.h>
 2 #define inc(i,l,r) for(i=l;i<=r;i++)
 3 #define dec(i,l,r) for(i=l;i>=r;i--)
 4 #define inf 1e9
 5 #define ll long long
 6 #define NM 100000+5
 7 #define mem(a) memset(a,0,sizeof(a))
 8 using namespace std;
 9 int read(){
10     int x=0,f=1;char ch=getchar();
11     while(!isdigit(ch)){if(ch==‘-‘)f=-1;ch=getchar();}
12     while(isdigit(ch))x=x*10+ch-‘0‘,ch=getchar();
13     return x*f;
14 }
15 struct info{
16     ll s;
17     int z;
18     info(int x=0):s((ll)x),z(x<=1){}
19 }T[3*NM];
20 info operator+(const info&x,const info&y){
21     info f;
22     f.s=x.s+y.s;
23     f.z=x.z&&y.z;
24     return f;
25 }
26 int n,m,i,x,t,y;
27 void build(int i,int x,int y){
28     int t=x+y>>1;
29     if(x==y){
30         T[i]=info(read());
31         return;
32     }
33     build(i<<1,x,t);build(i<<1|1,t+1,y);
34     T[i]=T[i<<1]+T[i<<1|1];
35 }
36 void cut(int i,int x,int y,int a,int b){
37     int t=x+y>>1;
38     if(b<x||y<a||T[i].z)return;
39     if(x==y){
40         T[i].s=(ll)sqrt(T[i].s);
41         T[i].z=T[i].s<=1;
42         return;
43     }
44     cut(i<<1,x,t,a,b);cut(i<<1|1,t+1,y,a,b);
45     T[i]=T[i<<1]+T[i<<1|1];
46 }
47 ll sum(int i,int x,int y,int a,int b){
48     int t=x+y>>1;
49     if(b<x||y<a)return 0;
50     if(a<=x&&y<=b)return T[i].s;
51     return sum(i<<1,x,t,a,b)+sum(i<<1|1,t+1,y,a,b);
52 }
53 int main(){
54     n=read();
55     build(1,1,n);
56     m=read();
57     inc(i,1,m){
58         t=read();x=read();y=read();
59         if(t==1)printf("%lld\n",sum(1,1,n,x,y));
60         else cut(1,1,n,x,y);
61     }
62 }

时间: 2024-10-06 14:36:27

bzoj 3211的相关文章

BZOJ 3211 花神游历各国 线段树题解

BZOJ 3211 花神游历各国 线段树题解 3211: 花神游历各国 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 2551  Solved: 946[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

BZOJ 3211 花神游历各国 (树状数组+并查集)

题解:首先,单点修改求区间和可以用树状数组实现,因为开平方很耗时间,所以在这个方面可以优化,我们知道,开平方开几次之后数字就会等于1 ,所以,用数组记录下一个应该开的数,每次直接跳到下一个不是1的数字进行开平方,至于这个数组,可以用并查集维护. #include <cstdio> #include <cmath> #include <iostream> using namespace std; typedef long long LL; LL c[100005]; in

bzoj 3211 花神游历各国

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3211 题解: 线段树区间开根号操作,目前只能通过单点修改来实现,但是发现:一个小于109的数开过5次根号后向下取整就会变成1 所以在每一次开根号操作后判断,如果这个数已经开到1甚至0,则线段树当前结点flag值设为true,以后再访问该结点时不再操作 父结点的flag值可以由两个儿子的flag值按位与得到 只有开根号操作的话代码还是比较简单的 1 #include<cstdio> 2

bzoj 3211 线段树

开方操作最多进行5次就可以把出现的任何数变成1. 所以用线段树暴力修改,以后修改时只需看一下是否当前区间都是0或1,如果是那么就直接返回. 1 /************************************************************** 2 Problem: 3211 3 User: idy002 4 Language: C++ 5 Result: Accepted 6 Time:1976 ms 7 Memory:7068 kb 8 **************

BZOJ 3211: 花神游历各国( 线段树 )

线段树...区间开方...明显是要处理到叶节点的 之前在CF做过道区间取模...差不多, 只有开方, 那么每个数开方次数也是有限的(0,1时就会停止), 最大的数10^9开方10+次也就不会动了.那么我们线段树多记个max就可以少掉很多不必要的操作 -------------------------------------------------------------------------------------------- #include<cstdio> #include<cs

【线段树】【bzoj 3211】花神游历各国

3211: 花神游历各国 Time Limit: 5 Sec Memory Limit: 128 MB Submit: 1508 Solved: 573 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[

BZOJ 3211 花神游历各国 树状数组(线段树)+优化

题意:给你一段区间,然后每个点的初始值都告诉你,现有两种操作,一种是给你一个小区间的左右端点,之后把这个区间内的所有值都开根号,另一种就是区间求值. 方法:树状数组维护求和,巧妙开根号.(线段树) 解析:这道是某次考试考的题- -.当时也没想到快的开根号方法,暴力开根号好像70分吧. 首先要明确一个事情:被开根号的数最大是109,而109开几次会开到1呢?用计算器算一下发现5次就将这个最大的数开到1了,而1开根号怎么开都是1,所以如果再对其进行开根号操作,仅仅是无用的浪费时间了.所以怎么维护这种

BZOJ 3211 弗洛拉前往国家 树阵+并检查集合

标题效果:给定一个序列,它提供了以下操作: 1.将[l.r]每个号码间隔a[i]变sqrt(a[i]) 2.查询[l,r]间隔和 剧烈的变化不支持由间隔,因此,我们选择单 - 点更换间隔查询的树阵,但是,这是O(n^2)的,怎么办? 我们发现一个数x最多开loglogx次根号就会变为1 也就是一个int范围内的数仅仅要开6次根号就会变为1 于是改动的总时间复杂度为O(nloglogn) 可是单次改动怎么办?我们维护一个并查集.一旦一个数为1或0,我们就把这个位置的father设为它右面的那个位置

BZOJ 3211 花神游历各国 树状数组+并查集

题目大意:花神对每一个国家有一个喜爱程度,有的时候他会对连续的一段国家进行访问,求他的喜爱程度的和:有的时候他会对连续的一段国家产生厌恶,喜爱程度变成sqrt(x)下取整. 思路:乍一看好像是RMQ问题,用线段树就可以水过,但是开根号的标记怎么下传?这是一个严重的问题,所以我们要换一个思路. 注意到开根号有一个有趣的性质:sqrt(1) = 1,sqrt(0) = 0,而且所有的数字经过有限次的开根号运算都会变成1.这个性质就很好了.我们对每一个点暴力开根号,然后当这个店的点权变成1的时候就打一