• AC修炼计划(AtCoder Regular Contest 166)


    传送门:AtCoder Regular Contest 166 - AtCoder

    一直修炼cf,觉得遇到了瓶颈了,所以想在atcode上寻求一些突破,今天本来想尝试vp AtCoder Regular Contest 166,但结局本不是很好,被卡了半天,止步于B题。不过确实,感觉AtCoder的题目还是很不错的,一改cf的很多惯性思路。

    这里借用了大佬樱雪喵的题解链接,大佬的传送门如下Atcoder Regular Contest 166 - 樱雪喵 - 博客园 (cnblogs.com)

    B - Make Multiples

    问题陈述

    给你一个整数序列 A=(A1​,…,AN​),以及正整数 a,b 和 c。

    你可以对这个数列进行以下运算,次数不限,可能为零。

    • 选择一个整数 i,使得 1≤i≤N.将 Ai​ 替换为 Ai​+1。

    你的目标是使数列 A 至少包含一个 a 的倍数,至少一个 b 的倍数,以及至少一个 c 的倍数。求实现这一目标所需的最少运算次数。

    1. #include
    2. using namespace std;
    3. #define int long long
    4. typedef long long ll;
    5. typedef pair<int,int> PII;
    6. const int N=998244353;
    7. const ll MX=0x3f3f3f3f3f3f3f3f;
    8. int n,m;
    9. int lcm(int a,int b){
    10. return a*b/__gcd(a,b);
    11. }
    12. void icealsoheat(){
    13. int a,b,c;
    14. cin>>n>>a>>b>>c;
    15. vector dp(n+5,vector(10,MX));
    16. int op[]={1,a,b,lcm(a,b),c,lcm(a,c),lcm(c,b),lcm(lcm(a,c),b)};
    17. dp[0][0]=0;
    18. for(int i=0;i
    19. int x;
    20. cin>>x;
    21. for(int j=0;j<8;j++){
    22. for(int k=0;k<8;k++){
    23. if((j&k)==0){
    24. // dp[i+1][j|k]=min(dp[i+1][j|k],dp[i][j]+op[k])
    25. if(x%op[k]==0){
    26. dp[i+1][j|k]=min(dp[i+1][j|k],dp[i][j]);
    27. }
    28. else{
    29. dp[i+1][j|k]=min(dp[i+1][j|k],dp[i][j]+(x/op[k]+1ll)*op[k]-x);
    30. }
    31. }
    32. }
    33. }
    34. // cout<
    35. }
    36. cout<7]<<"\n";
    37. }
    38. signed main(){
    39. ios::sync_with_stdio(false);
    40. cin.tie();
    41. cout.tie();
    42. int _;
    43. _=1;
    44. // cin>>_;
    45. while(_--){
    46. icealsoheat();
    47. }
    48. }

    C - LU / RD Marking

    问题陈述

    有一个网格,网格中有 H 行和 W 列。

    这个网格有H(W+1)条垂直边和W(H+1)条水平边,共计H(W+1)+W(H+1)条(另见输入/输出示例中的数字)。请考虑通过以下两种操作来标记这些边。

    • 操作 (1)**:选择一个正方形,在进行此操作时,其左边缘和上边缘均未标记。标记该正方形的左边缘和上边缘。
    • 操作 (2):选择一个右边和下边在执行此操作时没有标记的正方形。标出该正方形的右边和下边。

    求操作(1)和操作(2)执行任意多次(可能为零)时,最终被标记的边的可能集合的数量,模为 998244353998244353。

    您有 T 个测试案例需要解决。

    这里要借用官方题解的图例:

    由此将方块拆开找规律。

    1. #include
    2. using namespace std;
    3. #define int long long
    4. typedef long long ll;
    5. typedef pair<int,int> PII;
    6. const int N=998244353;
    7. const ll MX=0x3f3f3f3f3f3f3f3f;
    8. int n,m;
    9. int dp[2000008];
    10. int sum[2000008];
    11. int kuai(int a,int b){
    12. int ans=1;
    13. while(b){
    14. if(b&1)ans=ans*a%N;
    15. b>>=1;
    16. a=a*a%N;
    17. }
    18. return ans%N;
    19. }
    20. void icealsoheat(){
    21. cin>>n>>m;
    22. if(n>m)swap(n,m);
    23. int ans=sum[n]*kuai(dp[2*n],m-n)%N;
    24. cout<"\n";
    25. }
    26. signed main(){
    27. ios::sync_with_stdio(false);
    28. cin.tie();
    29. cout.tie();
    30. int _;
    31. _=1;
    32. cin>>_;
    33. dp[0]=1;
    34. dp[1]=2;
    35. for(int i=2;i<=2000005;i++){
    36. dp[i]=dp[i-1]+dp[i-2];
    37. dp[i]%=N;
    38. }
    39. sum[0]=1;
    40. for(int i=1;i<=1000000;i++){
    41. sum[i]=sum[i-1]*dp[2*i-1]%N*dp[2*i-1]%N;
    42. }
    43. while(_--){
    44. icealsoheat();
    45. }
    46. }

    D - Interval Counts

    因为这题还是比较好想的所以直接上代码

    1. #include
    2. using namespace std;
    3. #define int long long
    4. typedef long long ll;
    5. typedef pair<int,int> PII;
    6. const int N=998244353;
    7. const ll MX=0x3f3f3f3f3f3f3f3f;
    8. int n,m;
    9. void icealsoheat(){
    10. cin>>n;
    11. vector<int>x;
    12. vector<int>y;
    13. x.push_back(-2e9);
    14. y.push_back(0);
    15. for(int i=1;i<=n;i++){
    16. int xx;
    17. cin>>xx;
    18. x.push_back(xx);
    19. }
    20. vectorve;
    21. for(int i=1;i<=n;i++){
    22. int xx;
    23. cin>>xx;
    24. y.push_back(xx);
    25. }
    26. ll maxx=2e9;
    27. int id=0;
    28. for(int i=1;i<=n;i++){
    29. if(y[i]==y[i-1])continue;
    30. else if(y[i]>y[i-1])ve.push_back({x[i-1]+1,y[i]-y[i-1]});
    31. else{
    32. int now=y[i-1]-y[i];
    33. while(idsize()&&ve[id].second<=now){
    34. maxx=min(x[i]-1-ve[id].first,maxx);
    35. now-=ve[id].second;
    36. id++;
    37. }
    38. if(now&&idsize()){
    39. ve[id].second-=now;
    40. maxx=min(x[i]-1-ve[id].first,maxx);
    41. }
    42. }
    43. }
    44. if(maxx>1e9)printf("-1\n");
    45. else printf("%lld\n",maxx);
    46. }
    47. signed main(){
    48. ios::sync_with_stdio(false);
    49. cin.tie();
    50. cout.tie();
    51. int _;
    52. _=1;
    53. // cin>>_;
    54. while(_--){
    55. icealsoheat();
    56. }
    57. }
  • 相关阅读:
    ARM-day9作业
    CNPM、NPM 和 Yarn:JavaScript 包管理器的比较
    js拼接页面元素,v-html多个指定位置文本高亮,为v-html拼接的字符串绑定onclick事件
    C# 随机数生成 Mersenne Twister 马特赛特旋转演算法 梅森旋转算法
    RK3588 Android13 TvSetting 中性能浮窗RAM显示bug
    (JVM)运行时数据区的总结以及常见大厂面试题
    谈谈RabbitMQ的五种消息模型以及SpringAMQP的使用
    JavaWeb—会话技术
    磁盘有空间但无法创建文件
    0×03 Vulnhub 靶机渗透总结之 KIOPTRIX: LEVEL 1.2 (#3) SQL注入+sudo提权
  • 原文地址:https://blog.csdn.net/kyrietheshy/article/details/133720962