題目:
區間開平方,可以發現其實開幾次就變成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...