CF176E Archaeology(set用法提示)

题目大意:

给一棵树,每次激活或熄灭一个点,每次问这些点都联通起来所需的最小总边权

分析:

若根据dfs序给所有点排序,为$v1,v2,v3....vk$,那么答案就是$(dis(v1,v2)+dis(v2,v3)+...+dis(vk-1,vk)+dis(vk,v1))/2$

只需要动态的维护这个序列,每次拿出前后两个点后用lca修改答案即可

这道题主要是想学习一下set在这方面的使用

毕竟现在开O2的题比比皆是,要是能少写个平衡树岂不美哉(我也不会写233

我们就默认使用的是c++11的标准吧


如何为set重载运算符

首先你要有一个结构体,并在里面重载一个bool类型的()函数,先这样(这里以将数字按d数组的大小排序为例):

struct cmp{bool operator () (const int &a,const int &b){return d[a]<d[b];}};

接下来这样声明set:

set<int,cmp>S;

如何查找一个元素的前驱后继等

我们这里声明迭代器时使用c++11特有的auto用法,看起来方便不少(set<int>::iterator)

这里以查找x的前驱后继为例(循环式的,即若x为最后一个数,后继就是第一个数,反过来同理

auto it=S.lower_bound(x),a=it,b=it;
int l=(it==S.begin()?*--S.end():*--a);
int r=(it==--S.end()?*S.begin():*++b);

注意这里end()函数返回的是个超尾,所以要--

这里我们看到迭代器的移动用加减即可,取值时用*即可

插入删除

insert和erase,千万别记错了

S.insert(x);
S.erase(x);

接下来放上这道题的代码

 1 #include<bits/stdc++.h>
 2 #define N 100005
 3 #define ll long long
 4 using namespace std;
 5 int n,q;
 6 int h[N],to[2*N],nxt[2*N],w[2*N],etop;
 7 void add(int a,int b,int c){to[++etop]=b,nxt[etop]=h[a],w[etop]=c,h[a]=etop;}
 8 int fa[N][20],d[N],tot,dep[N];
 9 ll len[N][20];
10 void dfs(int u){
11     d[u]=++tot;
12     for(int i=1;i<=17;i++){
13         fa[u][i]=fa[fa[u][i-1]][i-1];
14         len[u][i]=len[u][i-1]+len[fa[u][i-1]][i-1];
15         if(fa[u][i]==0)break;
16     }
17     for(int k=h[u],v=to[k];k;k=nxt[k],v=to[k])
18     if(v!=fa[u][0]){
19         fa[v][0]=u;len[v][0]=w[k];
20         dep[v]=dep[u]+1;
21         dfs(v);
22     }
23 }
24 ll LCA(int x,int y){
25     ll ans=0;
26     if(dep[x]<dep[y])swap(x,y);
27     for(int i=17;i>=0;i--)
28     if(fa[x][i]&&dep[fa[x][i]]>=dep[y]){
29         ans+=len[x][i];
30         x=fa[x][i];
31     }
32     if(x==y)return ans;
33     for(int i=17;i>=0;i--)
34     if(fa[x][i]!=fa[y][i]){
35         ans+=len[x][i];
36         ans+=len[y][i];
37         x=fa[x][i];
38         y=fa[y][i];
39     }
40     ans+=len[x][0];
41     ans+=len[y][0];
42     return ans;
43 }
44 struct cmp{bool operator () (const int &a,const int &b){return d[a]<d[b];}};
45 set<int,cmp>S;
46 ll ans;
47 void ins(int x){
48     S.insert(x);
49     auto it=S.lower_bound(x),a=it,b=it;
50     int l=(it==S.begin()?*--S.end():*--a);
51     int r=(it==--S.end()?*S.begin():*++b);
52     ans-=LCA(l,r);
53     ans+=LCA(l,x);
54     ans+=LCA(x,r);
55 }
56 void del(int x){
57     auto it=S.lower_bound(x),a=it,b=it;
58     int l=(it==S.begin()?*--S.end():*--a);
59     int r=(it==--S.end()?*S.begin():*++b);
60     ans+=LCA(l,r);
61     ans-=LCA(l,x);
62     ans-=LCA(x,r);
63     S.erase(x);
64 }
65 char o[2];
66 int main(){
67     scanf("%d",&n);
68     for(int i=1,a,b,c;i<n;i++){
69         scanf("%d%d%d",&a,&b,&c);
70         add(a,b,c),add(b,a,c);
71     }
72     dfs(1);
73     scanf("%d",&q);
74     while(q--){
75         scanf("%s",o);
76         if(o[0]=='?')cout<<ans/2<<endl;
77         else{
78             int x;scanf("%d",&x);
79             if(o[0]=='+')ins(x);
80             else del(x);
81         }
82     }
83     return 0;
84 }
View Code

 


2019.6.18 update

今天在写一个扫描线题时使用上面的方法重置set的比较符出现了问题,使用lower_bound会在大数据下WA掉,但upper_bound则没问题

如果使用常规的重载运算符的话则两种方式都没问题……(蒙圈ing

这里给个当时的两种比较函数吧

这是出了问题的:

struct cmp{bool operator () (const hu &A,const hu &B){double as=A.y+sqrt(A.r*A.r-(A.x-X)*(A.x-X))*(1.0*A.u);double bs=B.y+sqrt(B.r*B.r-(B.x-X)*(B.x-X))*(1.0*B.u);if(as+eps>bs&&bs+eps>as)return A.u<B.u;else return as<bs;}
};

这个是改成重载运算符的:

bool operator < (const hu &A,const hu &B){double as=A.y+sqrt(A.r*A.r-(A.x-X)*(A.x-X))*(1.0*A.u);double bs=B.y+sqrt(B.r*B.r-(B.x-X)*(B.x-X))*(1.0*B.u);if(as+eps>bs&&bs+eps>as)return A.u<B.u;else return as<bs;
}

如果哪位大神路过希望能指点一下555(;´д`)ゞ

 

还有NOI没有C++11

所以跟我一起拼一遍

iterator

再来3遍

iterator

iterator

iterator

ojbk!

 

转载于:https://www.cnblogs.com/2017SSY/p/10948482.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/248849.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网上整理的对于Rest和Restful api的理解 - 那啥快看 - 博客园

一、什么是Rest? REST不是"rest"这个单词&#xff0c;而是几个单词缩写 -- REpresentational State Transfer 直接翻译&#xff1a;表现层状态转移&#xff0c;但这个翻译正常人根本看不懂&#xff0c;找到的一种最好理解的说法是&#xff0c;URL定位资源&#xff…

企业级rancher搭建Kubernetes(采用rancher管理平台搭建k8s)

一、简介 Rancher简介 来源官方&#xff1a;https://www.cnrancher.com/ Rancher是一个开源的企业级容器管理平台。通过Rancher&#xff0c;企业再也不必自己使用一系列的开源软件去从头搭建容器服务平台。Rancher提供了在生产环境中使用的管理Docker和Kubernetes的全栈化容器部…

[工具]java_sublime的快速使用

目录 使用 : 怎么运行: 调整字体: 使用 : 新建--->写好代码后-->另存为尾缀是.java的文件 怎么运行: 在你另存为的目录下cmd调用控制台输入dos指令--->执行javac 文件名.java(有.java尾缀)(编译为.class文件)--->java 文件名(没有.class尾缀设计者认为执行的是…

基于SOA的银行系统架构

Part-1 【简述】 1.通过引入面向服务架构&#xff08;SOA&#xff09;&#xff0c;企业服务总线&#xff08;ESB&#xff09;&#xff0c;适配器&#xff08;Adapter&#xff09;及面向构件等技术&#xff0c;尝试打造一个统一业务流程服务平台&#xff0c;实现面向流程的服务…

一次前后端分离的实践

前后端分离该如何做? 这个问题&#xff0c;不同的技术人员&#xff0c;由于所处的岗位不一样&#xff0c;给出的答案都不一样。 前后端分离的问题&#xff0c;不仅仅是技术上的选型问题&#xff0c;还涉及到整个团队在认知、职责、流程上面重新定义的问题&#xff0c;这也是为…

C++解析-外传篇(1):异常处理深度解析

0.目录 1.异常的最终处理 2.结束函数terminate() 3.小结 1.异常的最终处理 问题&#xff1a; 如果在main函数中抛出异常会发生什么&#xff1f; 如果异常不处理&#xff0c;最后会传到哪里&#xff1f; 下面的代码的输出什么&#xff1f; 示例——异常的最终处理&#xff1f;&a…

springboot快速集成swagger

今天技术总监说&#xff1a;小明&#xff0c;我们本次3.0改造&#xff0c;使用swagger2.0作为前后端分离的接口规范&#xff0c;它可以一键生成前后端的API,一劳永逸……小明&#xff1a;&#xff1f;&#xff1f;&#xff1f; Spring Boot 框架是目前非常流行的微服务框架&…

php curl处理get和post请求

CURL 是一个利用URL语法规定来传输文件和数据的工具&#xff0c;支持很多协议&#xff0c;如HTTP、FTP、TELNET等。最爽的是&#xff0c;PHP也支持 CURL 库。使用PHP的CURL 库可以简单和有效地去抓网页。你只需要运行一个脚本&#xff0c;然后分析一下你所抓取的网页&#xff0…

前端攻略系列(二) - 前端各种面试题

幸运且光荣的被老大安排了一个任务 - “去整理些前端面试题”。年前确实不是招人的好时候&#xff0c;所以我们前端团队经过了超负荷的运转&#xff0c;终于坚持过了春节。春节以后就开始招人啦&#xff0c;这套题考察的目标就是基础基础再基础&#xff0c;嘿嘿。 事先声明&…

html 初识

一、web请求流程模拟 python编写的简易服务器应用程序 import socketserversocket.socket() ip_port (127.0.0.1,8080) server.bind(ip_port) server.listen()while 1:conn, addr server.accept()from_browser_msgconn.recv(1024)print(from_browser_msg)conn.send(bHTTP/1.1 …

WEB文件上传之JQuery ajaxfileupload插件使用(二)

1.JQuery ajaxfileupload插件使用准备 下载地址&#xff1a; http://www.phpletter.com/DOWNLOAD/ 2.原理分析 ajaxfileupload也是利用iframe实现无刷新异步提交&#xff0c;与我的上一篇文章&#xff08;WEB文件上传之apache common upload使用&#xff08;一&#xff09;&…

Navicat安装激活

有条件的同学麻烦不要使用下面的激活步骤&#xff0c;仅供个人学习使用 。。。。。。 。。。。。。 。。。。。。 。。。。。。 一、去官网下载最新Navicat软件https://www.navicat.com.cn/download/navicat-premium 二、去下载激活脚本https://github.com/DoubleLabyrinth/nav…

WEB文件上传之apache common upload使用(一)

文件上传一个经常用到的功能&#xff0c;它有许多中实现的方案。 页面表单 RFC1897规范 http协议上传 页面控件(flash/html5/activeX/applet) RFC1897规范 http协议上传 页面控件(flash/html5/activeX/applet) 自定义数据规范 http协议上传 页面控件(flash/html5/act…

前端CSS学习笔记

一 CSS介绍 层叠样式表(英文全称&#xff1a;Cascading Style Sheets)是一种用来表现HTML&#xff08;超文本标记语言&#xff09;或XML&#xff08;标准通用标记语言的一个子集&#xff09;等文件样式的计算机语言。CSS不仅可以静态地修饰网页&#xff0c;还可以配合各种脚本语…

Java爬取并下载酷狗音乐

本文方法及代码仅供学习&#xff0c;仅供学习。 案例&#xff1a; 下载酷狗TOP500歌曲&#xff0c;代码用到的代码库包含&#xff1a;Jsoup、HttpClient、fastJson等。 正文&#xff1a; 1、分析是否可以获取到TOP500歌单 打开酷狗首页&#xff0c;查看TOP500&#xff0c;发现存…

Webpack/Vue-cli两种方式加载markdown文件并实现代码高亮

准备的资源&#xff1a; highlight.js &#xff1a; 实现代码高亮&#xff0c;通过npm install highlight.js -D安装 vue-markdown-loader&#xff1a;解析md文件的必备loader&#xff0c;通过npm install vue-markdown-loader -D安装 下面我们分两个场景来说明一下md文件的…

新浪微博第三方登陆重定向错误23123

新浪微博第三方登陆重定向错误23123 2019年06月02日 13:49:43 温室花朵 阅读数&#xff1a;2更多 个人分类&#xff1a; 第三方微博登陆21323编辑当我们使用微博第三方登陆的时候&#xff0c;发现登陆出错了&#xff0c;错误码为&#xff1a;21323&#xff0c;解决方案如下&…

Utility Manager 的一些百度不了的操作

一进来是不是这样的&#xff01; 那突然出了点问题&#xff0c;咋办呢&#xff01; 就像这样子的&#xff0c; 恢复默认布局就OK啦&#xff01;哈哈哈&#xff0c;太聪明啦&#xff0c;但是百度了好长时间还是找不到啊&#xff0c;怎么办呐&#xff0c;烦死啦&#xff01; 其实…

记录一次内网渗透试验

0x00 前言 目标&#xff1a;给了一个目标机ip&#xff0c;要求得到该服务器权限&#xff0c;并通过该ip渗透至内网控制内网的两台服务器 攻击机&#xff1a;kali (192.168.31.51) 目标机&#xff1a;windows 2003 (192.168.31.196) 0x01 信息收集 nmap端口探测 御剑后台扫描 …

2018-2019 1 20165203 实验五 通用协议设计

2018-2019 1 20165203 实验五 通用协议设计 OpenSSL学习 定义&#xff1a;OpenSSL是为网络通信提供安全及数据完整性的一种安全协议&#xff0c;囊括了主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议&#xff0c;并提供了丰富的应用程序供测试或其它目的使用。基本功…