hdu 4027 2011上海赛区网络赛 线段树 成段平方根 ***

不能直接使用成段增减的那种,因为一段和的平方根不等于平方根的和,直接记录是否为1,是1就不需要更新了

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<queue>
 7 #include<map>
 8 using namespace std;
 9 #define MOD 1000000007
10 const int INF=0x3f3f3f3f;
11 const double eps=1e-5;
12 typedef long long ll;
13 #define cl(a) memset(a,0,sizeof(a))
14 #define ts printf("*****\n");
15 #define lson l,mid,rt<<1
16 #define rson mid+1,r,rt<<1|1
17 #define root 1,n,1
18 #define mid ((l+r)>>1)
19 const int MAXN=100100;
20 int n,m,t,Min;
21 ll sum[MAXN<<2];
22 int col[MAXN<<2];
23 void pushup(int rt)
24 {
25     sum[rt]=sum[rt<<1]+sum[rt<<1|1];
26     col[rt]=col[rt<<1]&&col[rt<<1|1];
27 }
28 void build(int l,int r,int rt){
29     col[rt]=0;
30     if(l==r)
31     {
32         scanf("%I64d",&sum[rt]);
33         return;
34     }
35     build(lson);
36     build(rson);
37     pushup(rt);
38 }
39 void update(int L,int R,int l,int r,int rt)
40 {
41     if(l==r)
42     {
43         sum[rt]=sqrt(sum[rt]);
44         if(sum[rt]==1)  col[rt]=1;
45         return;
46     }
47     if(L<=mid&&!col[rt<<1])  update(L,R,lson);
48     if(R>mid&&!col[rt<<1|1]) update(L,R,rson);
49     pushup(rt);
50 }
51 ll query(int L,int R,int l,int r,int rt)
52 {
53     if(l>=L&&r<=R)
54     {
55         return sum[rt];
56     }
57     ll ans=0;
58     if(L<=mid)  ans+=query(L,R,lson);
59     if(R>mid) ans+=query(L,R,rson);
60     return ans;
61 }
62 int main()
63 {
64     int i,j,k;
65     #ifndef ONLINE_JUDGE
66     freopen("1.in","r",stdin);
67     #endif
68
69     int ca=1;
70     while(scanf("%d",&n)!=EOF)
71     {
72         build(root);
73         int q;
74         scanf("%d",&q);
75         printf("Case #%d:\n",ca++);
76         int s,L,R;
77         while(q--)
78         {
79             scanf("%d%d%d",&s,&L,&R);
80             if(L>R) swap(L,R);
81             if(s==0)
82             {
83                 update(L,R,root);
84             }
85             else
86             {
87                 ll w=query(L,R,root);
88                 printf("%I64d\n",w);
89             }
90         }
91         printf("\n");
92     }
93 }
时间: 2024-10-28 15:44:15

hdu 4027 2011上海赛区网络赛 线段树 成段平方根 ***的相关文章

hdu 4026 2011上海赛区网络赛F TSP ****

没看过TSP,先mark 1 //4838039 2011-10-27 23:04:15 Accepted 4026 2343MS 31044K 3143 B C++ Geners 2 //状态压缩DP的TSP问题 3 //优先级位运算小于判等 , 还有各种细节各种出错 4 #include <cstdio> 5 #include <cstring> 6 #include <stdlib.h> 7 #define mabs(a) (a>0?a:-(a)) 8 9

hdu 4023 2011上海赛区网络赛C 贪心+模拟

以为是贪心,结果不是,2333 贪心最后对自己绝对有利的情况 点我 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace std; 9 #define MOD 10000000

hdu 4025 2011上海赛区网络赛E 压缩 ***

直接T了,居然可以这么剪枝 题解链接:点我 1 #include<cstdio> 2 #include<map> 3 #include<cstring> 4 #define ll __int64 5 using namespace std; 6 ll a[23],x[23][5],ans; 7 map<ll,ll>p; 8 void dfs(int d,int n,ll res,int f) 9 { 10 if(d==n){ 11 if(f) p[res]+

hdu 4028 2011上海赛区网络赛H dp+map离散

一开始用搜索直接超时,看题解会的 1 #include<iostream> 2 #include<cstdio> 3 #include<map> 4 #include<cstring> 5 #include<cmath> 6 #include<vector> 7 #include<queue> 8 #include<algorithm> 9 #include<set> 10 #define inf

hdu 4031 2011成都赛区网络赛A题 线段树 ***

就是不知道时间该怎么处理,想了好久,看了别人的题解发现原来是暴力,暴力也很巧妙啊,想不出来的那种  -_-! 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace std; 9

hdu 4046 2011北京赛区网络赛G 线段树 ***

还带这么做的,卧槽,15分钟就被A了的题,居然没搞出来 若某位是1,则前两个为wb,这位就是w 1 #include<cstdio> 2 #include<cstring> 3 #define lson l,m,rt<<1 4 #define rson m+1,r,rt<<1|1 5 using namespace std; 6 const int maxn=50010; 7 int n,m,sum[maxn<<2]; 8 char str[ma

hdu 4035 2011成都赛区网络赛E 概率dp ****

太吊了,反正我不会 1 /* 2 HDU 4035 3 4 dp求期望的题. 5 题意: 6 有n个房间,由n-1条隧道连通起来,实际上就形成了一棵树, 7 从结点1出发,开始走,在每个结点i都有3种可能: 8 1.被杀死,回到结点1处(概率为ki) 9 2.找到出口,走出迷宫 (概率为ei) 10 3.和该点相连有m条边,随机走一条 11 求:走出迷宫所要走的边数的期望值. 12 13 设 E[i]表示在结点i处,要走出迷宫所要走的边数的期望.E[1]即为所求. 14 15 叶子结点: 16

hdu 4041 2011北京赛区网络赛F 组合数+斯特林数 ***

插板法基础知识 斯特林数见百科 1 #include<iostream> 2 #include<cmath> 3 #include<cstdio> 4 #include<cstring> 5 #define LL long long 6 #define eps 1e-7 7 #define MOD 1000000007 8 using namespace std; 9 int c[2001][2001]={1},stir2[1005][1005]={1};

hdu 4033 2011成都赛区网络赛 余弦定理+二分 **

二分边长,判断最后内角和是否为2pi,注意l与r的选取,保证能组成三角形 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace std; 9 #define MOD 10000