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;
    }
    
    转载需注明出处。
  • 相关阅读:
    微信Web开发者工具 移动调试 手机连接不上
    js 生成guid 自定义函数
    json
    c# 返回时间差
    Quartz.Net和队列应用demo
    数据库字段数字表示含义的枚举维护
    API文档自动生成,Swagger的配置
    请求资源文件报500错误
    文件上传三:base64文件上传
    文件上传二:FormData上传
  • 原文地址:https://www.cnblogs.com/jz929/p/11817578.html
Copyright © 2011-2022 走看看