zoukankan      html  css  js  c++  java
  • jzoj1306. Sum

    这题我们可以用权值线段树来做。
    题外话:这题50分的应该都是AC的吧???
    我们先求出a数组的前缀和数组c (记得模P)
    然后每次做完当前状态i后将c[i]加入到权值线段树里。
    因为答案要求尽可能小,所以我们对于以当前点为右端点的答案为:
    a[i] - a[i]-K的前驱

    a[i]+p - a[i]+P-K的前驱
    然后不断更新答案即可。
    上标:

    #include<cstdio>
    #define N 100010
    #define ma 100000000
    #define E (1<<30)
    using namespace std;
    int ls[4000010],rs[4000010],mi[4000010];
    int n,K,P,a[N],s,ans=E,tot=1,x1;
    
    inline int read()
    {
    	int x=0; char c=getchar();
    	while (c<'0' || c>'9') c=getchar();
    	while (c>='0' && c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
    	return x;
    }
    
    void ins(int x,int l,int r,int add)
    {
    	if (l==r) {mi[x]=add; return;}
    	int mid=l+r>>1;
    	if (add<=mid)
    	{
    		if (!ls[x]) ls[x]=++tot,mi[tot]=E;
    		ins(ls[x],l,mid,add);
    	}
    	else
    	{
    		if (!rs[x]) rs[x]=++tot,mi[tot]=E;
    		ins(rs[x],mid+1,r,add);
    	}
    	if (ls[x]) mi[x]=mi[ls[x]];
    	else mi[x]=mi[rs[x]];
    }
    
    void bef(int x,int l,int r,int cp)
    {
    	if (l==r) {x1=l; return;}
    	int mid=l+r>>1;
    	if (mi[rs[x]]<=cp) bef(rs[x],mid+1,r,cp);
    	else bef(ls[x],l,mid,cp);
    }
    
    int main()
    {
    	n=read(),K=read(),P=read();
    	mi[0]=mi[1]=E;
    	for (int i=1;i<=n;i++)
    	{
    		a[i]=(read()+a[i-1])%P;
    		if (a[i]>=K && a[i]<ans) ans=a[i];
    	}
    	ins(1,0,ma,a[1]);
    	for (int i=2;i<=n;i++)
    	{
    		if (a[i]>=K)
    		{
    			x1=-E,bef(1,0,ma,a[i]-K);
    			if (a[i]-x1<ans) ans=a[i]-x1;
    		}
    		if (a[i]+P-K<=ma)
    		{
    			x1=-E,bef(1,0,ma,a[i]+P-K);
    			if (a[i]+P-x1<ans) ans=a[i]+P-x1;
    		}
    		ins(1,0,ma,a[i]);
    	}
    	printf("%d
    ",ans);
    	return 0;
    }
    
    转载需注明出处。
  • 相关阅读:
    洛谷—— P2234 [HNOI2002]营业额统计
    BZOJ——3555: [Ctsc2014]企鹅QQ
    CodeVs——T 4919 线段树练习4
    python(35)- 异常处理
    August 29th 2016 Week 36th Monday
    August 28th 2016 Week 36th Sunday
    August 27th 2016 Week 35th Saturday
    August 26th 2016 Week 35th Friday
    August 25th 2016 Week 35th Thursday
    August 24th 2016 Week 35th Wednesday
  • 原文地址:https://www.cnblogs.com/jz929/p/11817578.html
Copyright © 2011-2022 走看看