首页 > 其他分享 >2023 CCPC 哈尔滨 BLM

2023 CCPC 哈尔滨 BLM

时间:2023-11-23 23:55:05浏览次数:35  
标签:cur int ll ans cin CCPC BLM ++ 2023

[2023 CCPC 哈尔滨](The 2nd Universal Cup. Stage 10: Harbin - Dashboard - Contest - Universal Cup Judging System (ucup.ac)) BLM

B.Memory

思路:由递推式:\(Mood(i) = \sum_{j =1}^{i}2^{j-i}\times a_j\)可知,\(f[i] = f[i-1]/2+a[i]\)

显然直接\(/2\)会有精度问题啦,怎么办嘞。考虑把数分为整数部分和小数部分,分类讨论:

  • \(Mood(i)<0\):
    1. 整数部分\(<0\)
    2. 整数部分\(=0\)且小数部分\(<0\)
  • \(Mood(i)=0\):整数部分\(=0\)并且没有小数部分
  • \(Mood(i)>0\):
    1. 整数部分\(>0\)
    2. 整数部分\(=0\)且小数部分\(>0\)
// AC one more times
// nndbk
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const int N = 2e5 + 10;

int main()
{
    ios::sync_with_stdio(false);   cin.tie(nullptr), cout.tie(nullptr);
    int n; cin>>n;
    ll x = 0,dec = 0;
    string ans = "";
    for(int i = 1;i <= n; i++)
    {
        ll y; cin>>y;
        x += y;
        if(x)
            ans += (x>0?"+":"-");
        else{
            if(dec)
                ans += (dec>0?"+":"-");
            else ans += "0";
        }

        if(x%2)
            dec = (x>0?1:-1);
        x/=2;
    }

    cout<<ans<<"\n";

    return 0;
}

以上是正解,但是发现\(python\)大数写居然可以暴力\(AC\)?神奇

L.Palm Island

题意:把数组\(a\)变成\(b\)。

只能通过以下两种操作:

  • 把第一个移到最后
  • 把第二个移到最后

且操作次数\(\le n^2\)

思路:考虑用\(map\)把\(a\)在\(b\)中的位置做一个映射,这样相当于是现在只需要把映射之后的数组\(c\)排序即可。

我们思考这两个操作到底是什么含义。

这样子移动,变成有序,让我们联想到冒泡排序:

void bubble_sort(int arr[], int len)  
{  
    int i, j;  
    for (i = 0; i < len; i++)  
        for (j = 1; j < len - i; j++)  
            if (arr[j - 1] > arr[j])  
                swap(arr[j - 1], arr[j]);  
}

一轮排好一个,又回到开头去比较。类比到我们这题的两个操作:

我们考虑一个指针\(cur\)一开始指在\(0\)位置(初始位置)

  • 把第一个移到最后:等价于指针后移
  • 把第二个移到最后:等价于交换\(cur\)和\(cur+1\)位置的值之后指针后移

所以我们只需要按照冒泡排序的思想去写就行了。

// AC one more times
// nndbk
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const int N = 2e5 + 10;
int a[N],b[N],c[N];
int mp[N];
int main()
{
    ios::sync_with_stdio(false);   cin.tie(nullptr), cout.tie(nullptr);
    int t; cin>>t;
    while(t--)
    {
        int n; cin>>n;
        int cur = 0;
        for(int i = 0;i < n; i++)
            cin>>a[i];
        for(int i = 0;i < n; i++)
            cin>>b[i],mp[b[i]] = i;
        for(int i = 0;i < n; i++)
            c[i] = mp[a[i]];

        string ans = "";
        while(1)
        {
            if(cur == 0){
                int ok = 1;
                for(int i = 0;i < n-1; i++)
                    ok &= c[i]<c[i+1];
                if(ok)
                    break;
            }
            if(cur < n-1 && c[cur] > c[cur + 1]){
                swap(c[cur],c[cur+1]);
                cur++;
                ans += "2";
            }else{
                ans += "1";
                cur++;
            }
            cur %= n;
        }
        cout<<ans<<"\n";
    }
    return 0;
}

