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为必要条件: 由定义来算行列式的时候,每一项 ...
随机推荐
- TensorFlow:NameError: name ‘input_data’ is not defined
在运行TensorFlow的MNIST实例时,第一步 import tensorflow.examples.tutorials.mnist.input_data mnist = input_data. ...
- JAVA之路(一)
距离做下复习JAVA并学好JAVA的决定已经过去一周了,我买了慕课网的JAVA入门视频,在图书馆借了三本关于JAVA的书——两本是JAVA入门经典,一本是JAVA WEB开发宝典.我的计划是短时间内复 ...
- 蜗牛慢慢爬 LeetCode 3. Longest Substring Without Repeating Characters [Difficulty: Medium]
题目 Given a string, find the length of the longest substring without repeating characters. Examples: ...
- udp 局域网群聊
UDP: 无连接协议 udp协议发送数据,用的是数据报包的形式.(64KB以内) 发送端: 1.定义发送的datagramsocket对象,发送端可以不用定义端口 2.定义封装数据包datag ...
- [微软官网]One Windows Kernel
One Windows Kernel https://techcommunity.microsoft.com/t5/Windows-Kernel-Internals/One-Windows-Kerne ...
- Oracle判断字段中是否包含中文(若有,取出该中文的方法)
一.问题说明 在处理数据的时候,需要判断某个字段字符串中是否有中文,若有则取出中文. 二.解决办法 首先如何判断某个字段字符串中是否有中文.这里介绍三种方法: 1.采用ASCIISTR函数 说明:AS ...
- Spring Boot 学习笔记 - 01
看了[纯洁的微笑]的博客后,我决定开始学好 Spring 体系了,真的是解决了饥渴的我.
- Java 面试前的基础准备 - 01
使用这个在线网页编辑真的是不习惯,还是 windows live writer 好. 下面列一个清单用于最近的面试:( 清单是网上down的 ) static,final,transient 等关键字 ...
- ssh & sftp & MacOS
ssh & sftp & MacOS https://www.technoduet.com/a-simple-way-to-connect-to-remote-ftp-sever-on ...
- Innobackupx工具命令简单解析
--defaults-file 同xtrabackup的--defaults-file参数,指定mysql配置文件; --apply-log 对xtrabackup的--prepare参数的封装; - ...