Codeforces Round #474

数组分割问题(另一种说法是交换两个数组元素使两个数组和的差最小) <br />一、数组分割问题:(原帖见http://www.cppblog.com/baby-fly/archive/2009/09/24/92392.html)<br />题目概述:有一个没有排序,元素个数为2N的正整数数组。要求把它分割为元素个数为N的两个数组,并使两个子数组的和最接近。<br />假设数组A[1..2N]所有元素的和是SUM。模仿动态规划解0-1背包问题的策略,令S(k, i)表示前k个元素中任意i个元素的和的集合。显然:<br />S(k, 1) = {A[i] | 1<= i <= 阅读详情

A.注意两个问题,一个是必须是排好序,也就是abc位置不能颠倒,其次就是a,b不能没有。
利用is_sorted可以快速解决第一个问题。

#include<cstdio>
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
    string str;int cnt[3]={0};
    cin>>str;
    for(auto a:str)
        cnt[a-'a']++;
    if(is_sorted(str.begin(),str.end())&&cnt[0]&&cnt[1]&&(cnt[2]==cnt[0]||cnt[2]==cnt[1]))
        cout<<"YES"<<endl;
    else cout<<"NO"<<endl;

    return 0;
}

B.
我们为了使两个数列上对应位置的数之差最小,可以考虑维护一个堆,里面存着两个数列每个位置之差的绝对值——因为可加可减,平方的时候正负并没有区别。然后,每次把当前最大的差拿出来减1,然后丢回堆里即可。注意,如果堆顶的元素变成了0而k1+k2还没用完的话,那么就必须特判了。

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<cmath>
using namespace std;
int main()
{
    int a[1005],b[1005],k1,k2,i,j,k,num[1005],n;
    cin>>n>>k1>>k2;
    for(i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }
    for(i=1;i<=n;i++)scanf("%d",&b[i]);
    priority_queue<int>que;
    for(i=1;i<=n;i++){
        num[i]=abs(a[i]-b[i]);que.push(num[i]);
    }
    for(i=1;i<=k1+k2;i++){
        j=que.top();que.pop();
        if(j==0){
            if(abs(k1+k2-i+1)&1)
                cout<<1<<endl;
            else cout<<0<<endl;
            return 0;
        }
        j-=1;que.push(j);
    }
    long long ans=0;
    while(!que.empty()){
        j=que.top();que.pop();ans+=(long long)j*j;
    }
    cout<<ans<<endl;

    return 0;
}

C.
首先,注意一个事实——题目没有要求构造的数列中数字各异,那么是肯定不可能无解的:2^32次方就超过x的上限了。
然后,其实我们可以发现一个通用的构造方法——我们知道,任何一个数都可以表示成若干个2的幂次方之和,那么当然也可以表示成若干个2的幂次方-1 之和。那么,我们需要的x就可以这么构造了:
假设x=2^a1-1+2^a2-1+…+2^an-1,那么我们就可以构造n堆数,每堆数中有n个相同的数,堆与堆之间数相差d,这样一定能满足题目要求。

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
typedef long long ll;
int main()
{
    int x,d,i,j;
    vector<ll>v;
    cin>>x>>d;
    ll val=1;
    while(x){
        for(i=0;x>=(1<<i);i++){//加和起来正好是2^(i+1) -1
            v.push_back(val);
            x-=(1<<i);
        }
        val+=d;
    }
    cout<<v.size()<<endl;
    for(ll i:v)
        cout<<i<<' ';
    cout<<endl;

    return 0;
}

D.
这题很容易的一个想法就是直接去模拟,然而数据范围之大决定了这是不可能的。事实上,我们只需要维护每一层的移位信息即可——有点类似于线段树的lazytag,先记录下来,问询的时候再进行影响。
可以发现,如果只是对节点进行移位的话,那么因为更深的层也都跟着移了,所有没啥影响。但是如果只是移数值的话,那么更深的层相当于要反向移回相应的长度。此外就是不少细节了。

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
ll shift[100];
void shi(int ceng,ll k)
{
    ll mod=1LL<<ceng;//计算出这一层总的数字的个数
    k%=mod;//一定要记得先mod后加,不然似乎会爆long long
    shift[ceng]=(shift[ceng]+k+mod)%mod;//计算出这一层新的移位情况,因为可能左移导致
    //负,所有先加mod后取模
}
int  main()
{
    ll q,t,k,x,i,j;
    cin>>q;
    while(q--){
        scanf("%lld%lld",&t,&x);
        int be=0;
        for(;x>>be;be++);be--;//计算层数
        if(t<3){
            scanf("%lld",&k);
            if(t==2){
                shi(be,k);//如果是对节点进行移位,直接移即可
            }
            else{
                shi(be,k);shi(be+1,-k*2);//若只是对数值移位,则下一层也会受影响
            }
        }
        else{
            for(;be>=0;be--){
                cout<<x<<' ';
                x+=shift[be];//输出后加上本层的移位影响
                if(x>=(1LL<<(be+1)))x-=(1LL<<be);//如果超过了本层的总数,当然要减去
                x>>=1;//算出父节点对应数值
            }
            cout<<endl;
        }
    }

    return 0;
}

