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.pswp.cn/news/248849.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/248849.shtml
英文地址,請注明出處:http://en.pswp.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 對象&…