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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HDU 4358 Boring Counting ★★(2012 Multi-University Training Contest 6)

發(fā)布時(shí)間:2023/12/19 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HDU 4358 Boring Counting ★★(2012 Multi-University Training Contest 6) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
問題抽象區(qū)間內(nèi)恰好出現(xiàn)K次的數(shù)的個(gè)數(shù)。 ------------------------------------------------------------------ UESTC出的題就是神啊T_T。。。一開始想了個(gè)函數(shù)式線段樹方法后來發(fā)現(xiàn)錯(cuò)了=。=,然后也沒什么思路,就是找著官方題解的方法做的。 思路: 題解說的用樹狀數(shù)組,這里當(dāng)然也可以用線段樹維護(hù),和上面一樣,線段樹第j個(gè)數(shù)表示區(qū)間[j, i]內(nèi)出現(xiàn)k次的數(shù)有多少個(gè),然后像題解一樣維護(hù)即可。(這種維護(hù)方法值得好好研究&&學(xué)習(xí)呀~) 代碼中也有比較詳細(xì)的注釋: #include #include #include #include #include #include #include #include #include #include #include #define MID(x,y) ((x+y)>>1)using namespace std; const int maxn = 100100;int id,n,K; int ans[maxn]; int w[maxn],wb[maxn]; int vis[maxn]; int a[maxn]; //線性權(quán)值 int l[maxn],r[maxn]; //線性區(qū)間 vector v[maxn]; //邊表 vector pos[maxn]; //記錄某數(shù)出現(xiàn)的位置 int num[maxn]; //記錄某個(gè)數(shù)出現(xiàn)多少次了 map M; //離散化 int mtot;struct ANS {int l,r;int id; }Q[maxn];bool cmp(ANS a1, ANS a2) {return a1.r ::iterator vp;if (v[x].size())for (vp = v[x].begin(); vp != v[x].end(); vp ++)dfs(*vp);r[x] = id;} }int sum[maxn<<2],add[maxn<<2]; void build(int l,int r,int rt) {sum[rt] = 0;add[rt] = 0;if (l == r) return ;int mid = MID(l,r);build(l,mid,rt<<1);build(mid+1,r,rt<<1|1); } void pushdown(int rt,int w) {if (add[rt]){add[rt<<1] += add[rt];add[rt<<1|1] += add[rt];sum[rt<<1] += add[rt] * (w - (w >> 1));sum[rt<<1|1] += add[rt] * (w >> 1);add[rt] = 0;} } void update(int s,int t,int v,int l,int r,int rt) {if (s <= l && r <= t){sum[rt] += v * (r - l + 1);add[rt] += v;return ;}pushdown(rt, r-l+1);int mid = MID(l,r);if (s <= mid) update(s,t,v,l,mid,rt<<1);if (mid < t) update(s,t,v,mid+1,r,rt<<1|1); } int query(int p,int l,int r,int rt) {if (l == p && r == p){return sum[rt];}pushdown(rt,r-l+1);int mid = MID(l,r);if (p <= mid) return query(p,l,mid,rt<<1);else return query(p,mid+1,r,rt<<1|1); } int main() {//freopen("data.txt","r+",stdin);int tt,caseo = 1;scanf("%d",&tt);while(tt--){//Initializemtot = id = 0;memset(v,0,sizeof(v));memset(vis,0,sizeof(vis));memset(pos,0,sizeof(pos));memset(num,0,sizeof(num));//inputprintf("Case #%d:\n",caseo ++);scanf("%d%d",&n,&K);for (int i = 1; i <= n; i ++)scanf("%d",&w[i]);for (int i = 1; i < n; i ++){int a,b;scanf("%d%d",&a,&b);v[a].push_back(b); //邊表}//樹形結(jié)構(gòu)轉(zhuǎn)線性結(jié)構(gòu)dfs(1);M.clear();//權(quán)值離散化for (int i = 1; i <= n; i ++)if (!M[a[i]]) M[a[i]] = ++ mtot;int q;scanf("%d",&q);for (int i = 0; i < q; i ++){int p;scanf("%d",&p);Q[i].l = l[p];Q[i].r = r[p];Q[i].id = i;}sort(Q,Q+q,cmp);int pt = 0;build(1,n,1);for (int i = 1; i <= n; i ++){pos[M[a[i]]].push_back(i);num[M[a[i]]] ++;if (num[M[a[i]]] >= K)if (num[M[a[i]]] == K)update(1,pos[M[a[i]]][0],1,1,n,1);else{int ss = (num[M[a[i]]] - K <= 2)?1:(num[M[a[i]]] - K - 2);update(ss,pos[M[a[i]]][num[M[a[i]]]-K-1],-1,1,n,1);update(pos[M[a[i]]][num[M[a[i]]]-K-1]+1,pos[M[a[i]]][num[M[a[i]]]-K],1,1,n,1);}else;while(pt < q && Q[pt].r == i){ans[Q[pt].id] = query(Q[pt].l,1,n,1);pt ++;}}for (int i = 0; i < q; i ++)printf("%d\n",ans[i]);if (tt) printf("\n");}return 0; }

轉(zhuǎn)載于:https://www.cnblogs.com/AbandonZHANG/archive/2012/11/15/4114165.html

總結(jié)

以上是生活随笔為你收集整理的HDU 4358 Boring Counting ★★(2012 Multi-University Training Contest 6)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。