M.Painter

题意:三种操作:画圆、画长方形、打印。输出打印的图

思路:这题我们发现,虽然坐标的数据范围很大但是打印出来的部分面积很小只有\(1e4\),那直接离线然后暴力做就行了。

本题难点在于坐标的映射,两个坐标系的转换要小心。(debug了好久QAQ)

坐标映射应该是下面酱紫滴:

image

也就是原坐标的\((-5,5)\)对应我们的\((1,1)\)以此类推。

// AC one more times
// nndbk
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const int N = 2e5 + 10;
vector<array<ll,6>>event;
int main()
{
    ios::sync_with_stdio(false);   cin.tie(nullptr), cout.tie(nullptr);
    int n; cin>>n;
    for(int i = 1;i <= n; i++)
    {
        string ty; cin>>ty;
        if(ty == "Circle"){
            ll x,y,r;
            char col;  cin>>x>>y>>r>>col;
            event.push_back({1,x,y,r,(ll)col,0});
        }else if(ty == "Rectangle"){
            ll x1,y1,x2,y2;
            char col;  cin>>x1>>y1>>x2>>y2>>col;
            event.push_back({2,x1,y1,x2,y2,(ll)col});
        }else if(ty == "Render"){
            ll x1,y1,x2,y2; cin>>x1>>y1>>x2>>y2;
            event.push_back({3,x1,y1,x2,y2,0});
        }
    }


    for(int i = 0;i < n; i++)
    {
        int op = event[i][0];
        // cout<<"op = "<<op<<'\n';
        if(op == 3){
            ll x1 = event[i][1],y1 = event[i][2];
            ll x2 = event[i][3],y2 = event[i][4];

            ll h = y2-y1+1, w = x2-x1+1;
            char a[h+10][w+10];
            memset(a,0,sizeof(a));
            for(int j = 0;j <= h; j++)
                for(int k = 0;k <= w; k++)
                    a[j][k] = '.';
            ll idx[h+10],idy[w+10];
            memset(idx,0,sizeof(idx));
            memset(idy,0,sizeof(idy));
            ll t = y2;
            for(int j = 1;j <= h; j++)
                idx[j] = t,t--;
            t = x1;
            for(int j = 1;j <= w; j++)
                idy[j] = t,t++;

            // cout<<"debug:__________________________\n";
            //  for(int j = 1;j <= h; j++)
            //     cout<<idx[j]<<" ";
            // cout<<"\n";
    
            // for(int j = 1;j <= w; j++)
            //      cout<<idy[j]<<" ";
            // cout<<"\n";

            // for(int i = 1;i <= h; i++)
            // {
            //     for(int j = 1;j <= w; j++)
            //     {
            //         cout<<"("<<idy[j]<<","<<idx[i]<<")";
            //     }
            //     cout<<"\n";
            // }

            for(int j = 0;j < i; j++)
            {
                op = event[j][0];
                if(op==1){
                    ll u = event[j][1],v = event[j][2],r = event[j][3],col = event[j][4];
                    //cout<<"u = "<<u<<" v = "<<v<<"\n";
                    for(int k = 1;k <= h; k++)
                        for(int l = 1;l <= w; l++){

                        //cout<<"idx[k] = "<<idx[k]<<" idy[l] = "<<idy[l]<<"\n";
                        if((u-idy[l])*(u-idy[l])+(v-idx[k])*(v-idx[k])<=r*r)
                            a[k][l] = char(col);
                        }
                            
                        
                }else if(op==2){
                    ll x1 = event[j][1],y1 = event[j][2];
                    ll x2 = event[j][3],y2 = event[j][4];
                    ll col = event[j][5];

                     for(int k = 1;k <= h; k++)
                        for(int l = 1;l <= w; l++)if(x1<=idy[l]&&idy[l]<=x2&&y1<=idx[k]&&idx[k]<=y2){
                            a[k][l] = char(col);
                        }
                }
            }

            for(int j = 1;j <= h; j++)
            {
                for(int k = 1;k <= w; k++)
                    cout<<a[j][k];
                cout<<"\n";
            }

        }
    }

    return 0;
}

