zoukankan      html  css  js  c++  java
  • [POI2015]Kinoman

    3747: [POI2015]Kinoman

    Time Limit: 60 Sec  Memory Limit: 128 MB
    Submit: 1285  Solved: 553
    [Submit][Status][Discuss]

    Description

    共有m部电影,编号为1~m,第i部电影的好看值为w[i]。
    在n天之中(从1~n编号)每天会放映一部电影,第i天放映的是第f[i]部。
    你可以选择l,r(1<=l<=r<=n),并观看第l,l+1,…,r天内所有的电影。如果同一部电影你观看多于一次,你会感到无聊,于是无法获得这部电影的好看值。所以你希望最大化观看且仅观看过一次的电影的好看值的总和。

    Input

    第一行两个整数n,m(1<=m<=n<=1000000)。
    第二行包含n个整数f[1],f[2],…,f[n](1<=f[i]<=m)。
    第三行包含m个整数w[1],w[2],…,w[m](1<=w[j]<=1000000)。

    Output

    输出观看且仅观看过一次的电影的好看值的总和的最大值。

    Sample Input

    9 4
    2 3 1 1 4 1 2 4 1
    5 3 6 6

    Sample Output

    15
    样例解释:
    观看第2,3,4,5,6,7天内放映的电影,其中看且仅看过一次的电影的编号为2,3,4。

    HINT

     

    Source

     
    扫描线基础题。
     
    #include<bits/stdc++.h>
    #define ll long long
    #define maxn 1000005
    using namespace std;
    int le,ri,W,laslas[maxn];
    int n,m,a[maxn],las[maxn],w[maxn];
    ll mx[maxn<<2|1],tag[maxn<<2|1],ans;
    
    inline int read(){
    	int x=0; char ch=getchar();
    	for(;!isdigit(ch);ch=getchar());
    	for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';
    	return x;
    }
    
    void update(int o,int l,int r){
    	if(l>=le&&r<=ri){
    		tag[o]+=(ll)W;
    		mx[o]+=(ll)W;
    		return; 
    	}
    	
    	int mid=l+r>>1,lc=o<<1,rc=(o<<1)|1;
    	if(le<=mid) update(lc,l,mid);
    	if(ri>mid) update(rc,mid+1,r);
    	
    	mx[o]=max(mx[lc],mx[rc])+tag[o];
    }
    
    void query(int o,int l,int r,ll TAG){
    	if(l>=le&&r<=ri){
    		ans=max(ans,TAG+mx[o]);
    		return;
    	}
    	int mid=l+r>>1,lc=o<<1,rc=(o<<1)|1;
    	if(le<=mid) query(lc,l,mid,TAG+tag[o]);
    	if(ri>mid) query(rc,mid+1,r,TAG+tag[o]);
    }
    
    inline void solve(){
    	for(int i=1;i<=n;i++){
    		ri=i,le=las[a[i]]+1,W=w[a[i]];
    		update(1,1,n);
    		le=laslas[a[i]]+1,ri=las[a[i]],W=-w[a[i]];
    		if(le<=ri) update(1,1,n);
    		laslas[a[i]]=las[a[i]],las[a[i]]=i;
    		
    		le=1,ri=i;
    		query(1,1,n,0);
    	}
    }
    
    int main(){
    	scanf("%d%d",&n,&m);
    	for(int i=1;i<=n;i++) a[i]=read();
    	for(int i=1;i<=m;i++) w[i]=read();
    	
    	solve();
    	
    	printf("%lld
    ",ans);
    	
    	return 0;
    }
    

      

  • 相关阅读:
    Win7下配置IIS服务器以及网站发布
    Visual Studio 2015 移动跨平台开发初体验
    C#中(int)、int.Parse()、int.TryParse()和Convert.ToInt32()的区别
    借用jquery实现:使浏览器的“前进”按钮功能失效
    C# 之 String.Empty
    关于ASP.NET中fileupload控件的缺点
    从关系型数据库到非关系型数据库
    jquery中prop()方法和attr()方法的区别
    Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结
    无法连接asp.net development server
  • 原文地址:https://www.cnblogs.com/JYYHH/p/8558799.html
Copyright © 2011-2022 走看看