F.
做法非常机智:对于每个点维护一个set,比如读入一条边 x,y,z,就在点x的set里 找权值

#include<cstdio>
#include<iostream>
#include<set>
#include<algorithm>
using namespace std;
int n,m,v,u,w,ans=0;//pair中第一位保存边长,第2位保存这条边终点处使用这条边后的边数和
set<pair<int,int>>a[100100];//set中pair只按第一个键值排序
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)a[i].insert({-1,0});//初始全部加入一个不会影响结果的pair
    while(m--){
        scanf("%d%d%d",&v,&u,&w);
        auto it=a[v].lower_bound({w,-1});//寻找权值<w的最大位置
        it--;
        int d=it->second+1;//如果这条边可以加入,那么终点处的如果用了这条边,最大边数自然就是上个点的边数+1;
        it=a[u].lower_bound({w+1,-1});
        it--;
        if(it->second>=d)continue;//如果终点在边=w甚至更小时的边数已经>=d,那么这条边显然没有加进去的意义
        while(1){
            it=a[u].lower_bound({w,-1});//把终点处所有边>=w而边数<=d的全部删除,他们没有存在的意义
            if(it==a[u].end())break;//显然边数相等时边越小越优
            if(it->second>d)break;
            a[u].erase(it);
        }
        a[u].insert({w,d});//插入此边
    }
    for(int i=1;i<=n;i++){
        auto it=a[i].end();
        it--;
        ans=max(ans,it->second);
    }
    printf("%d\n",ans);
    return 0;
}
传感器:MQ-5燃气模块测量燃气值(底部附代码) 本篇文章介绍使用MQ-5燃气模块测量燃气值,CPU还是选择单片机,MQ-5主要使用的技术为ADC,燃气对于单片机来说是模拟信号,需要转换为数字信号,再经过相关计算公式将燃气模拟值转换成对应的燃气数值,便于人们方便查看。例如家庭使用燃气模块测量燃气值,如果燃气值超过一定的范围,可以外设一个报警装置,保证家庭的生命安全。(1)ADC(analog to digital converter)即模数转换器,它可以将模拟信号转换为数字信号。按照其转换原理主要分为逐次逼近型、双积分型、电压频率转换型三种。STM32F1 阅读详情

相关推荐

Anchor graph 对齐文献解读

Align then Fusion: Generalized Large-scale Multi-view Clustering with Anchor Matching Correspondences文献解读

atease0001的博客 1164

【Killua笔试面试题整理】两个数组a[N],b[N],其中A[N]的各个元素值已知,现给b[i]赋值

【题目描述】 两个数组a[N],b[N],其中A[N]的各个元素值已知,现给b[i]赋值,b[i] = a[0]*a[1]*a[2]...*a[N-1]/a[i]; 要求: 1.不准用除法运算 2.除了循环计数值,a[N],b[N]外,不准再用其他任何变量(包括局部变量,全局变量等) 3.满足时间复杂度O(n),空间复杂度O(1)   【题目来源】腾讯2012   【题目分析

异リ度ュ空ウ間(镜像站) 3372

CVAT自动标注避坑指南:如何解决Nuclio工程创建失败和镜像拉取问题

本文是一份针对CVAT自动标注部署中常见问题的实战排障指南。文章深入剖析了Nuclio工程创建失败的根源,提供了网络配置、服务状态检查等系统性解决方案,并详细讲解了如何解决gcr.io等海外镜像拉取难题,帮助开发者顺利完成CVAT自动标注环境的搭建与部署。

weixin_29207533的博客 233

Codeforces Round #474 (Div. 1 + Div. 2)

题目链接:Codeforces Round #474 (Div. 1 + Div. 2) A:直接枚举每种情况即可,判断有没有其他字母,判断每个字母当中有没有其他字母,判断一下顺序就好了。 AC代码: #include<bits/stdc++.h> using namespace std; string str; map<char,int> mp,pos,pre; set...

青烟绕指柔的博客 421

433M无线遥控器EV1527协议解码实战:从逻辑分析到代码优化

本文详细解析了433M无线遥控器EV1527协议的实战解码过程。从使用逻辑分析仪抓取波形、理解同步头与数据位编码原理开始,逐步深入代码实现。文章重点对比了原始定时器轮询法的痛点,并提出了基于“边沿捕获+时间戳”的优化方案,构建了高效、可移植且具备抗干扰能力的解码引擎,最后分享了跨平台移植的核心技巧。

