• bzoj5324:[Jxoi2018]守卫


    传送门

    首先考虑定下一个端点,然后剩下的就可以递推了
    一开始想的是定下左端点,然后预处理出位置最远能看到的位置,后来发现时间GG了
    看题解发现定右端点优秀得多
    记录下当前(r)最远能看到的位置(p),能看到([p,r])一共需要几个守卫,这个后缀和一下就好了
    然后斜率的判断,只需要(l,r)的斜率小于(p,r)的斜率,这个点就可以被看见,这是显然的,可以画一下图
    代码:

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    void read(int &x) {
    	char ch; bool ok;
    	for(ok=0,ch=getchar(); !isdigit(ch); ch=getchar()) if(ch=='-') ok=1;
    	for(x=0; isdigit(ch); x=x*10+ch-'0',ch=getchar()); if(ok) x=-x;
    }
    #define rg register
    const int maxn=5010;
    int n,f[maxn][maxn],a[maxn],ans;
    int main()
    {
    	read(n);
    	for(rg int i=1;i<=n;i++)read(a[i]);
    	for(rg int r=1;r<=n;r++)
    	{
    		f[r][r]=1;ans^=1;int las=0,sum=1;
    		for(rg int l=r-1;l;l--)
    		{
    			if(!las||(double)((a[l]-a[r])/(l-r))<(double)((a[r]-a[las])/(r-las)))sum+=min(f[l+1][las],f[l+1][las-1]),las=l;
    			f[l][r]=sum+min(f[l][las],f[l][las-1]);ans^=f[l][r];
    		}
    	}
    	printf("%d
    ",ans);
    }
    
  • 相关阅读:
    根据界面上的button增加、删除、重命名文件夹,名字是数据库下面某一表单的某一列的名字
    打包测试的过程记录
    java中return的作用
    UVA
    UVA
    UVA
    HDU
    HDU
    spring技术详解
    Java对象的生命周期与垃圾回收以及四种引用
  • 原文地址:https://www.cnblogs.com/lcxer/p/10534841.html
Copyright © 2020-2023  润新知