洛谷P4145上帝造題的七分鐘 區間修改

2022-05-12 12:58:09 字數 2103 閱讀 2667

題目:

區間開平方,可以發現其實開幾次就變成1,不需要開了,所以標記一下,每次只去開需要開的地方;

原來寫的並查集跳過1或0,然而wa...其實是沒有記錄原陣列的值,因為樹狀陣列存的是修改量;

(如果a陣列《原陣列》開int會re!)

改成線段樹,本來想著是這一段區間和只要小於等於其長度就可以跳過了,然而仔細想想完全不是,應為可能有多個0什麼的;

所以直接開bool陣列標記一下就好了;

不需要pushdown,直接去修改或是跳過。

並查集:

#include#include

#include

using

namespace

std;

typedef

long

long

ll;int

const maxn=100005

;int

n,m,a[maxn],fa[maxn];

ll f[maxn];

int find(int

x)void add(int

x,ll y)

void update(int

x)ll query(

intx)

intmain()

//for(int i=1;i<=n;i++)

//printf("%lld ",f[i]);

//printf("\n");

fa[n+1]=n+1

; scanf("%d

",&m);

while(m--)

}if(t==1

)

}return0;

}

囧**如下:

#include#include

#include

using

namespace

std;

typedef

long

long

ll;int

const maxn=100005

;int

n,m;

ll tr[maxn

<<2

],a[maxn];

bool tg[maxn<<2

];void pushup(int

nw)//

void pushdown(int l,int r,int nw)

////

while(lz[nw])

////

int mid=((l+r)>>1);

//if(tr[nw<<1]>mid-l+1)pushdown(l,mid,nw<<1);

//if(tr[nw<<1|1]>r-mid)pushdown(mid+1,r,nw<<1|1);

//pushup(nw);

//lz[nw]--;//}

//}void update(int l,int r,int l,int r,int

nw)

int mid=((l+r)>>1

);

if(mid>=l)update(l,mid,l,r,nw<<1

);

if(mid1,r,l,r,nw<<1|1

); pushup(nw);

}ll query(

int l,int r,int l,int r,int

nw)

int mid=((l+r)>>1

);

if(mid>=l)sum+=query(l,mid,l,r,nw<<1

);

if(mid1,r,l,r,nw<<1|1

);

return

sum;

}void build(int l,int r,int

nw)

int mid=((l+r)>>1

); build(l,mid,nw

<<1

); build(mid+1,r,nw<<1|1

); pushup(nw);

}int

main()

return0;

}

P4145 上帝造題的七分鐘2 花神遊歷各國

xlk覺得 上帝造題的七分鐘 不太過癮,於是有了第二部。第一分鐘,x說,要有數列,於是便給定了乙個正整數數列。第二分鐘,l說,要能修改,於是便有了對一段數中每個數都開平方 下取整 的操作。第三分鐘,k說,要能查詢,於是便有了求一段數的和的操作。第四分鐘,彩虹喵說,要是noip難度,於是便有了資料範圍...

P4145 上帝造題的七分鐘2 花神遊歷各國

題目背景 xlk覺得 上帝造題的七分鐘 不太過癮,於是有了第二部。題目描述 第一分鐘,x說,要有數列,於是便給定了乙個正整數數列。第二分鐘,l說,要能修改,於是便有了對一段數中每個數都開平方 下取整 的操作。第三分鐘,k說,要能查詢,於是便有了求一段數的和的操作。第四分鐘,彩虹喵說,要是noip難度...

P4145 上帝造題的七分鐘 2 花神遊歷各國

include include include include include include include include include include using namespace std typedef long long ll const int n 1e6 5 ll a n stru...