学习笔记17:AtCoder Beginner Contest 340

这篇具有很好参考价值的文章主要介绍了学习笔记17:AtCoder Beginner Contest 340。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

学习笔记17:AtCoder Beginner Contest 340,算法,数据结构,剪枝,深度优先

C

C - Divide and Divide (atcoder.jp)

1e17暴力肯定不行

模拟暴力的过程我们发现很多运算是重复的

记忆化一下

#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#include<set>
#include<map>

using namespace std;
typedef long long LL;
#define int long long
typedef pair<int,int> PII;
const int N=1000010;
int a[N];
map<int,int>mp;
int dfs(int now){
    if(mp.count(now)) return mp[now];
    if(now==1) return 0;
    mp[now]=dfs(now/2)+dfs((now+1)/2)+now;
    return mp[now];
}
void solve(){
    int n;
    cin>>n;
    
    
    cout<<dfs(n)<<endl;
}
signed main(){
    
    int t=1;
    //cin>>t;
    while(t--){
        solve();
    }
}
        

D

https://atcoder.jp/contests/abc340/tasks/abc340_d

#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<array>
using namespace std;
typedef long long LL;
#define int long long
typedef pair<int,int> PII;
const int N=1000010;
int a[N],b[N],c[N];
int dp[N][2];
std::vector<array<int,2>>v[N];
int dist[N];
bool st[N];
void dij(){

    priority_queue<array<int,2>,vector<array<int,2>>,greater<array<int,2>>>q;
    q.push({dist[1],1});
    while(q.size()){
        auto t=q.top();
        q.pop();
        if(st[t[1]]) continue;
        st[t[1]]=1;
        for(auto c:v[t[1]]){
            if(dist[c[0]]>dist[t[1]]+c[1]){
                dist[c[0]]=dist[t[1]]+c[1];
                q.push({dist[c[0]],c[0]});
            }
        }
    }
}
void solve(){
    int n;
    cin>>n;
    for(int i=2;i<=n;i++){
        dist[i]=1e18;
    }
    for(int i=1;i<n;i++){
        cin>>a[i]>>b[i]>>c[i];
        v[i].push_back({i+1,a[i]});
        v[i].push_back({c[i],b[i]});
    }
    dij();
    cout<<dist[n]<<endl;
}
signed main(){
    
    int t=1;
    //cin>>t;
    while(t--){
        solve();
    }
}
        

E

https://atcoder.jp/contests/abc340/tasks/abc340_e

线段树处理

操作:查询在位置上的值sum,然后修改这个该位置的值为y

        然后给整个数组加上sum/n,特殊情况还有剩余的手玩一下模拟即可

        

#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<array>
using namespace std;
typedef long long LL;
#define int long long
typedef pair<int,int> PII;
const int N=1000010;
int a[N],b[N],c[N];
struct Node
{
    int l, r;
    int sum,tag;
}tr[N * 4];

void pushup(int u)
{
    tr[u].sum=tr[u<<1].sum+tr[u<<1|1].sum;
}

void pushdown(int u)
{
    if(tr[u].tag){
        tr[u<<1].tag+=tr[u].tag;
        tr[u<<1|1].tag+=tr[u].tag;
        tr[u<<1].sum+=tr[u].tag;
        tr[u<<1|1].sum+=tr[u].tag;
        tr[u].tag=0;
    }
}

void build(int u, int l, int r)
{
    if (l == r) tr[u] = {l, r,a[r],0};
    else
    {
        tr[u] = {l, r,0,0};
        int mid = l + r >> 1;
        build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r);
        pushup(u);
    }
}

void update(int u, int l, int r, int d)
{
    if (tr[u].l >= l && tr[u].r <= r)
    {
        tr[u].sum+=d;
        tr[u].tag+=d;
    }
    else
    {
        pushdown(u);
        int mid = tr[u].l + tr[u].r >> 1;
        if (l <= mid) update(u << 1, l, r, d);
        if (r > mid) update(u << 1 | 1, l, r, d);
        pushup(u);
    }
}

int query(int u, int l, int r)
{
    if (tr[u].l >= l && tr[u].r <= r)
    {
        return tr[u].sum;  
    }
    else
    {
        pushdown(u);
        int mid = tr[u].l + tr[u].r >> 1;
        int res = 0;
        if (l <= mid ) res = query(u << 1, l, r);
        if (r > mid) res += query(u << 1 | 1, l, r);
        return res;
    }
}

void solve(){
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    build(1,1,n);
    for(int i=1;i<=m;i++){
        cin>>b[i];
        b[i]++;
        int sum=query(1,b[i],b[i]);
        update(1,b[i],b[i],-sum);
        int tmp=sum/n;
        update(1,1,n,tmp);
        tmp=sum-tmp*n;
        
        if(tmp){
            if(tmp<=n-b[i]){
                
                if(b[i]+1<=n)update(1,b[i]+1,b[i]+tmp,1);
                
            }else{
                if(b[i]+1<=n)update(1,b[i]+1,n,1);
                tmp-=n-b[i];
                update(1,1,tmp,1);
            }
        }
    }
    for(int i=1;i<=n;i++) cout<<query(1,i,i)<<" ";
}
signed main(){
    
    int t=1;
    while(t--){
        solve();
    }
}
        

F

根据叉积求面积公式

这道题中x1=0,y1=0,S=1

转化成

现在x2和y2我们已经知道

通过扩展欧几里得我们可以算出

这个公式的x,y的一组解(无解的情况:2%gcd(a,b)!=0)

这时候将x*gcd(a,b),y*gcd(a,b)即可得到答案文章来源地址https://www.toymoban.com/news/detail-826508.html

