bzoj千題計劃320:bzoj4939: [Ynoi2016]掉進兔子洞(莫隊 + bitset)
#include<cmath> #include<cstdio> #include<bitset> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #define N 100000 #define T 25000 int a[N+1],b[N+1]; int S,bl[N+1]; bitset<N>F[T+1],f; int cnt[N+1]; bool mark[T+1]; int ans[T+1]; struct node { int id,l,r; }e[T*3+1]; void read(int &x) { x=0; char c=getchar(); while(!isdigit(c)) c=getchar(); while(isdigit(c)) { x=x*10+c-'0'; c=getchar(); } } bool cmp(node p,node q) { if(bl[p.l]!=bl[q.l]) return bl[p.l]<bl[q.l];return p.r<q.r; } void update(int pos,bool ty) { int x=a[pos]; if(ty) { cnt[x]++; f[x+cnt[x]-2]=1; } else { f[x+cnt[x]-2]=0; cnt[x]--; } } void solve(int t) { int n=0; memset(mark,false,sizeof(mark)); memset(ans,0,sizeof(ans)); for(int i=1;i<=t;++i) { read(e[++n].l); read(e[n].r); e[n].id=i; ans[i]+=e[n].r-e[n].l+1; read(e[++n].l); read(e[n].r); e[n].id=i; ans[i]+=e[n].r-e[n].l+1; read(e[++n].l); read(e[n].r); e[n].id=i; ans[i]+=e[n].r-e[n].l+1; } sort(e+1,e+n+1,cmp); f.reset(); memset(cnt,0,sizeof(cnt)); int L=1,R=0; for(int i=1;i<=n;++i) { while(R<e[i].r) update(++R,true); while(R>e[i].r) update(R--,false); while(L<e[i].l) update(L++,false); while(L>e[i].l) update(--L,true); if(!mark[e[i].id]) F[e[i].id]=f,mark[e[i].id]=true; else F[e[i].id]&=f; } for(int i=1;i<=t;++i) { ans[i]-=F[i].count()*3; printf("%d\n",ans[i]); } } int main() { //freopen("xp1.in","r",stdin); //freopen("xp1.ans","w",stdout); int n,m; read(n); read(m); S=sqrt(n); for(int i=1;i<=n;++i) bl[i]=(i-1)/S+1; for(int i=1;i<=n;++i) read(a[i]),b[i]=a[i]; sort(b+1,b+n+1); for(int i=1;i<=n;++i) a[i]=lower_bound(b+1,b+n+1,a[i])-b; while(m) { if(m<=T) solve(m),m=0; else solve(T),m-=T; } return 0; }
相關推薦
bzoj千題計劃320:bzoj4939: [Ynoi2016]掉進兔子洞(莫隊 + bitset)
#include<cmath> #include<cstdio> #include<bitset> #include<cstring> #include<iostream> #include<algorithm> us
BZOJ 4939 [Ynoi2016]掉進兔子洞(莫隊+bitset)
怎麽辦 分批 長度 get sqrt 開始 and 超時 -- 【題目鏈接】 http://www.lydsy.com/JudgeOnline/problem.php?id=4939 【題目大意】 給出一個數列,每個詢問給出三個區間,問除去三個區間共有的
BZOJ4939[YNOI2016] 掉進兔子洞
efi urn geo eset its const bug 兔子 nod 題目藍鏈 Solution 首先,很顯然這題是要用莫隊來處理的。我們先把輸入的數字另外排一下序,然後記錄一下\(p_i\)表示每一個數字對應在排好序的數列裏面是排第幾個。詢問的時候要把一個詢問拆成\
bzoj4939: [Ynoi2016]掉進兔子洞 莫隊 bitset
bzoj4939: [Ynoi2016]掉進兔子洞 Description 一個長為 n 的序列 a。 有 m 個詢問,每次詢問三個區間,把三個區間中同時出現的數一個一個刪掉,問最後三個區間剩下的數的個數和,詢問獨立。 注意這裡刪掉指的是一個一個刪,不是把等於這個值的數直接刪完,
BZOJ4939: [Ynoi2016]掉進兔子洞
BZOJ 題意 給你一個長度為 n n n的數列,每次詢問三個區間共
bzoj千題計劃311:bzoj5017: [Snoi2017]炸彈(線段樹優化tarjan構圖)
#include<cstdio> #include<vector> #include<iostream> #include<algorithm> using namespace std; const int mod=1e9+7;
bzoj千題計劃319:bzoj2865: 字串識別(字尾自動機 + 線段樹)
#include<map> #include<cstdio> #include<cstring> #include<algorithm> #define N 500001 using namespace std; char s[
bzoj千題計劃310:bzoj5285: [Hnoi2018]尋寶遊戲(思維題+雜湊)
#include<cstdio> #include<algorithm> #define N 5001 using namespace std; const int mod=1e9+7; int bit[N]; char s[N]; int has
bzoj千題計劃316:bzoj3173: [Tjoi2013]最長上升子序列(二分+樹狀陣列)
#include<cstdio> #include<iostream> #include<algorithm> using namespace std; #define N 100001 #define lowbit(x) x&-x
bzoj千題計劃309:bzoj4332: JSOI2012 分零食(分治+FFT)
#include<cmath> #include<cstdio> #include<algorithm> using namespace std; const int M=1<<17; #define N 10001 int m,
bzoj千題計劃321:bzoj5251: [2018多省省隊聯測]劈配(網路流 + 二分)
#include<queue> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #d
bzoj千題計劃312:bzoj2119: 股市的預測(字尾陣列+st表)
#include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #d
bzoj千題計劃317:bzoj4650: [Noi2016]優秀的拆分(字尾陣列+差分)
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define N 30002 using namespace std; int n;
bzoj千題計劃318:bzoj1396: 識別子串(字尾自動機 + 線段樹)
#include<cstdio> #include<cstring> #include<algorithm> #define N 100001 using namespace std; char s[N]; int ch[N<&
bzoj千題計劃323:bzoj1951: [Sdoi2010]古代豬文(Lucas+CRT+尤拉定理)
#include<cmath> #include<cstdio> #include<iostream> using namespace std; const int mod=999911659; const int phi=mod-1; typ
bzoj千題計劃322:bzoj2561: 最小生成樹(最小割)
#include<cstdio> #include<queue> #include<cstring> #include<iostream> #include<algorithm> using namespace std;
bzoj千題計劃324:bzoj5249: [2018多省省隊聯測]IIIDX(線段樹)
#include<cmath> #include<cstdio> #include<iostream> #include<algorithm> using namespace std; #define N 500001 int d[N
bzoj千題計劃313:bzoj3879: SvT(字尾陣列+st表+單調棧)
#include<cstdio> #include<iostream> #include<algorithm> using namespace std; #define N 500001 #define M 3000001 int n,m,mm;
bzoj千題計劃314:bzoj3238: [Ahoi2013]差異(字尾陣列+st表+單調棧)
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #define N 500001 int n
bzoj千題計劃308:bzoj4589: Hard Nim(倍增FWT+生成函式)
#include<cstdio> #include<cstring> using namespace std; #define N 50001 const int mod=1e9+7; const int M=1<<16; int inv