hdu 5239 Doom

题意:给n个数,每次查询[l,r]的和,然后[l,r]之间的数都会由ai变为ai^2,开始计数器为0,每次在上一次的基础上,为计数器+sum[l,r],答案%9223372034707292160

分析:猜想一个数的平方%p应该会很快进入静止,即ai^2%p=ai,这样这个数就不会更新,用java跑了一发,发现最多更新29次,其实这个无所谓,猜想到这个性质就可以了,然后就是解决下一个问题,mod^2很大,long long也存不下,解决了这个问题,我想剩下的就很简单了,a*a=a个a相加,使用类似于快速幂的形式,求a个a相加并对mod取模的值,用一个lay[rt]表示该节点代表的子树不会被更新,这样就Ok了,裸的线段树

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#include<bits/stdc++.h>
#define mmid int mid=(l+r)>>1
#define lson rt*2
#define rson rt*2+1
using namespace std;
typedef long long ll;
const ll mod=9223372034707292160LL;
const int maxn=1e5+5;
ll sum[maxn<<2];
bool lay[maxn<<2];
int ql,qr;
inline bool isdight(char c){return c>='0'&&c<='9';}
 
void read(ll &res){
    char c=getchar();
    res=0;
    while(!isdight(c))c=getchar();
    while(isdight(c))res=res*10+c-'0',c=getchar();
}
 
void read(int &res){
    char c=getchar();
    res=0;
    while(!isdight(c))c=getchar();
    while(isdight(c))res=res*10+c-'0',c=getchar();
}
 
inline void Mod(ll &x){if(x>=mod)x%=mod;}
 
void build(int rt,int l,int r){
    lay[rt]=0;
    if(l==r){
        read(sum[rt]);//scanf("%lld",sum+rt);
        return ;
    }
    mmid;
    build(lson,l,mid);
    build(rson,mid+1,r);
    sum[rt]=(sum[lson]+sum[rson]);Mod(sum[rt]);
}
 
ll pow_add(ll a){
    ll res=0,t=a,k=a;
    while(k){
        if(k&1)res=(t+res),Mod(res);
        t=(t+t);Mod(t);
        k=k>>1;
    }
    return res;
}
 
ll query(int rt,int l,int r){
    if(ql<=l&&qr>=r)return sum[rt];
    mmid;
    ll res=0;
    if(ql<=mid)res=(res+query(lson,l,mid)),Mod(res);
    if(qr>mid)res=(res+query(rson,mid+1,r)),Mod(res);
    return res;
}
 
void modify(int rt,int l,int r){
 
    if(lay[rt])return ;
    if(l==r){
        ll t=pow_add(sum[rt]);
        if(t==sum[rt])lay[rt]=1;
        else sum[rt]=t;
        return ;
    }
    mmid;
    if(ql<=mid&&!lay[lson])modify(lson,l,mid);
    if(qr>mid&&!lay[rson])modify(rson,mid+1,r);
    lay[rt]=(lay[lson]|lay[rson]);
    sum[rt]=(sum[lson]+sum[rson]);Mod(sum[rt]);
}
 
int main(){
 
    int t,n,q,cas=1,l,r;
    read(t);
    while(t--){
        read(n);read(q);
        build(1,1,n);
        printf("Case #%d:\n",cas++);
        ll s=0;
        while(q--){
            read(ql);read(qr);
            s=(s+query(1,1,n));Mod(s);
            printf("%lld\n",s);
            modify(1,1,n);
        }
    }
    return 0;
}

  

posted @   N维解析几何  阅读(203)  评论(0编辑  收藏  举报
编辑推荐:
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
阅读排行:
· 本地部署 DeepSeek:小白也能轻松搞定!
· 如何给本地部署的DeepSeek投喂数据,让他更懂你
· 从 Windows Forms 到微服务的经验教训
· 李飞飞的50美金比肩DeepSeek把CEO忽悠瘸了,倒霉的却是程序员
· 超详细,DeepSeek 接入PyCharm实现AI编程!(支持本地部署DeepSeek及官方Dee
点击右上角即可分享
微信分享提示