前言

A,B水题,E,I原题

实际赛时400分(乐多毁我青春)

G题改完了,看这篇吧


C 大水题

题目

如果有一个长度为\(n\)的数组\(a[1],a[2],\cdots,a[n]\),对于非负整数\(k\),若令\(b[i]=a[i] \oplus k\),满足bb是一个单调不下降的数组,即满足\(b[1]\le b[2]\le \cdots \le b[n]\),则称\(k\)是数组\(a\)的完美数,其中\(\oplus\)表示按位异或。

现在给出一个长度为\(n\)的数组\(a\),并进行\(q\)次修改,每次会改变\(a\)中的一个数。要求在第一次修改前以及每一次修改后求出当前数组的最小完美数,若不存在则输出\(-1\)。


分析

从局部到整体考虑,如果相邻两个数\(x,y\),改变这两个数大小关系当且仅当一个二进制位是0一个是1的最高位被改变,那么可以用两个数组表示某个位置是否必然改变或必然不改变,累加次数,它待修改就先减掉再加上修改后的情况,如果两个数组的某一位都大于0,那么必然输出\(-1\),接着只要必然修改的位置数组大于0,那么就必须要让这一位变成1,时间复杂度\(O(30(n+q))\)


代码

#include <cstdio>
#include <cctype>
#define rr register
using namespace std;
int n,a[1000011],ac[31],wa[31];
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline signed get_top(int x){
for (rr int i=30;~i;--i)
if ((x>>i)&1) return i;
return -1;
}
inline void Add(int x){
rr int t=get_top(a[x]^a[x+1]);
if (t==-1) return;
if (a[x]<=a[x+1]) ++ac[t]; else ++wa[t];
}
inline void Del(int x){
rr int t=get_top(a[x]^a[x+1]);
if (t==-1) return;
if (a[x]<=a[x+1]) --ac[t]; else --wa[t];
}
inline bool check(){
for (rr int i=30;~i;--i)
if (ac[i]&&wa[i]) return 0;
return 1;
}
inline void print(int ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
inline void doit(){
if (check()){
rr int sum=0;
for (rr int i=30;~i;--i)
if (wa[i]) sum|=1<<i;
print(sum);
}else putchar('-'),putchar(49);
}
signed main(){
n=iut();
for (rr int i=1;i<=n;++i) a[i]=iut();
for (rr int i=1;i<n;++i) Add(i);
doit();
for (rr int Q=iut();Q;--Q){
rr int x=iut(),y=iut();
if (x>1) Del(x-1);
if (x<n) Del(x);
a[x]=y;
if (x>1) Add(x-1);
if (x<n) Add(x);
putchar(10); doit();
}
return 0;
}

D 简单数据结构题

题目

对于一个长度为\(n\)的序列\(a_1,a_2,\cdots,a_n\),找一个整数\(k\)使得\(\max\limits_{1\le i\le n}(a_i\oplus k)\)尽可能小,其中\(\oplus\)表示按位异或。

样例输入:3 1 2 3 样例输出:2


分析

首先数据结构要确定,选择\(\text{Trie}\),接着建好一个 \(\text{Trie}\),样例如图所示(简化版)

首先这棵树整棵树肯定得用,所以要搜索,如果遇到一个分支怎么办,如果不把这一位变成1,答案肯定会变大,但是这一位变成1,我把它给大的答案肯定得不偿失,所以把小的那一条路这一位变成1,继续跳到上一行


代码

#include <cstdio>
#include <cctype>
#include <queue>
#define rr register
using namespace std;
const int N=100001;
int trie[N<<5][2],tot,n,a[N],ans=1<<30;
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline signed min(int a,int b){return a<b?a:b;}
inline void Insert(int x){
rr int p=0;
for (rr int i=29;~i;--i){
rr int t=(x>>i)&1;
if (!trie[p][t]) trie[p][t]=++tot;
p=trie[p][t];
}
}
inline signed dfs(int p,int now){
if (!trie[p][0]&&!trie[p][1]) return 0;
rr int t,cnt=0;
if (trie[p][0]) t=dfs(trie[p][0],now-1),++cnt;
if (trie[p][1]) t=min(t,dfs(trie[p][1],now-1)),++cnt;
if (cnt==2) t|=1<<now;
return t;
}
signed main(){
n=iut();
for (rr int i=1;i<=n;++i) Insert(a[i]=iut());
return !printf("%d",dfs(0,29));
}

H 上次题

题目

在\(n\)个数中选出若干个分为两部分,使两部分和相等,问其中一部分和的最大值,\(n\)个数的总和\(<5000\)


分析

设\(dp[x]\)表示两部分差值为\(x\)的总和,那给出这个定义就很好做了,时间复杂度\(O(n*sum)\),注意平移下标


代码

#include <cstdio>
#include <cctype>
#define rr register
using namespace std;
const int N=1001;
int a[N],dp[2][N*5],n,sum;
inline signed iut(){
rr int ans=0,f=1; rr char c=getchar();
while (!isdigit(c)) f=(c=='-')?-f:f,c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans*f;
}
inline signed max(int a,int b){return a>b?a:b;}
signed main(){
n=iut();
for (rr int i=1;i<=n;++i) a[i]=iut(),sum+=a[i]; sum=sum-(sum&1);
for (rr int i=0;i<=sum;++i) dp[0][i]=-2e9; dp[0][sum>>1]=0;
for (rr int i=1;i<=n;++i){
for (rr int j=0;j<=sum;++j) dp[i&1][j]=dp[(i&1)^1][j];
for (rr int j=sum;j>=a[i];--j) dp[i&1][j]=max(dp[(i&1)^1][j-a[i]]+a[i],dp[i&1][j]);
for (rr int j=a[i];j<=sum;++j) dp[i&1][j-a[i]]=max(dp[(i&1)^1][j]+a[i],dp[i&1][j-a[i]]);
}
return !printf("%d",dp[n&1][sum>>1]/2);
}

J 白给题

题目

删除每一条边,两棵子树颜色交集


分析

dsu板子题,预处理出总颜色数组就可以了


代码

#include <cstdio>
#include <cctype>
#include <cstring>
#define rr register
using namespace std;
const int N=100011;
struct node{int y,next;}e[N<<1];
int root,col[N],hs[N],k=1,n,son[N],cnt[N],ans[N];
int now,dep[N],fat[N],big[N],snt[N],pig[N];
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline void print(long long ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
inline void dfs1(int x,int fa){
dep[x]=dep[fa]+1,fat[x]=fa,son[x]=1;
for (rr int i=hs[x],mson=-1;i;i=e[i].next)
if (e[i].y!=fa){
dfs1(e[i].y,x);
son[x]+=son[e[i].y];
if (son[e[i].y]>mson){
big[x]=e[i].y,pig[x]=i,
mson=son[e[i].y];
}
}
}
inline void update(int x,int z){
if (z==1){
if (!cnt[col[x]]) now+=snt[col[x]]>1;
else now-=snt[col[x]]==1;
}else{
if (!snt[col[x]]) now+=cnt[col[x]]>1;
else now-=cnt[col[x]]==1;
}
cnt[col[x]]+=z,snt[col[x]]-=z;
for (rr int i=hs[x];i;i=e[i].next)
if (e[i].y!=fat[x]&&e[i].y!=root) update(e[i].y,z);
}
inline void dfs2(int x,int opt,int p){
for (rr int i=hs[x];i;i=e[i].next)
if (e[i].y!=fat[x]&&e[i].y!=big[x]) dfs2(e[i].y,0,i);
if (big[x]) dfs2(big[x],1,pig[x]),root=big[x];
update(x,1),ans[p>>1]=now,root=0;
if (!opt) update(x,-1),now=0;
}
signed main(){
while (scanf("%d",&n)==1){
memset(snt,0,sizeof(snt)),memset(cnt,0,sizeof(cnt));
memset(ans,0,sizeof(ans)),memset(dep,0,sizeof(dep));
memset(fat,0,sizeof(fat)),memset(son,0,sizeof(son));
memset(big,0,sizeof(big)),memset(pig,0,sizeof(pig));
memset(hs,0,sizeof(hs)),k=1;
for (rr int i=1;i<=n;++i) col[i]=iut(),++snt[col[i]];
for (rr int i=1;i<n;++i){
rr int x=iut(),y=iut();
e[++k]=(node){y,hs[x]},hs[x]=k,
e[++k]=(node){x,hs[y]},hs[y]=k;
}
dfs1(1,0),dfs2(1,0,0);
for (rr int i=1;i<n;++i)
print(ans[i]),putchar(i==n-1?10:32);
}
return 0;
}

未完待续

SSL新年欢乐赛暨BPM退役赛(不含FK)的更多相关文章

  1. 52-2018 蓝桥杯省赛 B 组模拟赛(一)java

    最近蒜头君喜欢上了U型数字,所谓U型数字,就是这个数字的每一位先严格单调递减,后严格单调递增.比如 212212 就是一个U型数字,但是 333333, 9898, 567567, 313133131 ...

  2. 天池新人赛-天池新人实战赛o2o优惠券使用预测(一)

    第一次参加天池新人赛,主要目的还是想考察下自己对机器学习上的成果,以及系统化的实现一下所学的东西.看看自己的掌握度如何,能否顺利的完成一个分析工作.为之后的学习奠定基础. 这次成绩并不好,只是把整个机 ...

  3. 湘潭邀请赛+蓝桥国赛总结暨ACM退役总结

    湘潭邀请赛已经过去三个星期,蓝桥也在上个星期结束,今天也是时候写一下总结了,这应该也是我的退役总结了~ --------------------------------湘潭邀请赛----------- ...

  4. 无聊的活动/缘生意转(2018 Nova OJ新年欢乐赛B题)解题报告

    题目2(下面的太抓 我重新写了个背景 其他都一样) 无聊的活动 JLZ老师不情愿的参加了古风社一年一度的活动,他实在不觉得一群学生跳舞有什么好看,更不明白坐在身后的学生为什么这么兴奋(看小姐姐),于是 ...

  5. 第六届acm省赛总结(退役贴)

    前言: 这是我的退役贴,之前发到了空间里,突然想到也要在博客里发一篇,虽然我很弱,但是要离开了还是有些感触,写出来和大家分享一下,希望不要见笑.回来看看,这里也好久没有更新了,这一年确实有些懈怠,解题 ...

  6. 2016广东工业大学新生杯决赛网络同步赛暨全国新生邀请赛 题解&源码

    Problem A: pigofzhou的巧克力棒 Description 众所周知,pigofzhou有许多妹子.有一天,pigofzhou得到了一根巧克力棒,他想把这根巧克力棒分给他的妹子们.具体 ...

  7. 2019级第一次月赛暨ACM工作室第一次招新赛、补题赛

    A:最简单签到,没有之一 Description 此题简单如题意,就是求最大值 Input 多组输入 每组输入输入一串字符串(包括字母和数字),长度小于500 Output 每行输出字符ASCII值与 ...

  8. 2017年中国大学生程序设计竞赛-中南地区赛暨第八届湘潭市大学生计算机程序设计大赛题解&源码(A.高斯消元,D,模拟,E,前缀和,F,LCS,H,Prim算法,I,胡搞,J,树状数组)

    A------------------------------------------------------------------------------------ 题目链接:http://20 ...

  9. EZ 2018 04 21 NOIP2018 模拟赛(十) -LoliconAutomaton的退役赛

    难得的一次Unrated,避免了重回1500的尴尬 其实题目都还可以,但只不过所有人T1都炸了,可能是数据的锅(假的) 而且我因为T1SB的把T2弃了,没想到是千年水题 T3莫名爆炸,然后TM的40分 ...

  10. 【tyvj五月有奖赛 暨Loi 55 Round #1】

    解题报告: 傻逼错误天天犯QAQ 第一题:简单DP,f[i][j]表示第 i 道题选 j 的最大得分,可以从f[i-1][j-1],f[i-1][j],f[i-1][j+1]转移过来,其实是可以滚动数 ...

随机推荐

  1. 【Azure 环境】如何解决Principal 2330xxxxxxxxxxxxxxxxxxxx31efc5 does not exist in the directory xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx问题

    问题描述 在使用 Key Vault 和 Azure CLI 管理存储帐户密钥的官方文档中,其中有一步是"向 Key Vault 授予对你的存储帐户的访问权限", 其中CLI命令中 ...

  2. 【Azure 应用服务】App Service for Linux环境中,如何解决字体文件缺失的情况

    问题描述 部署在App Service for Linux环境中的Web App.出现了字体文件缺失的问题,页面显示本来时中文的地方,区别变为方框占位. 问题分析 在应用中,通常涉及到显示问题的有两个 ...

  3. 【Azure Developer】使用Key Vault的过程中遇见的AAD 认证错误

    在使用应用程序访问Key Vault获取密钥信息时,现后遇见了多种认证错误.使用的代码为: String keyVaultUrl = "https://test-xxx.vault.azur ...

  4. xml中xsd、xsi、xmlns的含义

    XML是可扩展标记语言,它定义了按格式编码文件的一系列规则[3],编码的文件是机器可读和人可读的.XML文件对于机器可读是基于XSD(XML Schema Definition)[1]的.XSD是受W ...

  5. Java 小练习(3) 方法的修改+ 调用

    1 package com.bytezero.exer; 2 3 public class ExerTest 4 { 5 public static void main(String[] args) ...

  6. C++ //排序案列 //描述:将person自定义数据类型进行排序,Person中有属性 姓名,年龄,身高 //排序规则: 按照年龄进行的升序,如果年龄相同按照身高进行降序

    1 //排序案列 2 //描述:将person自定义数据类型进行排序,Person中有属性 姓名,年龄,身高 3 //排序规则: 按照年龄进行的升序,如果年龄相同按照身高进行降序 4 5 #inclu ...

  7. read_csv报错Initializing from file failed ,pandas.read_csv不能读取中文内容报错‘utf-8‘ codec can‘t decode byte

    import pandas as pd f=open("C:/Users/qa124/Desktop/北京地区信息.csv",encoding='utf-8') myfile=pd ...

  8. 玩转SpringBoot:SpringBoot的几种定时任务实现方式

    引言 在现代软件开发中,定时任务是一种常见的需求,用于执行周期性的任务或在特定的时间点执行任务.这些任务可能涉及数据同步.数据备份.报表生成.缓存刷新等方面,对系统的稳定性和可靠性有着重要的影响.Sp ...

  9. Zabbix技术分享——snmp异常排查指南

    大家好,我是乐乐.在IT运维中,难免会碰上设备snmp不通的情况,那么,当问题出现的时候,运维工程师该如何快速找到问题所在呢?下面让我们一起来看看吧!   1.IP配置检查 首先检查zabbix监控上 ...

  10. 2024-03-16:用go语言,给你一个正整数数组 nums, 每一次操作中,你可以从 nums 中选择 任意 一个数并将它减小到 恰好 一半。 (注意,在后续操作中你可以对减半过的数继续执行操作)

    2024-03-16:用go语言,给你一个正整数数组 nums, 每一次操作中,你可以从 nums 中选择 任意 一个数并将它减小到 恰好 一半. (注意,在后续操作中你可以对减半过的数继续执行操作) ...