首页 > 其他分享 >AtCoder Beginner Contest 265(D-E)

AtCoder Beginner Contest 265(D-E)

时间:2022-08-29 20:57:25浏览次数:91  
标签:AtCoder typedef const 前缀 Beginner ll mp 265 sum

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,typedef,const,前缀,Beginner,ll,mp,265,sum
From: https://www.cnblogs.com/hhzp/p/16637327.html

相关文章

  • [Atcoder]ABC266题解
    C-ConvexQuadrilateral计算几何给定平面内四个点,要求判断它们组成的四边形是否是凸四边形法一:凸四边形的两条对角线将其分成两个三角形分成的两个三角形面积相加......
  • AtCoder Beginner Contest 266 题解
    只有ABCDEFG的题解。A模拟。代码voidmian(){strings;cin>>s;intpos=int(s.size())/2;cout<<s[pos]<<endl;}B模拟,注意longlong。......
  • AtCoder Beginner Contest 266 D(DP)
    ……题面Takahashi要抓Snuke。好狠心的Takahashi呀(bushiSnuke有5个洞(,在$0m,1m,2m,3m,4m$处。Takahashi开始在$0m$处,每秒他能走$1m$。第$i......
  • AtCoder Beginner Contest 266 A-D
    AtCoderBeginnerContest266https://atcoder.jp/contests/abc266EF待补A-MiddleLetter输出字符串最中间的那个字母#include<bits/stdc++.h>usingnamespace......
  • Atcoder ABC 266 EF
    E题目大意有一个游戏,你可以玩\(n\)次,每次投一个骰子,若数字为\(X\),则:若这把是第\(n\)把,那么你的分数为\(X\),游戏结束否则,你可以选择继续游戏,或者立刻停止游戏,分数为\(X......
  • atcoder
    \(ARC143\)A给定三个整数,一次可以将两个数或三个数减一,问最少几步能减完。设一开始三个数为\(A,B,C(A\leqB\leqC)\),如果\(A+B<C\),那么说明一定是无法满足条件的......
  • AtCoder-abc265_e Manhattan Cafe
    ManhattanCafedp前缀和优化很容易想到\(dp\)的状态\(dp[i][j][k]\)表示前\(i\)个点,\(r_x\)与\(p_x\)的差值和为\(j\),\(r_x\)与\(q_x\)的差值和为\(k\)......
  • AtCoder Beginner Contest 263(Java)
    A题桶排序1importjava.util.*;2publicclassMain{3publicstaticvoidmain(String[]args){4Scannersc=newScanner(System.in);5......
  • AtCoder Beginner Contest 265 D Iroha and Haiku (New ABC Edition)
    \(O{(n\logn)}\)做法我在考场上只想到此做法,不难想到,可以将三段用二分预处理。\(xs[i]\)表示从\(a_i\)开始总和为\(P\)的末尾编号,可以用二分处理。最后\(O(n)\)判......
  • AtCoder-abc265_e Warp
    Warpdp状态优化一开始想到的状态为:\(dp[i][x][y]\),第\(i\)步走到\((x,y)\)的方案数,但是发现状态转移非常难写,原因是坐标计算非常大后来可以优化一下\(dp\)的状态......