洛谷P3792 由乃与大母神原型和偶像崇拜

P3792 由乃与大母神原型和偶像崇拜

题目背景

由乃最近没事干,去研究轻拍学去了

就是一个叫做flip flappers,轻拍翻转小膜女的番

然后研究的过程中她看到了一个叫做大母神原型的东西

大母神不仅是部落保护神,而且是部落间互相识别的标记(以后泛化为不同的图形符号、服饰和祭祀仪式),在部落联盟出现后,具有领导力的部落神祇,上升为整个联盟的共神,进而成为酋邦和王国的共神

大概就是说这个东西是母系社会时候的偶像,然后象征着母亲可以创造生命也可以毁灭生命什么什么的,分别是善母与恶母,既孕育一切,又吞噬一切

然后我们熟知的神话里面就有大母神,比如女娲其实就是个大母神。。。

原始部落时期的大母神既具有生育和哺乳的能力,也具有保护部落、带来丰收的神力。

到了神话时期,大母神进一步分化,演变出形形色色的女神,分别象征了女性能量的不同面向:孕育女神、大地女神、爱与美女神、保护女神、战争女神、丰收女神、智慧女神、命运女神……

这些是善母

世间的事物总是两面性的:一切生命诞生于土地,最终要回归土地;创造的必然也拥有毁灭的能力。大母神也同样具有痛苦、恐怖、吞噬和危险的一面。

比如童话故事里面的女巫,其实就是大母神的另一面的体现,也就是恶母

糖果屋的故事讲的就是韩赛尔和格雷特被继母赶出家里,因为没饭吃了,然后进了森林发现了一个糖果屋,里面有个女巫,专门吃小孩子

然而如果我们仔细想想这个故事,会发现它没有那么简单

比如说,女巫真的是吃小孩子吗?如果女巫是个善良的老婆婆,无偿救助在森林里面困住的小孩子呢?

还有就是当韩赛尔和格雷特杀死了女巫,回到家中发现她们的继母也死了

这是否意味着她们实际上杀死的是她们的继母?

所以这个故事本质上讲的是她们杀了她们的母亲,也就是打败了大母神

很多神话故事里面都有打败大母神的情节

题目描述

你看到这里也许已经觉得由乃精神不正常了

然而由乃自从不小心##了自己的##后早就不正常了

由乃研究了很久大母神原型,但是仍然一脸懵逼

于是就出数据结构题骗钱去了

由乃:给你一个序列,每次询问一个区间是否是值域连续段

zzy:你把题意说详细点

由乃:就是说不能有重复数字,比如1 2 2 3就不行,然后4 2 3 1就可以

yql:sb分块

ddd:sb bitset

由乃:woc你们好树链啊,我。。我带修

zzq:#######sb题

由乃:我就是要出原题

给你一个序列a

每次两个操作:

1.修改x位置的值为y

2.查询区间l,r是否可以重排为值域上连续的一段

输入输出格式

输入格式:

第一行两个数n,m

第二行n个数表示a[i]

后面m行每行三个数opt x y,或者opt l r,代表操作

输出格式:

如果可以,输出“damushen”

否则输出“yuanxing”

输入输出样例

输入样例#1: 复制
5 5
1 2 3 4 5
2 1 5
2 2 3
2 3 3
1 3 6
2 3 5
输出样例#1: 复制
damushen
damushen
damushen
damushen

说明

对于30%的数据,n,m<=500

对于60%的数据,n,m<=100000

对于100%的数据,n,m<=500000

值域1e9

2s

#include<iostream>
#include<cstdio>
#include<map>
#include<algorithm>
#define maxn 500001
using namespace std;
int a[maxn],n,m,l,r,b[maxn],cnt;
int op,x,y;
bool flag;
map<int,bool>vis;
int main(){
    freopen("Cola.txt","r",stdin);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    for(int i=1;i<=m;i++){
        scanf("%d%d%d",&op,&x,&y);
        if(op==1)a[x]=y;
        if(op==2){
            flag=0;
            cnt=0;
            for(int j=x;j<=y;j++)b[++cnt]=a[j];
            sort(b+1,b+cnt+1);
            for(int j=1,num=b[1];j<=cnt;j++,num++){
                if(b[j]!=num){
                    flag=1;
                    puts("yuanxing");
                    break;
                }
            }
            if(flag==0)puts("damushen");
            continue;
        }
    }
}
70分 暴力
#include<bits/stdc++.h>
const int yql=998244353;
const int N=500010;
const int inf=0x7fffffff;
using namespace std;
typedef long long ll;
int n,m,a[N],mx,mn,x,y,inv;
ll ss,sum;
inline int read(){
    int f=1,x=0;char ch;
    do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');
    do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9');
    return f*x;
}
inline int fpow(int x,int p){
    int ans=1;
    for(;p;p>>=1,x=(1LL*x*x)%yql)if(p&1)ans=(1LL*ans*x)%yql;
    return ans;
}
inline int calc(int x){return 1LL*x*(x+1)%yql*(x<<1|1)%yql*inv%yql;}
struct Segment_Tree{
#define lson (o<<1)
#define rson (o<<1|1)
    int maxv[N<<2],minv[N<<2];
    ll sumv[N<<2],s[N<<2];
    inline void pushup(int o){
        maxv[o]=max(maxv[lson],maxv[rson]);
        minv[o]=min(minv[lson],minv[rson]);
        sumv[o]=(sumv[lson]+sumv[rson])%yql;
        s[o]=s[lson]+s[rson];
    }
    inline void build(int o,int l,int r){
        if(l==r){maxv[o]=minv[o]=s[o]=a[l];sumv[o]=(1LL*a[l]*a[l])%yql;return;}
        int mid=(l+r)>>1;
        build(lson,l,mid);build(rson,mid+1,r);
        pushup(o);
    }
    inline void change(int o,int l,int r,int q,int v){
        if(l==r){maxv[o]=minv[o]=s[o]=v;sumv[o]=(1LL*v*v)%yql;return;}
        int mid=(l+r)>>1;
        if(q<=mid)change(lson,l,mid,q,v);
        else change(rson,mid+1,r,q,v);
        pushup(o);
    }
    inline void query(int o,int l,int r,int ql,int qr){
        if(ql<=l&&r<=qr){
            mx=max(maxv[o],mx);mn=min(mn,minv[o]);sum=(sum+sumv[o])%yql;ss+=s[o];
            return;
        }
        int mid=(l+r)>>1;
        if(ql<=mid)query(lson,l,mid,ql,qr);
        if(qr>mid)query(rson,mid+1,r,ql,qr);
    }
}T;
int main(){
    n=read();m=read();inv=fpow(6,yql-2);
    for(int i=1;i<=n;i++)a[i]=read();
    T.build(1,1,n);
    while(m--){
        int opt=read(),l=read(),r=read();
        if(opt==1)T.change(1,1,n,l,r);
        else{
            mx=0;mn=inf;ss=0;sum=0;
            T.query(1,1,n,l,r);
            if(mx-mn==r-l&&(1LL*(mx+mn)*(r-l+1))>>1==ss&&(calc(mx)-calc(mn-1)+yql)%yql==sum)puts("damushen");
            else puts("yuanxing");
        }
    }
}
100分 线段树
原文地址:https://www.cnblogs.com/thmyl/p/7731702.html