A

A

不解释

#include<bits/stdc++.h>
using namespace std;
namespace red{
inline int read()
{
int x=0;char ch,f=1;
for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar());
if(ch=='-') f=0,ch=getchar();
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return f?x:-x;
}
int a[5];
inline bool check(int id)
{
return (a[id]+a[id+1]>a[id+2]&&a[id+2]-a[id+1]<a[id]);
}
inline bool check2(int id)
{
return (a[id]+a[id+1]>=a[id+2]);
}
inline void main()
{
for(int i=1;i<=4;++i) a[i]=read();
sort(a+1,a+4+1);
if(check(1)||check(2)) puts("TRIANGLE");
else if(check2(1)||check2(2)) puts("SEGMENT");
else puts("IMPOSSIBLE");
}
}
signed main()
{
red::main();
return 0;
}

B

B

找到位置开始\(dfs\)

#include<bits/stdc++.h>
using namespace std;
namespace red{
inline int read()
{
int x=0;char ch,f=1;
for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar());
if(ch=='-') f=0,ch=getchar();
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return f?x:-x;
}
int n,m,sum;
char ch;
char mp[110][110];
bool vis[1010];
bool g[110][110];
int dx[]={0,-1,1,0,0},dy[]={0,0,0,1,-1};
inline void dfs(int x,int y)
{
for(int i=1;i<=4;++i)
{
int tx=x+dx[i],ty=y+dy[i];
if(tx<1||tx>n||ty<1||ty>m) continue;
if(g[tx][ty]) continue;
g[tx][ty]=1;
if(mp[tx][ty]==ch) dfs(tx,ty);
else if(mp[tx][ty]!='.'&&!vis[mp[tx][ty]])
{
vis[mp[tx][ty]]=1;
++sum;
}
}
}
inline void main()
{
n=read(),m=read();
for(ch=getchar();(ch<'A'||ch>'Z');ch=getchar());
for(int i=1;i<=n;++i)
{
scanf("%s",mp[i]+1);
}
for(int i=1;i<=n;++i)
{
for(int j=1;j<=m;++j)
{
if(mp[i][j]==ch)
{
dfs(i,j);
printf("%d\n",sum);
return;
}
}
}
}
}
signed main()
{
red::main();
return 0;
}

C

C

也就一个模拟,前后维护两个指针

#include<bits/stdc++.h>
using namespace std;
namespace red{
inline int read()
{
int x=0;char ch,f=1;
for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar());
if(ch=='-') f=0,ch=getchar();
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return f?x:-x;
}
const int N=1e5+10;
int n;
int a[N];
int t1,t2,sum1,sum2;
inline void main()
{
n=read();
for(int i=1;i<=n;++i)
{
a[i]=read();
}
t1=0,t2=n+1;
while(t1<t2-1)
{
++t1;
sum1+=a[t1];
while(sum2<sum1&&t1<t2-1) --t2,sum2+=a[t2];
}
cout<<t1<<' '<<n-t1<<endl;
}
}
signed main()
{
red::main();
return 0;
}

D

D

看了眼数据范围:

\(3\le n\le 10\) , \(1\le b < a\le 10\) , \(1\le h_i \le 15\)

\(!\)

搜他丫的

注意两边是没法点火球的,先把两边消掉,然后在中间迭代加深

因为\(n=3\)的时候预处理两边会出锅,先判掉

然后提交

\(TLE\)

发现一个性质:火球先后顺序无关

减少一下搜索重复状态:只在一个火球之后扔火球

\(AC\)了

#include<bits/stdc++.h>
using namespace std;
namespace red{
inline int read()
{
int x=0;char ch,f=1;
for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar());
if(ch=='-') f=0,ch=getchar();
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return f?x:-x;
}
const int N=110;
int n,a,b;
int hp[N];
int bp[N],c[N];
int d[N],ans[N];
int t,sum;
inline bool dfs(int pre,int now,int up)
{
if(now>up)
{
for(int i=1;i<=t;++i)
if(~bp[i]) return 0;
return 1;
}
for(int i=pre;i<=t;++i)
{
int q1=bp[i-1],q2=bp[i],q3=bp[i+1];
bp[i-1]=max(bp[i-1]-b,-1);
bp[i]=max(bp[i]-a,-1);
bp[i+1]=max(bp[i+1]-b,-1);
ans[now]=c[i];
if(dfs(i,now+1,up)) return 1;
bp[i-1]=q1,bp[i]=q2,bp[i+1]=q3;
}
return 0;
}
inline void solve()
{
sum=max(max(hp[1]/b+1,hp[3]/b+1),hp[2]/a+1);
printf("%d\n",sum);
for(int i=1;i<=sum;++i) printf("%d ",2);
exit(0);
}
inline void main()
{
n=read(),a=read(),b=read();
for(int i=1;i<=n;++i) hp[i]=read();
if(n==3) solve();
t=(hp[1])/b+1;
hp[1]=-1;
hp[2]=max(hp[2]-t*a,-1);
hp[3]=max(hp[3]-t*b,-1);
for(int i=1;i<=t;++i) d[i]=2;
sum+=t;
t=(hp[n])/b+1;
hp[n]=-1;
hp[n-1]=max(hp[n-1]-t*a,-1);
hp[n-2]=max(hp[n-2]-t*b,-1);
for(int i=sum+1;i<=sum+t;++i) d[i]=n-1;
sum+=t;
bool flag=0;
for(int i=1;i<=n;++i)
if(~hp[i]) flag=1;
if(!flag)
{
printf("%d\n",sum);
for(int i=1;i<=sum;++i) printf("%d ",d[i]);
return;
}
for(int i=1;;++i)
{
t=0;
for(int j=2;j<n;++j) bp[++t]=hp[j],c[t]=j;
if(dfs(1,1,i))
{
for(int j=sum+1;j<=sum+i;++j) d[j]=ans[j-sum];
sum+=i;
sort(d+1,d+sum+1);
printf("%d\n",sum);
for(int j=1;j<=sum;++j) printf("%d ",d[j]);
return;
}
}
}
}
signed main()
{
red::main();
return 0;
}

