Ynoi2017 舌尖上的由乃

2021-08-13 05:39:13 字數 1893 閱讀 4838

維護區間加和區間第k小。

n<=100000

分塊,設塊大小為k相信大家都會o(n/k log^2 n)的查詢和o(k)的修改。

什麼你不會o(k)的修改?歸併啊歸併啊。

那麼平衡規劃一下k=n√

logn

總複雜度o(

nn√l

ogn)

#include 

#include

#include

#define fo(i,a,b) for(int i=a;i<=b;i++)

#define fd(i,a,b) for(int i=a;i>=b;i--)

#define rep(i,a) for(int i=lst[a];i;i=nxt[i])

using namespace std;

intread()

void write(int

x) if (x

<0)

char ch[20];int tot=0;

for(;x;x/=10) ch[++tot]=x

%10+'0';

fd(i,tot,1) putchar(ch[i]);

puts("");

}const int n=5

*1e5+5,m=100;

int t[n],val[n],nxt[n],lst[n],num;

void add(int

x,int

y,int z)

struct pa[n],b[n],c[n];

bool cmp(p x,p y)

int dfn[n],size[n],tot,n,m;

void dfs(int

x,int

y,int z)

}int bl[n],l[n],r[n],lazy[n],sz;

int find(int w)

int p[n],q[n];

bool bz[n];

void rebuild(int v,int l,int r,int k)

else c[++cnt]=b[p[j++]];

}while (i<=q[0])

while (j<=p[0]) c[++cnt]=b[p[j++]];

fo(i,1,cnt) b[l[v]+i-1]=c[i];

fo(i,l[v],r[v]) a[b[i].w].w=i;

}int len,opt,x,k,z,l,r,u,v;

int solve(int u,int l,int r,int v)

int query(int u,int v)

return l-l[u];

}int check(int mid)

int main()

dfs(1,0,0);

fo(i,1,n) bl[i]=(i-1)/m+1;sz=bl[n];

fo(i,1,sz) l[i]=r[i-1]+1,r[i]=min(l[i]+m-1,n);

fo(i,1,sz)

for(;m;m--)

int le=0,ri=(n+m)*10;

while (leint mid=le+ri>>1;

if (check(mid)>=k) ri=mid;

else le=mid+1;

}write(le);

} else

fo(i,u+1,v-1) lazy[i]+=k;

rebuild(u,l,r[u],k);rebuild(v,l[v],r,k);}}

return

0;}

upd:找到錯了,原來是我本來開了乙個全域性變數結果卻手賤int了它

然後我tle了,由乃題日常結局

YNOI2017 由乃的商場之旅 莫隊

description 給你乙個字串,每次給乙個詢問,問這個區間內有多少個子串經過重新排序後可以變成乙個回文串。sample input 6 6zzqzzq 1 62 4 3 42 3 4 51 1 sample output164 2231 考慮莫隊,因為字元只有26個考慮把他壓成二進位制。那麼你...

BZOJ4810 Ynoi2017 由乃的玉公尺田

對每個區間維護一下這個區間每個數有沒有,用bitset壓一下,這個用莫隊跑出來,然後就能判加減合不合法了 乘的話根號列舉一下就行了 include include include include include include include include include include incl...

4866 Ynoi2017 由乃的商場之旅

4866 ynoi2017 由乃的商場之旅 time limit 20 sec memory limit 164 mb submit 192 solved 47 submit status discuss description 第一行兩個數n,m 之後一行乙個長為n的字串,代表每個人的編號 之後m...