HDU 4777 Rabbit Kingdom(樹狀數組)

來源:互聯網
上載者:User

標籤:style   blog   http   color   io   os   ar   for   sp   

HDU 4777 Rabbit Kingdom

題目連結

題意:給定一些序列,每次詢問一個區間,求出這個區間和其他數字都互質的數的個數

#include <cstdio>#include <cstring>#include <algorithm>#include <vector>using namespace std;const int INF = 0x3f3f3f3f;typedef long long ll;const ll N = 200005;int n, m, vis[N], prime[N], pn = 0;void getprime() {for (ll i = 2; i < N; i++) {if (vis[i]) continue;prime[pn++] = i;for (ll j = i * i; j < N; j += i)vis[j] = 1;}}vector<int> g[N];void getfac(int i) {g[i].clear();int tmp;scanf("%d", &tmp);for (int j = 0; j < pn && prime[j] * prime[j] <= tmp; j++) {if (tmp % prime[j] == 0) {g[i].push_back(prime[j]);while (tmp % prime[j] == 0) tmp /= prime[j];}}if (tmp != 1) g[i].push_back(tmp);}int v[N], L[N], R[N], ans[N], bit[N];struct Query {int l, r, id;} q[N];bool cmp(Query a, Query b) {return a.r < b.r;}#define lowbit(x) (x&(-x))void add(int x, int v) {if (x == 0) return;while (x < N) {bit[x] += v;x += lowbit(x);}}int get(int x) {int ans = 0;while (x) {ans += bit[x];x -= lowbit(x);}return ans;}int get(int l, int r) {return get(r) - get(l - 1);}vector<int> sv[N];int main() {getprime();while (~scanf("%d%d", &n, &m) && n) {memset(v, 0, sizeof(v));for (int i = 1; i <= n; i++) {getfac(i);int left = 0;for (int j = 0; j < g[i].size(); j++) {left = max(left, v[g[i][j]]);v[g[i][j]] = i;}L[i] = left;}memset(v, INF, sizeof(v));for (int i = n; i >= 1; i--) {int right = n + 1;for (int j = 0; j < g[i].size(); j++) {right = min(right, v[g[i][j]]);v[g[i][j]] = i;}R[i] = right;}for (int i = 0; i < m; i++) {scanf("%d%d", &q[i].l, &q[i].r);q[i].id = i;}for (int i = 1; i <= n; i++) sv[i].clear();for (int i = 1; i <= n; i++) sv[R[i]].push_back(i);sort(q, q + m, cmp);memset(bit, 0, sizeof(bit));int u = 1;for (int i = 0; i < m; i++) {while (u <= n && u <= q[i].r) {add(L[u], 1);for (int j = 0; j < sv[u].size(); j++) {int pv = sv[u][j];add(L[pv], -1);add(pv, 1);}u++;}ans[q[i].id] = q[i].r - q[i].l + 1 - get(q[i].l, q[i].r);}for (int i = 0; i < m; i++)printf("%d\n", ans[i]);}return 0;}

思路:現處理出每個位置的Li,Ri表示最多向左向右能有多少是保持都互質的,然後把詢問按右區間排序,從左往右每次加入該位置的左端點Li,每次詢問就詢問滿足Li,Ri都包含在這個區間內,所以詢問Li到Ri的個數代表不滿足的個數,然後每次到一個端點,如果有之前位置的Ri是這個位置,那麼就把那個位置的Li減掉,並且標記掉這個點已經不可能符合標記為1

代碼:


HDU 4777 Rabbit Kingdom(樹狀數組)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.