zoj3886(線段樹,區間取模)

2021-08-04 04:53:33 字數 1174 閱讀 8012

因為乙個數最多只需要log(n)次就會變成1,而模數大於他本身,他又不會變化,最次每次o(n)修改區間,最多也不會多過log(n)次,所以複雜度是正確的。暴力修改就好

niconico數:所有比x小的數且與x互質的數,從小到大排列是乙個等差數列,則x為niconico數。

容易證明:niconico數只有三種:素數,2^k(k>1),6。

#include#include#include#include#include#include#include#include#include#include#include#define nl n<<1

#define nr (n<<1)|1

using namespace std;

typedef long long ll;

bool vis[10000010];

int prim[670010];

int tot=0;

void init()

}for(i=2;i<=10000000;i*=2)

vis[i]=true;

vis[6]=true;

}int maxx[100010*4];

int node[100010*4];

int a[100010];

void pushup(int n)

void build(int l,int r,int n)

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

build(l,mid,nl);

build(mid+1,r,nr);

pushup(n);

}void update(int p,int l,int r,int n,int v)

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

if(p<=mid)update(p,l,mid,nl,v);

else update(p,mid+1,r,nr,v);

pushup(n);

}void mod(int p,int q,int l,int r,int n,int v)

pushup(n);

}int query(int p,int q,int l,int r,int n)

int main()

else update(l,1,n,1,r);

}}return 0;

}

線段樹高階 區間取模

題目要求的操作 1 區間求和 2 區間取模 3 單點修改 這道題目不要用到 lazy陣列,因為條件是單點修改,直接修改的葉子節點,其次區間取模操作直接可以暴力。a mod b分為兩種情況 1 a b 2 a b 對於第一種情況 我們不用操作,對自己大的數取模就是自己。第二種情況 取模操作後a的值至少...

ZOJ 1610 線段樹區間染色

給長度8000公尺的板,對其中區間染色,問最後能看到的顏色,和該顏色一共出現了幾段 線段覆蓋法 資料比較水 也可以暴力水過 線段樹 include stdio.h include string.h struct node data 40010 int color 8011 void build in...

ZOJ 1610 (線段樹區間set)

題意 在一段線段上塗色,新塗的顏色會覆蓋舊的,問最後每種顏色各有多少段。思路 線段樹區間覆蓋,最後dfs查詢一遍把每個位置的顏色查詢出來,再掃一遍統計有多少段。include include include include include include include include includ...