zoukankan      html  css  js  c++  java
  • P2418 yyy loves OI IV

    题目背景

    某校2015届有两位OI神牛,yyy和c01。

    题目描述

    全校除他们以外的N名学生,每人都会膜拜他们中的某一个人。现在老师要给他们分宿舍了。但是,问题来了:

    同一间宿舍里的人要么膜拜同一位大牛,要么膜拜yyy和c01的人数的差的绝对值不超过M。否则他们就会打起来。

    为了方便,老师让N名学生站成一排,只有连续地站在一起的人才能分进同一个宿舍。

    假设每间宿舍能容纳任意多的人,请问最少要安排几个宿舍?

    输入输出格式

    输入格式:

    第一行,两个正整数N和M

    第2……N+1行,每行一个整数1或2,第i行的数字表示从左往右数第i-1个人膜拜的大牛。

    1表示yyy,2表示c01.

    输出格式:

    一行,一个整数,表示最少要安排几个宿舍。

    输入输出样例

    输入样例#1: 复制

    5 1
    1
    1
    2
    2
    1

    输出样例#1: 复制

    1

    说明

    难度题,做好心理准备~

    测试点编号 N的范围 M的范围

    1~3 <=2,500 <=10

    4~5 <=500,000 <=10

    6~10 <=500,000 <=2,000


    (define)(min)(max)然后惊喜的发现我(10000)的数据

    emmm...简单形容就是我的线段树被(n^2)暴力踩爆了QAQ


    思路很好想啊
    维护前缀和线段树区间查询可行区间和最远路径相同前驱取min值即可


    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #define LL long long
    #define update(now) d[now]=min(d[now*2],d[now*2+1])
    using namespace std;
    
    int i,m,n,j,k,d[5000001],f[5000001],x[1000001],las,wz;
    
    int ask(int now,int l,int r,int ll,int rr)
    {
    	if(l>=ll && r<=rr) return d[now];
    	int mid=(l+r)>>1,ans=0x3f3f3f;
    	if(ll<=mid) ans=min(ans, ask(now*2,l,mid,ll,rr));
    	if(rr>mid) ans=min(ans, ask(now*2+1,mid+1,r,ll,rr));
    	return ans;
    }
    
    void modify(int now,int l,int r,int z,int w)
    {
    	if(l==r) {d[now]=min(d[now],z); return;}
    	int mid=(l+r)>>1;
    	if(w<=mid) modify(now*2,l,mid,z,w);
    	if(w>mid) modify(now*2+1,mid+1,r,z,w);
    	update(now);
    }
    
    int main()
    {
    	freopen("in.txt","r",stdin);
    	memset(d,0x3f,sizeof(d));
    	memset(x,0x3f,sizeof(x));
    	scanf("%d%d",&n,&m);
    	modify(1,0,2*n,0,n);
    	x[0]=0;
     	for(i=1;i<=n;i++)
    	{
    		scanf("%d",&k);
    		if(las!=k) las=k,wz=i;
    		x[i]=x[wz-1]+1;
    		
    		if(k==2) f[i]=f[i-1]+1;
    		else f[i]=f[i-1]-1;
    		int ll=max(0,f[i]+n-m), rr=min(f[i]+n+m,2*n);
    		k=ask(1,0,n+n,ll, rr)+1;
    		x[i]=min(k,x[i]);
    		modify(1,0,n+n,x[i],f[i]+n);
    	}
    	printf("%d",x[n]);
    }
    
  • 相关阅读:
    Oracle RAC的五大优势及其劣势
    Lucene全文检索基础
    oracle手工生成AWR报告方法记录
    log file sync 等侍值高的一般通用解决办法
    log file sync 因为数据线有问题而造成高等侍的表现
    MongoDB实用教程
    1小时学会JQuery
    Ajax+Struts2实现验证码验证功能
    硬件01:门
    关于软件工程的思考15:人和绩效
  • 原文地址:https://www.cnblogs.com/ZUTTER/p/9872740.html
Copyright © 2011-2022 走看看