D - Iroha and Haiku (New ABC Edition)

题意: 找一个最少含有三个点的区间,将区间分成三块,三块的和分别为p,q,r,问是否存在这样的区间

题解:先预处理一遍前缀和,和每一个前缀和出现的位置,然后从前往后遍历,每次遍历当前位置的前缀和,如果当前位置的前缀和>=(p+q+r),那么就有可能存在符合条件的区间,在看是否存在前缀和为

sum-p-q-r的点,如果有再判断区间内部是否符合即可。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pll;
const int N=2e5+5;
const ll inf=1e18;
const ll mod=998244353;
ll a[N],sum[N];
ll n,p,q,e;
unordered_map<ll,ll> mp;
bool check(ll l,ll r){
ll le=0;
ll b[3]={p,q,e};
ll cnt=0;
for(ll i=l;i<=r;i++){
le+=a[i];
if(le==b[cnt]) cnt++,le=0;//如果相等就看下一个区间
else if(le>b[cnt]) return 0;//如果大于了就证明这个区间不符合条件
}
return 1;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n>>p>>q>>e;
for(ll i=1;i<=n;i++){
cin>>a[i];sum[i]=sum[i-1]+a[i];
mp[sum[i]]=i;
}
for(ll i=1;i<=n;i++){
if(sum[i]==p+q+e){
if(check(1,i)){
cout<<"Yes"<<endl;return 0;
}
}
if(sum[i]>p+q+e){
if(!mp[sum[i]-p-q-e]) continue;
if(check(mp[sum[i]-p-q-e]+1,i)){
cout<<"Yes"<<endl;return 0;
}
}
}
cout<<"No"<<endl;
}

E - Warp

题意: 给出四种移动的方向,每次选择一种,有m个障碍,不能传送到障碍上,问在进行n次传送的情况下,有几种移动路径。

题解: 每次四种选择,dp问题,问题在于转移方程,因为已知了最后一共要进行n次传送,所以可以遍历每种方向选择的次数。

dp[ i ][ j ][ z ]表示的是第一种移动i次,第二种j次,第三种z次。

转移方程就让他加上他的前一个状态即可。

//这里用set的速度比mp快

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pll;
const int N=2e5+5;
const ll inf=1e18;
const ll mod=998244353;
ll sum[N];
pll px[N];
pll a[N];
ll n,m,dp[305][305][305];
set<pll> mp;
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n>>m;
for(ll i=1;i<=3;i++) cin>>px[i].first>>px[i].second;
for(ll i=1;i<=m;i++){ cin>>a[i].first>>a[i].second;mp.insert(a[i]);}
ll ans=0;
dp[0][0][0]=1;
for(ll i=0;i<=n;i++)
for(ll j=0;j<=n-i;j++)
for(ll z=0;z<=n-i-j;z++){
if(!i&&!j&&!z) continue;
ll x=i*px[1].first+j*px[2].first+z*px[3].first;
ll y=i*px[1].second+j*px[2].second+z*px[3].second;
if(mp.count({x,y})) continue;//判断是否是障碍
if(i) dp[i][j][z]=(dp[i][j][z]+dp[i-1][j][z])%mod;//与前一个状态相加
if(j) dp[i][j][z]=(dp[i][j][z]+dp[i][j-1][z])%mod;
if(z) dp[i][j][z]=(dp[i][j][z]+dp[i][j][z-1])%mod;
if(i+j+z==n) ans=(ans+dp[i][j][z])%mod;//如果当前的状态是够n个的,就加上
}
cout<<ans;
}