标签:cur,int,ll,ans,cin,CCPC,BLM,++,2023
From: https://www.cnblogs.com/nannandbk/p/17852817.html

相关文章

  • 2023.11.20-2023.11.26 周记
    11.20星期一升旗仪式时间改到上午大课间了,前一节还正好是体育,之前太冷现在太热,真服了。与其说升旗仪式,到不如说是颁奖仪式。七年级年级前十:李泊璇、陈墨杋、黄耀民、周敬轩、牛文昊、张轩豪、秦子祺、时欣翔、徐颢扬、宋之萱。八年级年级前十:何家鼎、李承恩、朱鑫、陈亦飞、张......
  • 2023-11-23
    packagecn.alan.wms;importcn.alan.wms.async.Async;importcn.alan.wms.bean.User;importcn.alan.wms.listener.OnCompleteListener;importcn.alan.wms.tools.OperateSql;importcn.alan.wms.tools.Logger;importjava.util.ArrayList;importjava.util.List;......
  • 20231122
    2023/11/231798C-CandyStore只能说gcd,lcm的题目还是练少了,一些性质都不知道。对于一段可以用同一个标签的区间,我们知道他们的c是一样的,c=di*bi,每一个物品的bi固定,那么c就一定是lcm{bi..bn},因为c要能整除任何一个bi。然后我们来看可以自己决定的di,ai%di==0.而每一个物品的di=......
  • 20231123
    2023/11/231798C-CandyStore只能说gcd,lcm的题目还是练少了,一些性质都不知道。对于一段可以用同一个标签的区间,我们知道他们的c是一样的,c=di*bi,每一个物品的bi固定,那么c就一定是lcm{bi..bn},因为c要能整除任何一个bi。然后我们来看可以自己决定的di,ai%di==0.而每一个物品的di=......
  • 2023-2024 20232319《网络空间安全导论》第2周学习总结
    思维导图教材学习过程中的问题和解决过程问题一:sm2算法和sm4算法是对称算法还是非对称算法?答案:sm2属于非对称算法,sm4属于对称算法。问题一解决方案:询问chatgpt。问题二:区块链技术与密码学的关系答案:区块链技术与密码学有着密切的关系,密码学是区块链技术的基础之一。以下是......
  • 2023.11.23——每日总结
    学习所花时间(包括上课):9h代码量(行):0行博客量(篇):1篇今天,上午学习,下午学习;我了解到的知识点:1.JavaGUI2.会话跟踪技术明日计划:学习......
  • 2023-2024-1 20232421邓锴 《网络空间安全导论》 第2周学习总结
    教材学习总结了解密码的来源与发展ENIGMA机的构造以及机理信息论的基本观点了解现代密码学发展以及面临的挑战密码学理论基础(数学知识)密码学的新进展以及未来方向思维导图教材学习中的问题和解决问题问题1:ENIGMA机的构造以及机理了解不清问题1解决办法:查询图片→查找......
  • 20231123
    好久都没写过OI相关的东西了,累了。真的累了。刚刚lf给我说他明天会给我整一个容斥的单元小测。有点紧张,因为自己数学一直都很烂。还有容斥这么抽象的玩意,到时候估计会脑抽。累了。不能放弃啊。继续吧。今天和@Super_Cube吃饭的时候聊到了「关于力老师为什么只同意......
  • 20232303 关于OpenSSL的学习
    关于OpenSSL的学习sm2加密解密请忽略原来遗留下的文件,它们与本任务无关,只看新生成的文件就好。问题与解答-opensslecparam-nameSM2-genkey-outsm2-key.pem这是一个使用OpenSSL工具生成SM2密钥的命令。opensslecparam是OpenSSL的椭圆曲线操作命令。-name......
  • 2023-2024-1 20231329《计算机基础与程序设计》第9周学习总结
    作业信息这个作业属于哪个课程https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK09这个作业的目标计算机科学概论第10,11章并完成云班课测试《C语言程序设计》第8章并完成云班课测试......