两题都没做出来,6D的dp到现在我还是有点没理解,先留着吧。
6E看到最后才弄懂题意,就是找出最长连续子串长度和数量。
网上看到说用线段树(segment-tree),从来没见过的数据结构,表示查了好久
http://dongxicheng.org/structure/segment-tree/可以参看这篇文章看看,虽说看了好像对线段树有点认识了,但是放在这题我还是没什么思路。
后来去cf上看了看前几名提交的代码,不禁佩服实在是太精炼了。贴个吧。
#include<cstdio> #include<set> int a[100100],c[100100],n,k,b,m,p; std::multiset<int> s; int main() { scanf("%d%d",&n,&k); for(int i=0;i<n;i++) { scanf("%d",a+i); s.insert(a[i]); while(*s.rbegin()-*s.begin()>k)s.erase(s.find(a[b++])); if(i-b+1==m) c[p++]=b; else if(i-b+1>m) m=i-b+1,c[0]=b,p=1; } printf("%d %d ",m,p); for(int i=0;i<p;i++) { printf("%d %d ",c[i]+1,c[i]+m); } }