然后发现这题目是可以\(dp\)的……

设\(dp[i][j][k]\)表示前\(i\)个都死了,第\(i\)个用了\(j\)个火球,第\(i+1\)个用了\(k\)个火球的最小代价

不得不说这个状态很巧妙……

然后暴力转移\(n*h^3\),其中\(h=max\{h_i\}\)

其中我们发现当枚举了当前状态之后,之前那个转移状态可以后缀最大值优化,优化到\(n*h^2\)

#include<bits/stdc++.h>
using namespace std;
namespace red{
inline int read()
{
int x=0;char ch,f=1;
for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar());
if(ch=='-') f=0,ch=getchar();
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return f?x:-x;
}
const int N=110;
int n,a,b,ret,t0,t1,t2;
int hp[N];
int f[21][21][21],g[21][21][21];
inline void main()
{
n=read(),a=read(),b=read();
for(int i=1;i<=n;++i) hp[i]=read();
memset(f,0x3f,sizeof(f));
for(int i=1;i<=20;++i)
if(i*b>hp[1]) f[1][0][i]=0;
//kcz:i-n死完了,i-1用j个,i用k个
//俺:1-i死完了,i用j个,i用k+1个
//dp方法:直接dp,最后输出满足要求的状态
for(int i=1;i<=n;++i)
{
if(i>1)
{
for(int k=0;k<=16;++k)
{
int tmp=hp[i]-k*b;
for(int j=0;j<=16;++j)
{
f[i][j][k]=j+g[i-1][tmp<0?0:tmp/b+1][j];
tmp-=a;
}
}
}
for(int k=0;k<=16;++k)
{
g[i][16][k]=f[i][16][k];
for(int j=15;~j;--j)
g[i][j][k]=min(g[i][j+1][k],f[i][j][k]);
}
}
int i=n,j=0,k=0;
printf("%d\n",f[i][j][k]);
while(--i>1)
{
int tmp=hp[i+1]-j*a-k*b;
int l=tmp<0?0:tmp/b+1;
while(f[i][l][j]!=f[i+1][j][k]-j) ++l;
k=j,j=l;
for(int u=1;u<=l;++u) printf("%d ",i);
}
}
}
signed main()
{
red::main();
return 0;
}
/*
9 3 1
1 5 2 4 6 2 3 4 2 */

E

E

预处理\(st\)表

二分求答案

然后统计答案

#include<bits/stdc++.h>
using namespace std;
namespace red{
inline int read()
{
int x=0;char ch,f=1;
for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar());
if(ch=='-') f=0,ch=getchar();
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return f?x:-x;
}
const int N=1e5+10;
int n,m,l,r,mid,ret,sum;
int a[N],lg[N];
bool s[N];
int f[N][21],g[N][21];
inline int get_max(int l,int r)
{
int k=lg[r-l+1]-1;
return max(f[l][k],f[r-(1<<k)+1][k]);
}
inline int get_min(int l,int r)
{
int k=lg[r-l+1]-1;
return min(g[l][k],g[r-(1<<k)+1][k]);
}
inline bool check(int x)
{
for(int l=1;l<=n;++l)
{
int r=l+x-1;
if(r>n) return 0;
if(get_max(l,r)-get_min(l,r)<=m) return 1;
}
return 0;
}
inline void get_sum(int x)
{
for(int l=1;l<=n;++l)
{
int r=l+x-1;
if(r>n) return;
if(get_max(l,r)-get_min(l,r)<=m) ++sum,s[l]=1;
}
}
inline void main()
{
n=read(),m=read();
for(int i=1;i<=n;++i) a[i]=f[i][0]=g[i][0]=read();
for(int i=1;i<=n;++i) lg[i]=lg[i>>1]+1;
lg[0]=1;
for(int i=1;i<=20;++i)
{
for(int j=1;j+(1<<i)-1<=n;++j)
{
f[j][i]=max(f[j][i-1],f[j+(1<<(i-1))][i-1]);
g[j][i]=min(g[j][i-1],g[j+(1<<(i-1))][i-1]);
}
}
l=1,r=n;
while(l<=r)
{
mid=(l+r)>>1;
if(check(mid)) ret=mid,l=mid+1;
else r=mid-1;
}
get_sum(ret);
printf("%d %d\n",ret,sum);
for(int i=1;i<=n;++i)
{
if(s[i]) printf("%d %d\n",i,i+ret-1);
}
}
}
signed main()
{
red::main();
return 0;
}

