日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

BZOJ2743 [HEOI2012]采花 【离线 + 树状数组】

發布時間:2025/3/15 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BZOJ2743 [HEOI2012]采花 【离线 + 树状数组】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目

蕭蕓斕是Z國的公主,平時的一大愛好是采花。
今天天氣晴朗,陽光明媚,公主清晨便去了皇宮中新建的花園采花?;▓@足夠大,容納了n朵花,花有c種顏色(用整數1-c表示),且花是排成一排的,以便于公主采花。公主每次采花后會統計采到的花的顏色數,顏色數越多她會越高興!同時,她有一癖好,她不允許最后自己采到的花中,某一顏色的花只有一朵。為此,公主每采一朵花,要么此前已采到此顏色的花,要么有相當正確的直覺告訴她,她必能再次采到此顏色的花。由于時間關系,公主只能走過花園連續的一段進行采花,便讓女仆福涵潔安排行程。福涵潔綜合各種因素擬定了m個行程,然后一一向你詢問公主能采到多少朵花(她知道你是編程高手,定能快速給出答案!),最后會選擇令公主最高興的行程(為了拿到更多獎金!)。

輸入格式

第一行四個空格隔開的整數n、c以及m。接下來一行n個空格隔開的整數,每個數在[1, c]間,第i個數表示第i朵花的顏色。接下來m行每行兩個空格隔開的整數l和r(l ≤ r),表示女仆安排的行程為公主經過第l到第r朵花進行采花。

輸出格式

共m行,每行一個整數,第i個數表示公主在女仆的第i個行程中能采到的花的顏色數。

輸入樣例

5 3 5

1 2 2 3 1

1 5

1 2

2 2

2 3

3 5

輸出樣例

2

0 0 1 0
【樣例說明】

詢問[1, 5]:公主采顏色為1和2的花,由于顏色3的花只有一朵,公主不采;詢問[1, 2]:顏色1和顏色2的花均只有一朵,公主不采;

詢問[2, 2]:顏色2的花只有一朵,公主不采;

詢問[2, 3]:由于顏色2的花有兩朵,公主采顏色2的花;

詢問[3, 5]:顏色1、2、3的花各一朵,公主不采。

提示

【數據范圍】

對于100%的數據,1 ≤ n ≤ 10^6,c ≤ n,m ≤10^6。

題解

考慮離線,按左端點排序
每種顏色只產生一個貢獻而且必須有兩個
那么我們在每種顏色第二次出現的地方+1
然后從左開始掃,每到一個顏色就對該顏色next的位置-1,next的next位置+1,順便算出以當前位置為左端點的答案

#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define LL long long int #define REP(i,n) for (int i = 1; i <= (n); i++) #define lbt(x) (x & -x) using namespace std; const int maxn = 1000005,maxm = 100005,INF = 1000000000; inline int RD(){int out = 0,flag = 1; char c = getchar();while (c < 48 || c > 57) {if (c == '-') flag = -1; c = getchar();}while (c >= 48 && c <= 57) {out = (out << 1) + (out << 3) + c - '0'; c = getchar();}return out * flag; } int Last[maxn],nxt[maxn],s[maxn],c[maxn],ans[maxn],N,C,M; void add(int u,int v){if (u) while (u <= N) s[u] += v,u += lbt(u);} int query(int u){int ans = 0; while (u) ans += s[u],u -= lbt(u); return ans;} int sum(int l,int r){return query(r) - query(l - 1);} struct Que{int l,r,id;}Q[maxn]; inline bool operator <(const Que& a,const Que& b){return a.l < b.l;} int main(){N = RD(); C = RD(); M = RD();REP(i,N){c[i] = RD();if (Last[c[i]]) nxt[Last[c[i]]] = i;Last[c[i]] = i;}memset(Last,0,sizeof(Last));REP(i,N) if (nxt[i] && !Last[c[i]]) Last[c[i]] = i,add(nxt[i],1);REP(i,M) Q[i].l = RD(),Q[i].r = RD(),Q[i].id = i;sort(Q + 1,Q + 1 + M); int j = 0;REP(i,N){while (Q[j + 1].l == i) ans[Q[++j].id] = query(Q[j].r);if (nxt[i]) add(nxt[i],-1);if (nxt[nxt[i]]) add(nxt[nxt[i]],1);}REP(i,M) printf("%d\n",ans[i]);return 0; }

轉載于:https://www.cnblogs.com/Mychael/p/8282719.html

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的BZOJ2743 [HEOI2012]采花 【离线 + 树状数组】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。