AtCoder Beginner Contest 265(D-E)的更多相关文章

  1. AtCoder Beginner Contest 100 2018/06/16

    A - Happy Birthday! Time limit : 2sec / Memory limit : 1000MB Score: 100 points Problem Statement E8 ...

  2. AtCoder Beginner Contest 052

    没看到Beginner,然后就做啊做,发现A,B太简单了...然后想想做完算了..没想到C卡了一下,然后还是做出来了.D的话瞎想了一下,然后感觉也没问题.假装all kill.2333 AtCoder ...

  3. AtCoder Beginner Contest 053 ABCD题

    A - ABC/ARC Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Smeke has ...

  4. AtCoder Beginner Contest 136

    AtCoder Beginner Contest 136 题目链接 A - +-x 直接取\(max\)即可. Code #include <bits/stdc++.h> using na ...

  5. AtCoder Beginner Contest 137 F

    AtCoder Beginner Contest 137 F 数论鬼题(虽然不算特别数论) 希望你在浏览这篇题解前已经知道了费马小定理 利用用费马小定理构造函数\(g(x)=(x-i)^{P-1}\) ...

  6. AtCoder Beginner Contest 076

    A - Rating Goal Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Takaha ...

  7. AtCoder Beginner Contest 079 D - Wall【Warshall Floyd algorithm】

    AtCoder Beginner Contest 079 D - Wall Warshall Floyd 最短路....先枚举 k #include<iostream> #include& ...

  8. AtCoder Beginner Contest 064 D - Insertion

    AtCoder Beginner Contest 064 D - Insertion Problem Statement You are given a string S of length N co ...

  9. AtCoder Beginner Contest 075 D - Axis-Parallel Rectangle【暴力】

    AtCoder Beginner Contest 075 D - Axis-Parallel Rectangle 我要崩溃,当时还以为是需要什么离散化的,原来是暴力,特么五层循环....我自己写怎么都 ...

随机推荐

  1. Linux常用命令-创建用户修改密码-useradd

    命令简介 useradd/userdel 创建新用户/删除用户,需要管理员权限操作. 在创建用户时,如果不配置密码,用户的默认密码是不可用的,所以,useradd命令一般与passwd命令配合使用,下 ...

  2. 27.MySQL 索引、事务与存储引擎

    MySQL 索引.事务与存储引擎 目录 MySQL 索引.事务与存储引擎 MySQL 索引 索引的概念 索引的作用及副作用 索引的作用 索引的副作用 创建索引的原则依据 索引的分类和创建 普通索引 唯 ...

  3. [二进制漏洞]栈(Stack)溢出漏洞 Linux篇

    目录 [二进制漏洞]栈(Stack)溢出漏洞 Linux篇 前言 堆栈 堆栈(Stack)概念 堆栈数据存储方式 函数调用 函数调用C语言代码 函数调用过程GDB调试 函数Call返回原理 函数栈帧 ...

  4. 从svn下载项目后出现 Error:java: Compilation failed: internaljava compiler error 解决办法

    原因:出现这个问题的话,主要是因为导入的项目JDK版本与自己的不匹配. 解决方法如下: 最后,酱紫

  5. 虚拟机使用docker 外部机器无法访问端口问题

    1,排查防火墙firewall-cmd --state 如果输出的是"not running"则FirewallD没有在运行,且所有的防护策略都没有启动,那么可以排除防火墙阻断连接 ...

  6. Java开发学习(九)----IOC之核心容器

    这里所说的核心容器,大家可以把它简单的理解为ApplicationContext,前面虽然已经用到过,但是并没有系统的介绍过,接下来咱们从以下几个问题入手来下容器的相关知识: 如何创建容器? 创建好容 ...

  7. C# MVCapi跨域问题

     he 'Access-Control-Allow-Origin' header contains multiple values ', *', but only one is allowed. Or ...

  8. ACWing94. 递归实现排列型枚举

    题面 把 1∼n 这 n个整数排成一行后随机打乱顺序,输出所有可能的次序. 输入格式 一个整数 n. 输出格式 按照从小到大的顺序输出所有方案,每行 1 个. 首先,同一行相邻两个数用一个空格隔开. ...

  9. 好串_via牛客网

    题目 链接:https://ac.nowcoder.com/acm/contest/28537/C 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言 ...

  10. 2022-7-15 pan小堂 数组排序算法

    二分查找(理解) public ych class{ public static void main(String[] args){ ///运用二分查找需要 数组在的值是递升的 int[] arr1 ...