zoukankan      html  css  js  c++  java
  • loj6062 pair

    https://loj.ac/problem/6062

    直接套用霍尔定理。

    由于A有多个选择,考虑维护B是否合法。

    首先B数组的顺序显然是没有用的,可以直接排序。

    然后每个A就都变成了向一个后缀连边。

    对于B,原本需要check每一个集合是否满足|u|<=|v|

    但实际上,只需要考虑最可能导致不合法的条件,也就是让等式右边保持不变的情况下,左边尽可能的大,如果还合法,就可以判定合法。

    对于B,显然对于i<j,一定有F【i】<F【j】,F数组是B在A能匹配到的个数。

    因此,需要check的只是B的一些前缀。

    因此,我们只需要是每一个位置都满足i<=F【i】即可。

    移项一下,F【i】- i >=0 因此,只需要维护F【i】- 的最小值即可。

    由于A在不断变化,每次变化是对F数组的一个区间修改,线段树维护即可。

    #include<bits/stdc++.h>
    #define N 220000
    #define eps 1e-7
    #define inf 1e9+7
    #define db double
    #define ll long long
    #define ldb long double
    using namespace std;
    inline ll read()
    {
    	char ch=0;
    	ll x=0,flag=1;
    	while(!isdigit(ch)){ch=getchar();if(ch=='-')flag=-1;}
    	while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
    	return x*flag;
    }
    struct Segment_Tree
    {
    	#define lson o<<1
    	#define rson o<<1|1
    	#define mid ((l+r)>>1)
    	ll minv[N*4],addv[N*4]; 
    	inline void pushup(ll o){minv[o]=min(minv[lson],minv[rson]);}
    	inline void pushdown(ll o)
    	{
    		addv[lson]+=addv[o];minv[lson]+=addv[o];
    		addv[rson]+=addv[o];minv[rson]+=addv[o];
    		addv[o]=0;
    	}
    	void build(ll o,ll l,ll r)
    	{
    		addv[o]=0;if(l==r){minv[o]=-l;return;}
    		build(lson,l,mid);build(rson,mid+1,r);pushup(o);
    	}
    	void optset(ll o,ll l,ll r,ll ql,ll qr,ll k)
    	{
    		if(ql>qr)return;
    		if(ql<=l&&r<=qr){addv[o]+=k,minv[o]+=k;return;}
    		pushdown(o);
    		if(ql<=mid)optset(lson,l,mid,ql,qr,k);
    		if(qr>mid)optset(rson,mid+1,r,ql,qr,k);
    		pushup(o);
    	}
    	ll query(){return minv[1];}
    	#undef lson
    	#undef rson
    	#undef mid
    }T; 
    ll n,m,k,ans,a[N],b[N];
    void update(ll x,ll flag)
    {
    	ll l=1,r=m+1,mid;
    	while(l<r){mid=(l+r)>>1;if(x+b[mid]<k)l=mid+1;else r=mid;}
    	T.optset(1,1,m,l,m,flag);
    }
    int main()
    {
    	n=read();m=read();k=read();ans=0;
    	for(ll i=1;i<=m;i++)b[i]=read();for(ll i=1;i<=n;i++)a[i]=read();
    	sort(b+1,b+m+1);T.build(1,1,m);for(ll i=1;i<m;i++)update(a[i],+1);
    	for(ll i=1;i<=n-m+1;i++)update(a[i+m-1],+1),ans+=(T.query()>=0),update(a[i],-1);
    	printf("%lld
    ",ans);
    	return 0;
    }
    
  • 相关阅读:
    Composite in Javascript
    Model Validation in Asp.net MVC
    HttpRuntime.Cache vs. HttpContext.Current.Cache
    Controller Extensibility in ASP.NET MVC
    The Decorator Pattern in Javascript
    The Flyweight Pattern in Javascript
    Model Binding in ASP.NET MVC
    Asp.net MVC
    jQuery Ajax 实例 全解析
    ASP.NET AJAX入门系列
  • 原文地址:https://www.cnblogs.com/Creed-qwq/p/10673403.html
Copyright © 2011-2022 走看看