weixin_29168813的博客 927

Cube生成定时器2触发双ADC同步采集并用DMA传输

前言 用cube生成一个用定时器触发ADC1,ADC2同步采集的程序,单片机选择的是STM32L476RGT6,用定时器2进行ADC采集触发,更改定时器2的定时周期便可以更改ADC的采样周期,ADC1和ADC2使用同步规则模式,并用DMA进行数据的传输。 STM32的ADC采样完成总共需要的时间是 ADC完成采样时间=采样周期+12个转换周期 举个例子,假如ADC的时钟是15MHz,采样周期是3个周期,3个采样周期加上12个转换周期,一共是15个周期,因为时钟是15MHz,所以完成一次ADC转换总共需要的时

一行代码的博客 4513

CodeForces 474D Flowers (dp)

题意:白花只能以连续k个的方式出现,红花没有限制。给出t组询问,每组包含ai,bi,问当序列长度为ai到bi时的总方案数。 例: 若 K = 2 且长度=1 的情况: (R). 若 K = 2 且长度=2 的情况: (RR), (WW). 若 K = 2 且长度=3 的情况: (RRR), (RWW), (WWR). 若 K = 2 且长度=4 的情况: (WWWW),

Shion的专栏 807

大疆sdkV4以及V5webrtc推流

webrtcSDK中要用它的VideoCapturer来初始化推流 ViewdoCapturer是一个接口我们继承它 然后重建创建文件CapturerAircraft.java文件。CameraUtil.java这个是我们用来创建CapturerAircraft的一个工具。除了CapturerAircraft这个文件不一样外其他都是一样的。PlayBodyBean.java这个是我们的配置文件。下面的有个代码块第一个是v4的 第二个是v5的。接着我们来创建几个推流用到的webrtc工具。

weixin_41624865的博客 1188

Codeforces Round #474 E. Alternating Tree

E. Alternating Tree time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Given a tree withnnnodes numbered from1...

aiba481424的专栏 108

主流仿真软件Sigrity/HFSS/Siwave/Hyperlynx/ADS差异

在电子设计自动化(EDA)领域,各种仿真软件如Cadence Sigrity、Mentor Graphics的HyperLynx、Keysight的ADS以及ANSYS的SIwave等,都广泛应用于不同的应用场景中。综上所述,这些EDA仿真软件在各自的应用场景中发挥着重要作用,帮助工程师在设计阶段就能够评估和优化电子产品的性能,提高设计的可靠性和效率。:Sigrity由全球最大的EDA公司Cadence推出,Cadence还推出了Orcad和Allegro等著名软件。:由安捷伦(现是德科技)公司开发。

Geektec的专栏 9402

lp–mspm0g3507开发板进入低功耗模式怎么退出?烧程序烧着烧着就进来了,跳线帽没动过,且报错:Texas Instruments Debugger Error: DAP Co...如何解决?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!

**My Coding Family** 1569

Codeforces Round #474 F. Pathwalks【主席树】

题目链接 题意 给出一个 nnn 个结点的无向图图,找出边权递增且边的编号(即输入顺序)递增的路径的最长长度 题解 对于结点 XXX,用线段树维护所有能到达 XXX 的边中边权在 [L,R][L,R][L,R] 区间内最长的路径,一共需要 nnn 颗线段树,所以采用主席树 #include<iostream> #include<sstream> #include<string> #include<queue> #include<map> #incl

qq_50554695的博客 159

【YOLO11改进 - C3k2融合】C3k2融合DWRSeg二次创新C3k2_DWR:扩张式残差分割网络,提高特征提取效率和多尺度信息获取能力,助力小目标检测

【YOLO11改进 - C3k2融合】C3k2DWRSeg二次创新C3k2_DWR:扩张式残差分割网络,提高特征提取效率和多尺度信息获取能力,助力小目标检测

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 1054

codeforces Round #474--A.Keyboard

C - 内马尔 Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Practice CodeForces 474A Description Our good friend Mole is trying to code a big me

Cast 694

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Codeforces Round #474 Check the string

题解:1、字符串首字母不是'a'就直接输出NO。2、遍历过程中当前字符要保证大于等于前一个字符,否则直接输出NO。3、三种字符其中之一为零直接输出NO。4、c字符和a或b字符数量相等就YES,否则NO。#include &lt;bits/stdc++.h&gt; using namespace std; int main(){ string str; cin &gt;&gt; s...

三生锁链 175

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Codeforces Round #474 B Minimize the error 优先队列 贪心

