2017北京国庆刷题Day6 morning
期望得分: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的更多相关文章
- 2017北京国庆刷题Day6 afternoon
期望得分:100+100+40=240 实际得分:100+0+40=140 二进制拆分.二进制前缀和 #include<cstdio> #include<iostream> u ...
- 2017北京国庆刷题Day1 afternoon
期望得分:100+100+100=300 实际得分:100+100+100=300 T1 一道图论好题(graph) Time Limit:1000ms Memory Limit:128MB 题目 ...
- 2017北京国庆刷题Day7 morning
期望得分:100+0+100=200 实际得分:100+20+0=120 离散化搞搞 #include<cstdio> #include<iostream> #include& ...
- 2017北京国庆刷题Day5 afternoon
期望得分:100+60+100=260 实际得分:0+60+40=100 设图中有m个环,每个环有si条边,有k条边不在环中 ans= (2^s1 -2)*( 2^s2 -2)* (2^s3 -2)… ...
- 2017北京国庆刷题Day3 morning
期望得分:100+60+0=160 实际得分:100+30+0=130 考场上用的哈希 #include<cstdio> #include<cstring> #include& ...
- 2017北京国庆刷题Day2 afternoon
期望得分:100+100+50=250 实际得分:100+70+50=220 T1 最大值(max) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK有一 ...
- 2017北京国庆刷题Day2 morning
期望得分:100+100+40=240 实际得分:100+40+0=140 T1 一道图论神题(god) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK ...
- 2017北京国庆刷题Day4 morning
期望得分:0+40+30=70 实际得分:0+10+10=20 题目修改:只能由0变1,只能用一次操作 大模拟 #include<cstdio> #include<cstring&g ...
- 2017北京国庆刷题Day5 morning
期望得分:0+60+60=120 实际得分:0+30+60=90 令g=gcd(X11,X12,X13……) 则行列式可能为D的充要条件为g|D 1.g|D为必要条件: 由定义来算行列式的时候,每一项 ...
随机推荐
- C++ STL栈和队列
在C++标准库(STL)中,实现了栈和队列,方便使用,在这里我整理了一下笔记,作简要介绍. 1,栈(stack): 头文件 : #include<stack> 定义栈 :stack< ...
- 项目Beta冲刺(团队)第一天
1.今天解决的进度 成员 进度 陈家权 回复界面设计,由于成员变动加上和其他成员距离较远,服务器404 赖晓连 改进Alpha版本页面没能及时更新的问题 雷晶 获取提问问题时间更新到数据库 林巧娜 今 ...
- HDU 5861 Road 线段树区间更新单点查询
题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=5861 Road Time Limit: 12000/6000 MS (Java/Othe ...
- PAT 甲级 1077 Kuchiguse
https://pintia.cn/problem-sets/994805342720868352/problems/994805390896644096 The Japanese language ...
- oracle impdp导入时 提示“ORA-39002: 操作无效 ORA-39070: 无法打开日志文件 ”
第一步:首先使用DBA权限的用户创建directory,我使用system ,可以在服务器本地创建,也可以远程连接sqlplus进行创建,使用的将是服务器上面的路径.要确保创建directory时,操 ...
- 新浪 ip 地址库
API地址:http://int.dpool.sina.com.cn/iplookup/iplookup.php 帮助 1 2 3 4 5 6 7 8 function get_location($i ...
- 【前端学习笔记】JavaScript JSON对象相关操作
//JSON方法 //JSON.parse(); var json = '{"name":"zj","age":23}'; JSON.par ...
- CERC2013(C)_Magical GCD
题意是这样的,给你一个序列a[i],需要你选一段连续的序列a[i]到a[j],使得长度乘以这个段的gcd最大. 一开始总是以为是各种神奇的数据结构,诶,后来才发现,机智才是王道啊. 可以这样考虑,每次 ...
- BZOJ4883 棋盘上的守卫(环套树+最小生成树)
容易想到网络流之类的东西,虽然范围看起来不太可做,不过这提供了一种想法,即将行列分别看做点.那么我们需要找一种连n+m条边的方案,使得可以从每条边中选一个点以覆盖所有点.显然每个点至少要连一条边.于是 ...
- Seek the Name, Seek the Fame POJ - 2752(拓展kmp || kmp)
题意: 就是求前缀和后缀相同的那个子串的长度 然后从小到大输出 解析: emm...网上都用kmp...我..用拓展kmp做的 这就是拓展kmp板题嘛... 求出extend数组后 把exten ...