題目連線:
題意:給你n個數,然後給你m個詢問,每個詢問包含乙個l 乙個r,問你lr 這個區間中任意兩個數最大的公約數。
思路:以為是l,r所以,只跟l後面的有關,所以把詢問排序,陣列a從後往前列舉約數,標記下這個約數最早出現的位置,如果這個約數出現了,那就讓這個數更新一下最大的儲存在樹狀陣列中,如果沒出現,那麼就標記一下位置就好~這樣的後面的答案會影響前面的但是前面的不會影響後面的。
1 #include 2 #includeview code3 #include 4 #include 5 #include 6 #include 7 #include 8
#define loop(s,i,n) for(i = s;i < n;i++)
9#define cl(a,b) memset(a,b,sizeof(a))
10#define lowbit(x) x&-x
11using
namespace
std;
12struct
node
13q[50050
];16
intn;
17int cmp(const
struct node a,const
struct
node b)
1821
22int a[50050
];23
int pre[50050
];24
int c[50050
];25
26void update(int x,int
d)2733}
3435
int getres(int
x)36
4344
return
res;
4546}47
int ans[50050
];48
intmain()
4972
73 sort(q,q+m,cmp);
7475 cl(c,0
);76 cl(pre,-1
);77
78for(i = n;i > 0; i--)
7995}96
}97while(cnt < m && q[cnt].l ==i)
98102
}103
104 loop(0
,i,m)
105 printf("
%d\n
",ans[i]);
106}
107}
108return0;
109 }
Binary Indexed Tree 樹狀陣列
做leetcode 做到meetingroomii的時候我知道不用線段樹或者樹狀陣列是不太好搞了。還是來學習一下吧。樹狀陣列算是線段樹的一種特殊情況 子集 所以樹狀陣列能解決的問題線段樹一定能做,但線段樹能做的樹狀陣列不一定能做。對乙個陣列進行如下操作 update i1,i2,operation ...
數星星 樹狀陣列
題目描述 天空中有一些星星,這些星星都在不同的位置,每個星星有個座標。如果乙個星星的左下方 包含正左和正下 有 k 顆星星,就說這顆星星是 k 級的。例如,上圖中星星 5 是 3 級的 1,2,4 在它左下 星星 2,4 是 1 級的。例圖中有 1 個 0 級,2 個 1 級,1 個 2 級,1 個...
數星星(樹狀陣列)
天空中有一些星星,這些星星都在不同的位置,每個星星有個座標。如果乙個星星的左下方 包含正左和正下 有 k 顆星星,就說這顆星星是 k 級的。例如,上圖中星星 5 是 3 級的 1,2,4 在它左下 星星 2,4 是 1 級的。例圖中有 1 個 0 級,2 個 1 級,1 個 2 級,1 個 3 級的...