2018 计蒜之道 初赛 第二场
Posted hl666
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2018 计蒜之道 初赛 第二场相关的知识,希望对你有一定的参考价值。
这次Rank202我就很不爽了,凭什么有个罚时也是210的就排在200了
主要还是T2太ZZ了,前几次都忘了输Emply。之前还因为map的变量名叫做hash被判错了?
后面两题我都不会,这种玄学字符串的题目我是真的烦
说实话我还是比较喜欢图论题
A. 淘宝的推荐系统
咋一看题目很烦,一般的O(n^2)的DP式子肯定都可以推出来,但优化......
全机房开始YY数据结构,单调队列,线段树,主席树......感觉都比较科学,但有个dalao叫trie这就是什么鬼?
好吧其实他是先看T2的
这里其实仔细看一下数据范围就水得一匹,d<=100,p[i]<=1e5
然后我们就换一种思路DP,设f[i]表示最后一件选择的价格为i的商品最多能卖出多少件,则有转移
f[i]=max(f[i],f[j]+1)(max(1,i-d)<=j<=min(MAX_p[i],i+d))
10min1A(如果先看到数据范围的话就可以5min了)
CODE
#include<cstdio>
#include<cstring>
using namespace std;
const int N=30005,MAX=1e5+5;
int f[MAX+100],t,n,d,x,ans;
inline char tc(void)
{
static char fl[100000],*A=fl,*B=fl;
return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(int &x)
{
x=0; char ch=tc();
while (ch<‘0‘||ch>‘9‘) ch=tc();
while (ch>=‘0‘&&ch<=‘9‘) x=x*10+ch-‘0‘,ch=tc();
}
inline void write(int x)
{
if (x/10) write(x/10);
putchar(x%10+‘0‘);
}
inline int min(int a,int b)
{
return a<b?a:b;
}
inline int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
register int i,j; read(t);
while (t--)
{
memset(f,0,sizeof(f));
read(n); read(d); ans=0;
for (i=1;i<=n;++i)
{
read(x); f[x]+=1;
for (j=x-1;j>=max(1,x-d);--j) f[x]=max(f[x],f[j]+1);
for (j=x+1;j<=x+d;++j) f[x]=max(f[x],f[j]+1);
ans=max(ans,f[x]);
}
write(ans); putchar(‘\n‘);
}
return 0;
}
B. 阿里巴巴的手机代理商(简单)
这种题目无力吐槽。
尽管他们都选择把trie改成从后向前的来一口气AT2,T3,但我吸取了昨天的教训,迅速开map刚T2
然后就如前文说的出现了SB错误,最后90min的时候才过,还交了6次
然后浪费了一次绝佳上200的机会
缅怀CJJT2炸裂
记住一个教训:map的变量名不能叫hash!(雾)I don‘t know why
CODE
#include<iostream>
#include<map>
#include<string>
#include<cstring>
using namespace std;
typedef long long LL;
const LL N=1005;
string p,s[N];
map <string,LL> h;
map <string,bool> vis;
LL n,t,x,opt[N],a[N],tot;
inline LL work(string p)
{
vis.clear();
register LL i; LL len=p.size(),sum=0;
for (i=1;i<=n;++i)
if (opt[i]==1&&s[i].size()>=len&&!vis[s[i]])
{
LL p1=s[i].size()-1,p2=len-1; bool flag=1;
while (p2>=0)
{
if (s[i][p1]!=p[p2]) { flag=0; break; }
--p1; --p2;
}
if (flag) sum+=a[h[s[i]]],vis[s[i]]=1;
}
return sum;
}
int main()
{
ios::sync_with_stdio(false);
register LL i; cin>>t;
while (t--)
{
h.clear(); memset(a,0,sizeof(a)); cin>>n; tot=0;
for (i=1;i<=n;++i)
{
cin>>p;
if (p[0]==‘i‘)
{
opt[i]=1; cin>>s[i]>>x;
if (!h[s[i]]) h[s[i]]=++tot;
a[h[s[i]]]+=x;
}
if (p[0]==‘q‘) opt[i]=2,cin>>s[i],cout<<work(s[i])<<endl;
if (p[0]==‘d‘)
{
opt[i]=3; cin>>s[i];
if (!a[h[s[i]]]) cout<<"Empty"<<endl; else a[h[s[i]]]=0;
}
}
}
return 0;
}
后面的两题我就不会了,自行Baidu吧
以上是关于2018 计蒜之道 初赛 第二场的主要内容,如果未能解决你的问题,请参考以下文章