#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<unordered_set>
using namespace std;
typedef long long LL;
#define int long long
typedef pair<int,int> PII;
const int N=1000010;
int a[N];
int exgcd(int a,int b,int &x,int &y){
    if(!b){
        x=1,y=0;
        return a;
    }
    int d=exgcd(b,a%b,y,x);
    y-=a/b*x;
    return d;
}
void solve(){
    int x,y,a,b;
    cin>>x>>y;
    //S=1/2*((x2-x1)*(y3-y1)-(y2-y1)*(x3-x1))
    //在本题中x1=0 y1=0,2=(已知)x2*y3-(已知)y2*x3
    //无解的情况2%gcd(x2,-y2)!=0
    int g=exgcd(x,-y,a,b);
    if(2%g){
        cout<<-1<<endl;
    }else{
        a*=2/g;
        b*=2/g;
        cout<<b<<" "<<a<<endl;
    }
}
signed main(){
    
    int t=1;
    //cin>>t;
    while(t--){
        solve();
    }
}
        

到了这里,关于学习笔记17:AtCoder Beginner Contest 340的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • AtCoder Beginner Contest 336

    给定一个数 (n) ,将 long 中的 o 重复 (n) 次后输出。 模拟即可。 神奇的代码 给定一个数 (n) ,问 (n) 的二进制表示下的末尾零的数量。 即找到最小的 (i) 使得 (n (1 i)) 不为零的位置。枚举即可。 或者直接用内置函数 __builtin_ctz 。(count tail zero? 神奇的代码 定义一个数

    2024年01月20日
    浏览(32)
  • AtCoder Beginner Contest 326

    100楼层,一次可以上最多两层,或下最多三层。 给定两楼层,问能否一次到达。 比较大小,然后判断其差是是不是在 (2) 或 (3) 内即可。 神奇的代码 给定一个 (n) ,问不小于 (n) 的形如 (326) 的数字是多少。 形如 (326) 的数字,即数位有 (3) ,且百位 (times) 十位

    2024年02月08日
    浏览(23)
  • AtCoder Beginner Contest 349

    (n) 个人游戏,每局有一人 (+1) 分,有一人 (-1) 分。 给定最后前 (n-1) 个人的分数,问第 (n) 个人的分数。 零和游戏,所有人总分是 (0) ,因此最后一个人的分数就是前 (n-1) 个人的分数和的相反数。 神奇的代码 对于一个字符串,如果对于所有 (i geq 1) ,都有恰好

    2024年04月13日
    浏览(47)
  • AtCoder Beginner Contest 341

    给定 (n) ,输出 (n) 个 (0) 和 (n+1) 个 (1) 交替的字符串。 (101010...) 循环输出即可。 神奇的代码 货币兑换。 (A) 国货币每 (x_a) 钱可兑换 (B) 国货币 (y_a) 钱。 (B) 国货币每 (x_b) 钱可兑换 (C) 国货币 (y_b) 钱。 ... 给定你拥有的每国货币钱数和兑换规则,依次兑换

    2024年02月19日
    浏览(20)
  • AtCoder Beginner Contest 314

    怎么好多陌生单词 审核怎么这么逆天,半小时还没审完 给定 (pi) 的值以及数 (n) ,要求保留 (n) 位小数输出,不四舍五入。 字符串形式储存然后截取末尾即可。 神奇的代码 (n) 个人玩轮盘赌游戏,简单说就是一个转盘有 (37) 个数字以及一个箭头,箭头会等概率停在某

    2024年02月13日
    浏览(29)
  • AtCoder Beginner Contest 309

    感觉F写了个乱搞做法 给定一个 (3 times 3) 的网格,以及两个数字。 问这两个数字是否 水平相邻 。 求出两个数字的横纵坐标,看是否横坐标相同,纵坐标差一即可。 读题不仔细,开题就WA了。 神奇的代码 给定一个矩形。将最外围的数字顺时针旋转一格。 可以模拟一个指针

    2024年02月13日
    浏览(25)
  • AtCoder Beginner Contest 313

    貌似这次很难,还好去吃烧烤了 发现原来G就是个类欧几里德算法,参考abc283 ex,更了个G 给定 (n) 个数 (a_i) ,问第一个数要成为唯一的最大的数,应该加多少。 找到后面的最大的数 (m) ,答案就是 (max(0, m + 1 - a_0)) 。 神奇的代码 给定 (m) 条关于 (n) 个数的大小关系,

    2024年02月14日
    浏览(29)
  • AtCoder Beginner Contest 310

    感觉F又双叒叕写复杂了 点杯咖啡,要 (p) 元,但可以用一个优惠券,使得咖啡只要 (q) 元,但你需要额外购买 (n) 个商品中(价格为 (a_i) )的一个。 问点杯咖啡的最小价格。 考虑直接买还是使用优惠券,使用优惠券的话就选 (n) 个商品中价格最小的。 两种情况取最小

    2024年02月16日
    浏览(20)
  • AtCoder Beginner Contest 320

    给定 (a,b) ,输出 (a^b + b^a) 。 因为数不超过 (10) ,可以直接用 pow 计算然后转成 (int) 。不会有精度损失。 神奇的代码 给定一个字符串 (s) ,求长度最长的回文串。 因为长度只有 (100) ,可以直接枚举子串,然后暴力判断是不是回文串(翻转后是否和自身相同),复杂

    2024年02月08日
    浏览(27)
  • AtCoder Beginner Contest 323

    有的人边上课边打abc 给定一个 (01) 字符串,问偶数位(从 (1) 开始) 是否全为 (0) 。 遍历判断即可。 神奇的代码 给定 (n) 个人与其他所有人的胜负情况。问最后谁赢。 一个人获胜次数最多则赢,若次数相同,则编号小的赢。 统计每个人的获胜次数,排个序即可。 神奇

    2024年02月08日
    浏览(22)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包