题解:1、k1和k2可以加起来,因为操作可以加可以减,对于两个数来说就是为了互相靠近,使得差值最小2、用STL优先队列来维护最大堆,然后每次对堆顶减1,特殊点是当堆顶是0时是加1,因为出现负数时无法维护后期操作。模拟一下就会发现当差值为零时加1和减1是没有区别的,因为最后要取平方。3、最后是注意数据爆int就行了#include &lt;bits/stdc++.h&gt; using namesp...

三生锁链 233

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Codeforces Round #474-E(树形dp)

一、题目链接   http://codeforces.com/contest/960/problem/B 二、题意   给定一棵$N$个节点的树,每个节点的权值$V$。定义树中两点$u_1$和$u_m$的权值和为$A(u_1, u_m) = V_{u_1} - V{u_2} + V{u_3} - V{u_4} + \cdots + (-1)^{m+1}V{u_m}$。求$\sum\li...

weixin_33757911的博客 168

Codeforces Round #474 D. Full Binary Tree Queries【思维】

D. Full Binary Tree Queries time limit per test 4 seconds memory limit per test 256 megabytes input standard input output standard output You have a full binary tree hav

Haipai1998的博客 449

Codeforces Round #474 D Full Binary Tree Queries 满二叉树操作

题解:1、数据太大,一看到题就想该怎么存下这样的树(脑抽到想用数组或链表那种)。想想就可以发现树的每一层数据只是循环移动而没有改变,那么根据二叉树的特性是可以知道树某一层的所有值的。所以我们只需要62层(数组)来记录一下层的数据偏移量就行了。2、执行操作1,就直接给层的偏移量deep[i]加上偏移值k(通过给k加上2e64然后对层起始值取模来保证偏移量为正值)。3、执行操作2,要循环对层以及层以下...

三生锁链 426

Codeforces Round #474 (Div. 1 + Div. 2) - C, F

但是遍历所有指向x的边找权值小于w的f[i]来转移复杂度太高,当有1e5个边相互指向两个点时,每给出一个边就要遍历其余所有边,复杂度是n^2的。但是注意权值wi可能为0,也就是说树状数组中下标0的位置也有对应值,但是在插入和询问的时候,无法处理0的情况,所以需要搞个偏移量,将所有边的权值都+1。因为路径中所有边按照输入顺序相连,权值严格上升,所以每输入一条边,就可以转移得到以该边结尾的所有路径中最长的长度。,找所有指向节点x的边,用这些边中权值小于w的来转移。...

Mr_dimple的博客 206

【codeforces】【比赛题解】#960 CF Round #474 (Div. 1 + Div. 2, combined)

终于打了一场CF,不知道为什么我会去打00:05的CF比赛…… 不管怎么样,这次打的很好!拿到了Div. 2选手中的第一名,成功上紫! 以后还要再接再厉! 【A】Check the string 题意: 一个合法的字符串可以这样生成: 初始是一个空串,然后小 A 同学往这个串中加入若干(大于零)个字符\(\texttt{a}\),然后小 B 同学往这个串的末尾加入若干...

weixin_30478757的博客 128

Divide by Zero 2018 and Codeforces Round #474 (Div. 1 + Div. 2, combined) C D

C Subsequence Counting http://codeforces.com/contest/960/problem/C 构造一段一段的 每一段只能跟自己这一段的数字产生贡献 int x,d; sdd(x,d); ll now = 1; vector&lt;ll&gt;v; while(x) { int w = 0; ...

sb的博客 255

Codeforces Round #474-D-Full Binary Tree Queries(瞎搞)

D. Full Binary Tree Queriestime limit per test4 secondsmemory limit per test256 megabytesinputstandard inputoutputstandard outputYou have a full binary tree having infinite levels.Each node has an ini...

信仰.的博客 477

Codeforces Divide by Zero 2018 and Codeforces Round #474 (Div. 1 + Div. 2, combined) B 贪心

点击打开链接//在a数组上进行k1次操作,在b数组上进行k2次操作 操作必须全部完成 #include&lt;bits/stdc++.h&gt; using namespace std; const int maxn=1000+5; typedef long long LL; LL a[maxn],b[maxn]; int main() { int n,k1,k2; scanf("...

老铁,干了这碗algorithms的博客 217

Divide by Zero 2018 and Codeforces Round #474 (Div. 1 + Div. 2, combined)

思路:把边看成点,然后每条边只能从下面的边转移过来,我们将边按照u为第一关键字,w为第二关键字排序,这样就能用线段树维护啦。 1 #include<bits/stdc++.h> 2 #define LL long long 3 #define fi first 4 #define se second 5 #define mk make_pai...

169
上一篇: 2018校赛网络预选赛
下一篇: (模板)求乘法逆元
HumveeA6
博客等级 码龄17年 12粉丝 175原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值