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. ZOJ4110 Strings in the Pocket(2019浙江省赛)

    给出两个字符串,询问有多少种反转方法可以使字符串1变成字符串2. 如果两个串相同,就用马拉车算法找回文串的数量~ 如果两个串不同,从前往后找第一个不同的位置l,从后往前找第二个不同的位置r,反转l和r ...

  2. 模块学习-json pickle

    json json序列化 import json def sayhi(name): print("hello",name) info = { 'name':'mogu', 'age ...

  3. Hibernate学习(五)

    自关联测试案例 1.创建表 drop table if exists t_category ; create table t_category ( id ) primary key , name ) ...

  4. java web第一次课堂测试1

    ---恢复内容开始--- 要求如图: 本程序包括四个文件,一个显示界面的jsp文件,一个dao层文件,一个servlet层文件 一个连接数据库的文件 下面依次附上代码: 前端界面: <%@ pa ...

  5. Hive的mysql安装配置

    一.MySQL的安装 Hive的数据,是存在HDFS里的.此外,hive有哪些数据库,每个数据库有哪些表,这样的信息称之为hive的元数据信息. 元数据信息不存在HDFS,而是存在关系型数据库里,hi ...

  6. 记处理spring-devtools 和 通用mapper 使用问题

    问题: tk.mybatis.mapper.MapperException: 无法获取实体类com.*.* 对应的表名 环境: springboot 2.0.6, 通用mapper 2.0.4,还有 ...

  7. C语言笔记 12_可变参数&内存管理&命令行参数

    可变参数 有时,您可能会碰到这样的情况,您希望函数带有可变数量的参数,而不是预定义数量的参数.C 语言为这种情况提供了一个解决方案,它允许您定义一个函数,能根据具体的需求接受可变数量的参数.下面的实例 ...

  8. iOS项目开发日常之创建文件(协议、类、分类、扩展)

    iOS项目开发过程中,是以不断创建文件的形式进行着的. 创建得比较频繁的文件类型是: 这两个类型中创建的文件有:子类.分类.扩展.协议四种文件,如下:    这四类文件是频繁创建的,我们来看一下各自分 ...

  9. GO 回调实现

    函数作为参数传递,实现回调. package main import "fmt" // 声明一个函数类型 type cb func(int) int func main() { t ...

  10. spring boot中的底层配置文件application.yam(application.property)的装配原理初探

    *在spring boot中有一个基础的配置文件application.yam(application.property)用于对spring boot的默认设置做一些改动. *在spring boot ...