1. 程式人生 > >bzoj千題計劃320:bzoj4939: [Ynoi2016]掉進兔子洞(莫隊 + bitset)

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計劃320bzoj4939: [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計劃311bzoj5017: [Snoi2017]炸彈線段樹優化tarjan構圖

#include<cstdio> #include<vector> #include<iostream> #include<algorithm> using namespace std; const int mod=1e9+7;

bzoj計劃319bzoj2865: 字串識別字尾自動機 + 線段樹

#include<map> #include<cstdio> #include<cstring> #include<algorithm> #define N 500001 using namespace std; char s[

bzoj計劃310bzoj5285: [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計劃316bzoj3173: [Tjoi2013]最長上升子序列二分+樹狀陣列

#include<cstdio> #include<iostream> #include<algorithm> using namespace std; #define N 100001 #define lowbit(x) x&-x

bzoj計劃309bzoj4332: JSOI2012 分零食分治+FFT

#include<cmath> #include<cstdio> #include<algorithm> using namespace std; const int M=1<<17; #define N 10001 int m,

bzoj計劃321bzoj5251: [2018多省省聯測]劈配網路流 + 二分

#include<queue> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #d

bzoj計劃312bzoj2119: 股市的預測字尾陣列+st表

#include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #d

bzoj計劃317bzoj4650: [Noi2016]優秀的拆分字尾陣列+差分

#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define N 30002 using namespace std; int n;

bzoj計劃318bzoj1396: 識別子串字尾自動機 + 線段樹

#include<cstdio> #include<cstring> #include<algorithm> #define N 100001 using namespace std; char s[N]; int ch[N<&

bzoj計劃323bzoj1951: [Sdoi2010]古代豬文Lucas+CRT+尤拉定理

#include<cmath> #include<cstdio> #include<iostream> using namespace std; const int mod=999911659; const int phi=mod-1; typ

bzoj計劃322bzoj2561: 最小生成樹最小割

#include<cstdio> #include<queue> #include<cstring> #include<iostream> #include<algorithm> using namespace std;

bzoj計劃324bzoj5249: [2018多省省聯測]IIIDX線段樹

#include<cmath> #include<cstdio> #include<iostream> #include<algorithm> using namespace std; #define N 500001 int d[N

bzoj計劃313bzoj3879: SvT字尾陣列+st表+單調棧

#include<cstdio> #include<iostream> #include<algorithm> using namespace std; #define N 500001 #define M 3000001 int n,m,mm;

bzoj計劃314bzoj3238: [Ahoi2013]差異字尾陣列+st表+單調棧

#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #define N 500001 int n

bzoj計劃308bzoj4589: 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