当前位置: 首页 > news >正文

P5283 十二省联考 2019 异或粽子

原题

本题相当于计算查找k个(i,j)的异或值最大的范围的总和.
与计算最长异或路径p4551的思路很像,建议先写那道题.首先,我们再计算一条最长路径的时候,由于我们是将每一条路径都单独拿出来进行异或计算,所以,假设我们计算i,j的路径是最长的,我们会最终计算两遍,从1->i开始遍历时选择1->j这条路,而1->j开始遍历时同样会计算1->i这条路,所以一条最长路径会被计算两边(将p4551写出来即可理解为什么1->i,1->j都要分别遍历).所以,我们找k条实际需要我们找2k条,将2k个最大路径总和算出来后相加/2便是我们要的答案.
那么,怎么计算第k大的路径呢,这里,我们可以多定义一个数组,例如siz[cnt],表示经过第cnt个节点的次数,pat[i][k],用来表示以1->i为起点,异或和第k大的路径,当我们进行异或操作时,优先查找异或为1的节点,假设为第z个节点,之后,判断siz[z]是否大于等于k,如果满足条件,代表至少有z条路经过这个节点,如果小于k,那么我们需要寻找异或为0的这条路,但在选择这条路之前,我们需要将比他权重大的路径减去(异或为1),之后,进入下一个节点.

代码

千万要注意大小,节点数最少也得1e7+100,可以写成(5e5+100 )*32 ,因为范围问题改了好久,其次,注意1ll,注意左移右移时候,开long long

#include<iostream>#include<string>#include<queue>using namespace std;typedef long long ll;int n,k;const int N=5e5+100;ll siz[N*32];ll wsum[N];int tot;int tree[N*32][2];struct edge{ll wv;int x;int t;  bool operator<(const edge&e)const{return wv<e.wv;  }};bool cmp(edge e1,edge e2){if(e1.x!=e2.x)return e1.x<e2.x;else return e1.t<e2.t;}priority_queue<edge>pq;void insert(ll p){int fa=0;for(int i=32;i>=0;i--){ll w=(p>>i)&1;if(w==0){if(tree[fa][0]==0){tot++;tree[fa][0]=tot;}siz[tree[fa][0]]++;fa=tree[fa][0];}else{if(tree[fa][1]==0){tot++;tree[fa][1]=tot;}siz[tree[fa][1]]++;fa=tree[fa][1];}}}ll find(ll p,int t){int fa=0;ll res=0;for(int i=32;i>=0;i--){ll w=(p>>i)&1;if(w==0){if(siz[tree[fa][1]]>=t){res+=(1ll<<i);fa=tree[fa][1];}else{t-=siz[tree[fa][1]];fa=tree[fa][0];}}else{if(siz[tree[fa][0]]>=t){res+=(1ll<<i);fa=tree[fa][0];}else{t-=siz[tree[fa][0]];fa=tree[fa][1];}}}return res;}int main(void){cin>>n>>k;for(int i=1;i<=n;i++){cin>>wsum[i];wsum[i]^=wsum[i-1];}for(int i=0;i<=n;i++)insert(wsum[i]);k=k*2;for(int i=0;i<=n;i++){int p=i;int t=1;ll wv=find(wsum[i],1);pq.push({wv,p,t});}ll ans=0;for(int i=1;i<=k;i++){edge et=pq.top();ll wv=et.wv;int x=et.x;int t=et.t;t++;  ans+=wv;pq.pop();wv=find(wsum[x],t);pq.push({wv,x,t});}cout<<ans/2;}
http://www.dtcms.com/a/500179.html

相关文章:

  • 抗干扰天线的相关的技术参数:干扰抑制能力,干信比
  • 制作板块的网站wordpress 获取当前文章栏目链接
  • Mysql笔记13
  • 企业网站优化的弊端重庆网站建设联系电话
  • Claude 新功能深度解析:Agent Skills 让 AI 智能体变得更专业
  • C++:类和对象(3)|初始化列表|类型转换
  • 小面网站建设长春优化
  • c++贪吃蛇V1.0
  • 南京量身营销型网站设计个人网站 做啥好
  • 每日算法刷题Day75:10.18:leetcode 二叉树14道题,用时3h
  • C语言解析json字符串
  • 网站在哪里设置域名站长统计免费下载
  • 街道门户网站的建设思路.net网站模版
  • MyBatis—XML配置
  • Microsoft AI Genius | 用 MCP 解锁实时数据,重新定义交互边界
  • 杨园建设社区网站wordpress digg主题
  • HarmonyOS6 应用升级经验分享
  • 核工业西南建设集团有限公司网站网站管理助手 二级域名
  • 十月通勤小记
  • 贵州住房城乡建设厅官方网站公司的网站
  • 绪论——一文速通
  • 皮卡丘密码
  • 聊城建设局网站做公司官网大概多少钱
  • 教育系统网站cms网站开发完整视频
  • 肇庆免费模板建站logo成品效果图网站
  • 电商网站的支付接入该怎么做呢wordpress静态分页
  • Vue2(一):创建实例、插值表达式、Vue响应式特性、Vue指令、指令修饰符、计算属性
  • 网站建设东莞公司湖南邵阳调整多个风险区
  • 10种常用的进制转换
  • Chainlit+RAG 实战:从前端界面到多模态检索增强生成全流程开发