期望得分:100+100+20=220

实际得分:100+100+20=220

模拟栈

#include<cstdio>
#include<cstring>
using namespace std;
#define N 10002
char s[N],st[N];
int top;
int main()
{
freopen("kakutani.in","r",stdin);
freopen("kakutani.out","w",stdout);
int n,len,lt;
scanf("%d",&n);
while(n--)
{
scanf("%s",s);
len=strlen(s);
top=;
for(int i=;i<len;i++)
if(s[i]=='' || s[i]=='') continue;
else if(s[i]!='') st[++top]=s[i];
else
{
if(st[top]=='') top--;
else st[++top]='';
}
if(top) for(int i=;i<=top;i++) putchar(st[i]);
else putchar('');
printf("\n");
}
}

枚举i为间隔K个录像的左端点,那么间隔录像为[i,i+k-1]

设第一段为[Sa,Ta],第二段为[Sb,Tb],Ma为min[Sa,Ta],Mb为min[Sb,Tb]

随着Sa的左移,Ma单调不增

随着Tb的右移,Mb单调不增

如果枚举Sa,则有以下式子: Ta-Sa+1+Tb-Sb+1>=B

即Tb>=B+Sa+Sb-Ta-2

因为Tb右移,Mb单调不增,所以Tb取等号最优

所以二分Sa的位置,用st表查询Ma,Mb

#include<cmath>
#include<cstdio>
#include<iostream>
#include<algorithm>
#define N 1000001
using namespace std;
int st[N][];
int p,n;
int logg2[N];
void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
}
void stpre()
{
p=log2(n);
for(int j=,k=;j<=p;j++,k<<=)
for(int i=;i+k-<=n;i++)
st[i][j]=min(st[i][j-],st[i+(k>>)][j-]);
for(int i=;i<=n;i++) logg2[i]=log2(i);
}
int getmin(int s,int t)
{
p=logg2[t-s+];
int len=<<p;
return min(st[s][p],st[t-len+][p]);
}
int main()
{
freopen("dota.in","r",stdin);
freopen("dota.out","w",stdout);
int A,B,k;
read(n); read(A); read(B); read(k);
for(int i=;i<=n;i++) read(st[i][]);
stpre();
int Sa,Sb,Ta,Tb,Ma,Mb,Mi;
int ans=;
int l,r,mid,tmp;
for(int i=A+;i<=n-A-k+;i++)
{
Ta=i-; Sb=i+k;
Tb=max(Sb+A-,B+i-A+Sb-Ta-);
Ma=getmin(i-A,Ta); Mb=getmin(Sb,Tb);
l=; r=i-A; tmp=min(Ma,Mb);
while(l<=r)
{
mid=l+r>>;
Tb=max(Sb+A-,B+mid+Sb-Ta-);
Ma=getmin(mid,Ta); Mb=getmin(Sb,Tb);
tmp=max(tmp,min(Ma,Mb));
if(Ma<Mb) l=mid+;
else if(Ma==Mb) break;
else r=mid-;
}
ans=max(ans,tmp);
}
printf("%d",ans);
}

数位DP

dp[i][j][0/1] 前i位匹配到X的第j位,是否已经包含1个X的数的个数

二分,计算<=mid的数里的答案

其中的匹配用kmp

#include<cstdio>
#include<cstring>
using namespace std;
typedef long long LL;
LL L,R,K;
LL dp[][][];
int len,f[];
char X[];
int a[],cnt;
void kmp()
{
len=strlen(X);
int j;
for(int i=;i<len;i++)
{
j=f[i];
while(j && X[i]!=X[j]) j=f[j];
f[i+]=X[i]==X[j] ? j+ : ;
}
}
LL dfs(int dep,int w,bool lim,bool get)
{
if(!dep) return get;
if(!lim && ~dp[dep][w][get]) return dp[dep][w][get];
LL res=;
int k=lim ? a[dep] : ;
int j;
for(int i=;i<=k;i++)
{
j=w;
while(j && X[j]-''!=i) j=f[j];
if(X[j]-''==i) j++;
res+=dfs(dep-,j,lim&&(i==k),get||(j==len));
}
return lim ? res : dp[dep][w][get]=res;
}
LL query(LL lim)
{
int cnt=;
while(lim)
{
a[++cnt]=lim%;
lim/=;
}
memset(dp,-,sizeof(dp));
return dfs(cnt,,true,false);
}
int main()
{
freopen("spenum.in","r",stdin);
freopen("spenum.out","w",stdout);
scanf("%I64d%I64d%s%I64d",&L,&R,X,&K);
kmp();
LL tmp=query(L-);
if(query(R)<K) { puts("Hey,wake up!"); return ; }
LL l=L,r=R,ans,mid;
while(l<=r)
{
mid=l+r>>;
if(query(mid)-tmp<K) l=mid+;
else ans=mid,r=mid-;
}
printf("%I64d",ans);
}

