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…

P1101 单词方阵(DFS)

题目描述 给一n \times nnn的字母方阵&#xff0c;内可能蕴含多个“yizhong”单词。单词在方阵中是沿着同一方向连续摆放的。摆放可沿着 88个方向的任一方向&#xff0c;同一单词摆放时不再改变方向&#xff0c;单词与单词之间可以交叉,因此有可能共用字母。输出时&#xff0c;…

企业级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;这也是为…

queryList爬虫获取内容的几种方法总结 queryList给抓取的内容增加html追加元素html 代码实例...

//简略内容: 1. $data1 $ql->find(.two img)->map(function($item){return $item->alt; }); // 等价下面这句话 $data2 $ql->find(.two img)->attrs(alt);2. $texts $ql->find(.two>a)->texts(); $htmls $ql->find(#one span)->htmls();3. $…

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

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

《浅谈架构之路:前后端分离模式》 - 山人行 - 博客园

前言&#xff1a;分离模式 对前后端分离研究了一段时间&#xff0c;恰逢公司有一个大项目决定尝试使用前后端分离模式进行&#xff0c;便参与其中。该项目从2016年初立项至今&#xff0c;平平稳稳得度过&#xff0c;但也涌现出越来越多的问题&#xff0c;绝对不是说前后端分离模…

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…

【Web】JavaWeb项目为什么我们要放弃jsp?为什么要前后端解耦?为什么要前后端分离?2.0版,为分布式架构打基础。 - CSDN博客

前戏 前后端分离已成为互联网项目开发的业界标准使用方式&#xff0c;通过nginxtomcat的方式&#xff08;也可以中间加一个nodejs&#xff09;有效的进行解耦&#xff0c; 并且前后端分离会为以后的大型分布式架构、弹性计算架构、微服务架构、多端化服务&#xff08;多种客户…

MongoDB升级导致启动失败

起因 最近项目使用MongoDB,但是作为一个技术菜鸟&#xff0c;NoSQL数据库我还真不会用&#xff0c;于是我就在自己的阿里云服务器上安装了一个MongoDB4.0.9。 现象 但是当我使用yum -y update升级以后&#xff0c;MongoDB无法启动了&#xff0c;即使重装删除了MongDB的文件了还…

测者的测试技术手册:揭开java method的一个秘密--巨型函数

揭开java method的一个秘密&#xff1a;巨型函数 相信&#xff0c;很多人都不知道Java的Method的上限为64K。本文将超过这个上限的函数叫做巨型函数。 巨型函数的问题 1、如果代码超过了这个限制&#xff0c;Java编译器就报"Code too large to complier"的错误。 2、…

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

幸运且光荣的被老大安排了一个任务 - “去整理些前端面试题”。年前确实不是招人的好时候&#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 …

Iframe的那些事

在web开发中&#xff0c;经常会用到iframe&#xff0c;难免会碰到需要在父窗口中使用iframe中的元素、或者在iframe框架中使用父窗口的元素 js 在父窗口中获取iframe中的元素 1、 格式&#xff1a;window.frames["iframe的name值"].document.getElementByIdx_x(…

异常处理try...catch...throw

C 引入了异常处理机制。其基本思想是&#xff1a;函数 A 在执行过程中发现异常时可以不加处理&#xff0c;而只是“拋出一个异常”给 A 的调用者&#xff0c;假定为函数 B。 拋出异常而不加处理会导致函数 A 立即中止&#xff0c;在这种情况下&#xff0c;函数 B 可以选择捕获 …

Makefile 中:= ?= += =的区别

是最基本的赋值: 是覆盖之前的值? 是如果没有被赋值过就赋予等号后面的值 是添加等号后面的值转载于:https://www.cnblogs.com/mingyunrangwozoudaoxianzai/p/10118039.html

原生JS写Ajax的请求函数

本文主要介绍了如何通过原生JavaScript封装ajax请求&#xff0c;文中给出了具体的实现代码和详细的解释&#xff0c;希望对你有所帮助。 一、JS原生Ajax ajax&#xff1a;一种请求数据的方式&#xff0c;不需要刷新整个页面&#xff1b; ajax的技术核心是 XMLHttpRequest 对象&…