CF6的更多相关文章

  1. java web学习总结(二十六) -------------------JSP属性范围

    所谓的属性范围就是一个属性设置之后,可以经过多少个其他页面后仍然可以访问的保存范围. 一.JSP属性范围 JSP中提供了四种属性范围,四种属性范围分别指以下四种: 当前页:一个属性只能在一个页面中取得 ...

  2. Tomcat 学习心得

    Tomcat Server的结构图 Tomcat服务器的启动是基于一个server.xml文件的,Tomcat启动的时候首先会启动一个Server,Server里面就会启动Service,Servic ...

  3. JMeter执行dos命令

    1.通过java代码实现 参考Java实现操作dos命令 2.直接通过JMeter内置的beanshell脚本操作 String command = "cmd /c start ping w ...

  4. hack

    1.Firefox @-moz-document url-prefix() { .selector { property: value; } }上面是仅仅被Firefox浏览器识别的写法,具体如: @ ...

  5. .net中创建xml文件的两种方法

    .net中创建xml文件的两种方法 方法1:根据xml结构一步一步构建xml文档,保存文件(动态方式) 方法2:直接加载xml结构,保存文件(固定方式) 方法1:动态创建xml文档 根据传递的值,构建 ...

  6. java web学习总结(三) -------------------TOMCAT使用帮助(二)

    一.打包JavaWeb应用 在Java中,使用"jar"命令来对将JavaWeb应用打包成一个War包,jar命令的用法如下:

  7. 深入解析SQL Server并行执行原理及实践(下)

    谈完并行执行的原理,咱们再来谈谈优化,到底并行执行能给我们带来哪些好处,我们又应该注意什么呢,下面展开. Amdahl’s  Law 再谈并行优化前我想有必要谈谈阿姆达尔定律,可惜老爷子去年已经驾鹤先 ...

  8. html5新增标签及兼容

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. 各种浏览器的Hack写法(chrome firefox ie等)

    Hack是针对不同的浏览器去写不同的CSS样式,从而让各浏览器能达到一致的渲染效果,那么针对不同的浏览器写不同的CSS CODE的过程,就叫CSS HACK,同时也叫写CSS Hack. 然后将Hac ...

随机推荐

  1. C:编译过程、目标代码文件、 可执行文件和库

    C编程的基本策略是, 用程序把源代码文件转换为可执行文件(其中包含可直接运行的机器语言代码). 典型的C实现通过编译和链接两个步骤来完成这一过程. 编译器把源代码转换成中间代码, 链接器把中间代码和其 ...

  2. cf 908B

    B - New Year and Buggy Bot 思路:刚开始看到这个题的时候,一头雾水,也不知道要干什么,后来百度翻译了了一遍,看明白了,不得不说自己的英语太差了,好了,步入正题: 给你n行m列 ...

  3. CSS的精灵技术

  4. Cisco Cat4500系列High CPU故障步骤摘要

    在实际网络环境中,很多时候都会出现设备high CPU的情况,有些时候可能是bug,而某些情况下,也可能是网络中发生了变化,导致了设备出现high CPU情况,这里主要记录一下Cisco Cat450 ...

  5. Educational Codeforces Round 82 C. Perfect Keyboard

    Polycarp wants to assemble his own keyboard. Layouts with multiple rows are too complicated for him ...

  6. 【原】Docker学习_Docker上传镜像至docker hub(4)

    构造镜像的两种方式:1.commit  2.Dockerfile Docker提供了一个docker commit命令,可以将容器的存储层保存下来成为镜像.换句话说,就是在原有镜像的基础上,再叠加上容 ...

  7. spring boot+jwt 权限验证

    上周看了一下jwt以前公司的开发都是使用session共享的方法.现在主流的两种方式一种是把登录信息保存在服务器,另一种则是把信息保存在客户端.在使用session 存储的时候会遇到很多的问题,随着项 ...

  8. win10 安装"pip install orange3" 出现LINK : fatal error LNK1158: cannot run 'rc.exe' 错误的解决办法

    解决办法: 从(本例使用的是64位的python3.6 注意:如果python的版本是32位,则使用x86:如果是64位,则使用x64;) 复制一下两个文件 rc.exe rcdll.dll 到

  9. String类为什么是不可变的

    String类为啥是final的? 我们找到string的jdk源码 1.看到String类被final修饰.这里你就要说出被final修饰的类不能被继承,方法不能被重写,变量不能被修改. 2.看到f ...

  10. ava StringTokenizer 类使用方法

    菜鸟教程 -- 学的不仅是技术,更是梦想! 首页 笔记首页 Android 互联网 程序员人生 程序员笑话 编程技术 红包 知识店铺 --> 首页 Android 鸡汤 逗乐 Search Ja ...