2017北京国庆刷题Day6 morning的更多相关文章

  1. 2017北京国庆刷题Day6 afternoon

    期望得分:100+100+40=240 实际得分:100+0+40=140 二进制拆分.二进制前缀和 #include<cstdio> #include<iostream> u ...

  2. 2017北京国庆刷题Day1 afternoon

    期望得分:100+100+100=300 实际得分:100+100+100=300 T1 一道图论好题(graph) Time Limit:1000ms   Memory Limit:128MB 题目 ...

  3. 2017北京国庆刷题Day7 morning

    期望得分:100+0+100=200 实际得分:100+20+0=120 离散化搞搞 #include<cstdio> #include<iostream> #include& ...

  4. 2017北京国庆刷题Day5 afternoon

    期望得分:100+60+100=260 实际得分:0+60+40=100 设图中有m个环,每个环有si条边,有k条边不在环中 ans= (2^s1 -2)*( 2^s2 -2)* (2^s3 -2)… ...

  5. 2017北京国庆刷题Day3 morning

    期望得分:100+60+0=160 实际得分:100+30+0=130 考场上用的哈希 #include<cstdio> #include<cstring> #include& ...

  6. 2017北京国庆刷题Day2 afternoon

    期望得分:100+100+50=250 实际得分:100+70+50=220 T1 最大值(max) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK有一 ...

  7. 2017北京国庆刷题Day2 morning

    期望得分:100+100+40=240 实际得分:100+40+0=140 T1 一道图论神题(god) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK ...

  8. 2017北京国庆刷题Day4 morning

    期望得分:0+40+30=70 实际得分:0+10+10=20 题目修改:只能由0变1,只能用一次操作 大模拟 #include<cstdio> #include<cstring&g ...

  9. 2017北京国庆刷题Day5 morning

    期望得分:0+60+60=120 实际得分:0+30+60=90 令g=gcd(X11,X12,X13……) 则行列式可能为D的充要条件为g|D 1.g|D为必要条件: 由定义来算行列式的时候,每一项 ...

随机推荐

  1. Alpha 冲刺(4/10)

    队名 火箭少男100 组长博客 林燊大哥 作业博客 Alpha 冲鸭鸭鸭鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调各成员之间的工作 协助前后端接口的开发 测试项目运行的服务器环 ...

  2. CodeForces 483B 二分答案

    题目: B. Friends and Presents time limit per test 1 second memory limit per test 256 megabytes input s ...

  3. DB2 9.5 数据库分区管理及应用实践

    DB2 数据库分区是 DB2 企业版 DPF(Data Partitioning Feature)选件提供的,它主要用来为大规模数据处理.高并发数据访问提供支持.DB2 数据库分区采用 Share-n ...

  4. 软工网络15团队作业4-DAY2

    每个人的工作 (有work item 的ID),并将其记录在码云项目管理中: 昨天已完成的工作. 张陈东芳:查看数据库的连接 吴敏烽:规范商品实体类 周汉麟:研究获取商品信息的方法 林振斌:研究获取商 ...

  5. Mware中CentOS设置静态IP

    Mware中CentOS设置静态IP   因为之前搭建的MongoDB分片没有采用副本集,最近现网压力较大,所以准备研究一下,于是在自己电脑的虚拟机中搭建环境,但是发现之前VMware设置的是DHCP ...

  6. Windows下多线程编程(一)

    前言 熟练掌握Windows下的多线程编程,能够让我们编写出更规范多线程代码,避免不要的异常.Windows下的多线程编程非常复杂,但是了解一些常用的特性,已经能够满足我们普通多线程对性能及其他要求. ...

  7. 小记IptabLes和IptabLex病毒清理过程

    去年有台Linux服务器被黑了,看了500万行日志(现在觉得当时好厉害呀),反正当时的日志文件有700Mb以上大.前两天师兄告诉我,信息中心的老师给他说我们有台服务器应该是被人入侵了,当作内网的跳板, ...

  8. java之静态代理与动态代理

    先看看静态代理是如何操作的 定义接口: public interface Person { public void sayHello(String content, int age); public ...

  9. ZooKeeper系列文章

    ZooKeeper FAQ ZooKeeper客户端事件串行化处理 ZooKeeper分布式锁避免羊群效应(Herd Effect) ZooKeeper管理员指南——部署与管理ZooKeeper Zo ...

  10. HDU4701_Game

    很有意思,很好的一个题目. 题目的意思是两个人初始状态分别有A和B元,现在有N件可买的商品.两人轮流买,商品必须从左到右买过去,一次可以买若干个.第一个无法买到商品的人输. 一看就知道是博弈题目,但是 ...