题目标签用的区间dp然而窝并没有用到(讲道理区间dp怎么说都得O(n)啊喂。。
然后根据这个题意是很容易出个暴力dp的。。
当然很显然用前缀和求会更快。。事实上也只用前缀和,原始数据还用不上。。
设d[i]为对前i个牌,收取第i个牌时的最大收益,而b为权值的前缀和,c为d的前缀最大值
d[i]=max{c[k-1]+b[i]-b[k-1]} k=1-n且a[i]==a[k]
这样的话看起来是n^2。。然后想优化咯。。
观察发现原方程可以再简化一下。。
d[i]=max{c[k-1]-b[k-1]}+b[i]
所以只要维护最大的c[k-1]+b[k-1]就行了嘛。。十分容易。。
种类相同这个条件怎么限制?直接对每个种类分别维护其最大值就行了嘛。。
noi签到题吧估计。。
/** * ┏┓ ┏┓ * ┏┛┗━━━━━━━┛┗━━━┓ * ┃ ┃ * ┃ ━ ┃ * ┃ > < ┃ * ┃ ┃ * ┃... ⌒ ... ┃ * ┃ ┃ * ┗━┓ ┏━┛ * ┃ ┃ Code is far away from bug with the animal protecting * ┃ ┃ 神兽保佑,代码无bug * ┃ ┃ * ┃ ┃ * ┃ ┃ * ┃ ┃ * ┃ ┗━━━┓ * ┃ ┣┓ * ┃ ┏┛ * ┗┓┓┏━┳┓┏┛ * ┃┫┫ ┃┫┫ * ┗┻┛ ┗┻┛ */ #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<queue> #include<cmath> #include<map> #include<stack> #include<set> #define inc(i,l,r) for(int i=l;i<=r;i++) #define dec(i,l,r) for(int i=l;i>=r;i--) #define link(x) for(edge *j=h[x];j;j=j->next) #define mem(a) memset(a,0,sizeof(a)) #define ll long long #define eps 1e-12 #define succ(x) (1<<x) #define lowbit(x) (x&(-x)) #define sqr(x) ((x)*(x)) #define mid (x+y>>1) #define NM 1000005 #define nm 100 #define pi 3.1415926535897931 using namespace std; const ll inf=998244353; ll read(){ ll x=0,f=1;char ch=getchar(); while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();} while(isdigit(ch))x=x*10+ch-'0',ch=getchar(); return f*x; } ll a[NM],b[NM],c[NM],d[NM]; int n,m,v[NM]; int main(){ //freopen("data.in","r",stdin); n=read();m=read(); inc(i,1,n)a[i]=read(); inc(i,1,n)b[i]=b[i-1]+read(); inc(i,1,n){ d[i]=c[i-1]; if(v[a[i]]){ int k=v[a[i]]; d[i]=max(d[i],c[k-1]+b[i]-b[k-1]); if(c[k-1]-b[k-1]<c[i-1]-b[i-1])v[a[i]]=i; }else v[a[i]]=i; c[i]=max(c[i-1],d[i]); } return 0*printf("%lld\n",c[n]); }
题目描述
输入格式
输出格式
样例
数据范围与提示
对于 100%100\%100% 的数据,1≤n≤106,1≤k≤106,1≤vi≤1091\leq n\leq 10^6,1\leq k\leq 10^6,1\leq v_i\leq 10^91≤n≤106,1≤k≤106,1≤vi≤109。
Subtask # | 分值 | n,kn,kn,k 的限制 | 特殊限制 |
---|---|---|---|
1 | 151515 | 1≤n,k≤151\leq n,k\leq 151≤n,k≤15 | ci=vic_i=v_ici=vi |
2 | 151515 | 1≤n,k≤3001\leq n,k\leq 3001≤n,k≤300 | ci=vic_i=v_ici=vi |
3 | 303030 | 1≤n,k≤30001\leq n,k\leq 30001≤n,k≤3000 | |
4 | 151515 | 1≤n,k≤2×1051\leq n,k\leq 2\times 10^51≤n,k≤2×105 | |
5 | 101010 | 1≤n,k≤1061\leq n,k\leq 10^61≤n,k≤106 | ci=vic_i=v_ici=vi |
6 | 151515 | 1≤n,k≤1061\leq n,k\leq 10^61≤n,k≤106 |