真是神题

当时调了几天没调出来 后来没管了

当时把fread去掉就TLE,加上就RE

一直在底下跟网上的程序拍,尝试各种优化常数都没用

拍出几组不一样的,发现我是对的,醉了,网上那个是怎么过的

记一下这蛋疼的代码

 #include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cstdio>
#include<map> using namespace std; //default source begin==========
const int D=;
char in[D],out[*],*I=in+D,*O=out; char gc() {
if(I==in+D) fread(in,,D,stdin),I=in;
return *(I++);
}
#define gc gc()
#define pc(x) ((*O++)=x)
#define tQ template <typename Q>
tQ void gt(Q&x) {
static char c,f;
for(f=;c=gc,!isdigit(c);)if(c=='-') f=;
for(x=;isdigit(c);c=gc) x=x*+c-'';
f && (x=-x);
}
tQ void pt(Q x){
static char stk[];
static int top;
top=;
if(x==) pc('');
for(;x;x/=) stk[++top] = x%+'';
for(;top;top--) pc(stk[top]);
}
//default source end============= const int Maxn=,Maxm=,Maxq=;
int n,m,Q; int ch[Maxn+Maxm][],p[Maxn+Maxm],flip[Maxn+Maxm],mx[Maxn+Maxm],w[Maxn+Maxm];
map<pair<int,int> ,struct Edge*> hash;
int ddb[Maxn+Maxm];
typedef long long ll;
/*
const unsigned int Hmod=1e6+7;
struct Node{
ll hs;
int id;
Node*next;
Node(ll hs=0,int id=0,Node*next=0):hs(hs),id(id),next(next){}
}da[Maxm],*fir[Hmod]; int find(ll x){
unsigned md=x%Hmod;
for(Node*p=fir[md];p;p=p->next){
if(p->hs==x) return p->id;
}
return NULL;
} int insert(ll x){
unsigned md=x%Hmod;
*/ #define l ch[x][0]
#define r ch[x][1]
void update(int x){
if(!x) return;
mx[x]=x;
if(w[mx[l]]>w[mx[x]]) mx[x]=mx[l];
if(w[mx[r]]>w[mx[x]]) mx[x]=mx[r];
}
void down(int x) {
if(!x || !flip[x]) return;
swap(l,r);
flip[l]^=;
flip[r]^=;
flip[x]=;
}
#undef l
#undef r
inline bool isroot(int x) {
return ch[p[x]][]!=x && ch[p[x]][]!=x;
}
inline void rotate(int x){
int y=p[x],z=p[y];
int l=ch[y][]==x,r=l^;
if(!isroot(y)){
ch[z][ch[z][]==y]=x;
}
p[y]=x;
p[ch[x][r]]=y;
p[x]=z; ch[y][l]=ch[x][r];
ch[x][r]=y; update(y);
// update(x);
} int stk[Maxn],top;
inline void splay(int x){
stk[top=]=x;
for(int t=x;!isroot(t);stk[++top]=t=p[t]);
for(;top;top--) down(stk[top]);
for(;!isroot(x);){
int y=p[x],z=p[y];
if(!isroot(y)) {
if( (ch[y][]==x) ^ (ch[z][]==y)) rotate(x);
else rotate(y);
}
rotate(x);
}
update(x);
} inline void access(int x) {
for(int t=;x;x=p[t=x]){
splay(x);
ch[x][]=t;
update(x);
}
} inline void newroot(int x) {
access(x);
splay(x);
flip[x]^=;
} inline void n_as(int u,int v){
newroot(u);
access(v);
splay(v);
} inline void Cut(int x,int y) {
n_as(x,y);
ch[y][]=p[x]=;
update(x);
} inline void Link(int x,int y) {
newroot(x);
p[x]=y;
} struct Edge{
int u,v,w,id;
bool deled;
void read() {
gt(u);gt(v);gt(w);
if(u>v) swap(u,v);
}
bool operator<(const Edge&rhs)const {
return u<rhs.u || (u==rhs.u&&v<rhs.v);
}
bool operator == (const Edge&rhs)const {
return u==rhs.u && v==rhs.v;
}
bool operator <= (const Edge&rhs)const {
return *this<rhs || *this==rhs;
}
Edge(int u=,int v=):u(u),v(v){}
}e[Maxm]; bool cmpw(const Edge&lhs,const Edge&rhs) {
return lhs.w<rhs.w;
} struct Que{
int k,u,v;
Que (int k=,int u=,int v=):k(k),u(u),v(v){}
}que[Maxq]; int bs(const Edge&target) {
int l=,r=m,res=-;
for(int mid;l<=r;) {
mid=(l+r)>>;
if(e[mid]<=target) res=mid,l=mid+;
else r=mid-;
}
if(res==-) exit(-);
return res;
} int fa[Maxn];
int Find(int x){
return fa[x]==x?x:fa[x]=Find(fa[x]);
}
bool Union(int x,int y) {
x=Find(x),y=Find(y);
if(x==y) return ;
return fa[x]=y,;
}
void ufs_init(int n) {
for(int i=;i<=n;i++) fa[i]=i;
}
void AddEdge(int i) {
const int&u=e[i].u,&v=e[i].v;
if(Union(u,v)) Link(u,i+n),Link(v,i+n);
else {
n_as(u,v);int t=mx[v];
if(w[t] > e[i].w) {
// Cut(e[t-n].u,t);
Cut(e[t-n].v,t);
Link(u,i+n);
Link(v,i+n);
}
}
} bool cmpid(const Edge&lhs,const Edge&rhs){
return lhs.id<rhs.id;
} void init() {
gt(n),gt(m),gt(Q);
for(int i=;i<=m;i++) e[i].read();
sort(e+,e+m+);
for(int i=;i<=m;i++) e[i].id=i,w[i+n]=e[i].w;
for(int k,u,v,i=;i<=Q;i++) {
gt(k),gt(u),gt(v);
if(u>v) swap(u,v);
que[i]=Que(k,u,v);
if(k==) e[bs(Edge(u,v))].deled=;
}
} void Kruskal() {
sort(e+,e+m+,cmpw);
ufs_init(n);
for(int i=,MST=;i<=m;i++) {
if(e[i].deled) continue;
if(!Union(e[i].u,e[i].v)) continue;
Link(e[i].u,e[i].id+n);
Link(e[i].v,e[i].id+n);
if(++MST==n-) break;
}
} int ans[Maxq],tq=;
void work() {
Kruskal();
sort(e+,e+m+);
for(int i=Q;i;i--) {
const Que&q=que[i];
if(q.k==) {
n_as(q.u,q.v);
ans[++tq] = w[mx[q.v]];
}else {
AddEdge(bs(Edge(q.u,q.v)));
}
}
for(int i=tq;i;i--) pt(ans[i]),pc('\n');
} int main() {
#ifdef DEBUG
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif init();
work(); return printf(out),;
}

【bzoj2594】[Wc2006]水管局长数据加强版的更多相关文章

  1. BZOJ2594: [Wc2006]水管局长数据加强版

    题解: 裸LCT+离线+二分+MST... 代码:(几乎摘抄自hzwer) #include<cstdio> #include<cstdlib> #include<cma ...

  2. [bzoj2594][Wc2006]水管局长数据加强版 (lct)

    论蒟蒻的自我修养T_T.. 和noi2014魔法森林基本一样...然而数据范围大得sxbk...UPD:这题如果用lct判联通的话可能会被卡到O(mlogm)..所以最好还是用并查集吧 一开始数组开太 ...

  3. BZOJ2594 [Wc2006]水管局长数据加强版 【LCT维护最小生成树】

    题目 SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要为供水公司找到一条从A至B的水管的 ...

  4. BZOJ2594 [Wc2006]水管局长数据加强版 LCT kruskal

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ2594 题意概括 N个点的图,M条带权边.(N<=100000,M<=1000000) ...

  5. [BZOJ2594] [Wc2006]水管局长数据加强版(LCT + kruskal + 离线)

    传送门 WC这个题真是丧心病狂啊,就是想学习一下怎么处理边权,给我来了这么一个破题! ORZ hzwer 临摹黄学长代码233 但还是复杂的一匹 理一下思路吧 题目大意:给定一个无向图,多次删除图中的 ...

  6. 沉迷Link-Cut tree无法自拔之:[BZOJ2594][Wc2006]水管局长数据加强版

    来自蒟蒻 \(Hero \_of \_Someone\) 的 \(LCT\) 学习笔记 $ $ 这应该算是道套路题吧, 如果将图中的边转换成点, 再将边权变点权, 就可以用 \(LCT\) 来维护了 ...

  7. [bzoj2594][Wc2006]水管局长数据加强版——lct+离线

    Brief Description 您有一个无向带权图,您需要支持两种操作. 询问两个点之间的最大权最小路径. 删除一条边. Algorithm Design 我们首先提出一个猜想:最优路径一定在原图 ...

  8. bzoj2594 [Wc2006]水管局长数据加强版——LCT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2594 时间倒序一下,就是 魔法森林 那道题: 有个不解的地方,是 access 里面关于 p ...

  9. bzoj 2594: [Wc2006]水管局长数据加强版 动态树

    2594: [Wc2006]水管局长数据加强版 Time Limit: 25 Sec  Memory Limit: 128 MBSubmit: 934  Solved: 291[Submit][Sta ...

  10. BZOJ 2594: [Wc2006]水管局长数据加强版( LCT )

    离线然后就是维护加边的动态MST, Link cut tree秒掉..不过我写+调了好久...时间复杂度O(NlogN + MlogM) ------------------------------- ...

随机推荐

  1. 读懂IL代码(一)

    以前刚开始学C#的时候,总有高手跟我说,去了解一下IL代码吧,看懂了你能更加清楚的知道你写出来的代码是如何运行互相调用的,可是那时候没去看,后来补的,其实感觉也不晚.刚开始看IL代码的时候,感觉非常吃 ...

  2. Linux通配符

    * 任意字符 ?任意单个字符 [] 匹配指定 字符范围内的字符 [^] 指定范围之外的单个字符 常规字符集合 [a-z] a到z的所有小写字母 [A-Z] a到z的所有大写字母 [0-9] 0到9的所 ...

  3. Python下调用json.dumps中文显示问题解决办法

    json.dumps在默认情况下,对于非ascii字符生成的是相对应的字符编码,而非原始字符,例如: import json js = json.loads('{"haha": & ...

  4. CSS3中动画transform必须要了解的Skew变化原理

    transform是CSS3中比较安全的动画(对于性能来说),其中有一些动画属性,来执行不同的变化.今天我们来了解skew的变化原理. skew,其实使用的频率不是很高,当然也没有最低.但是往往,一直 ...

  5. G - A+B for Input-Output Practice (VI)

      Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u   Description You ...

  6. vs2013update4 vs-mda-remote cordova真机测试ios 解决里面一个坑

    sudo npm install -g vs-mda-remote --user=你的用户名 此步骤为安装vs-mda-remote,如果安装成功 执行vs-mda-remote –secure fa ...

  7. Object-C非正式协议与正式协议的区别

    Object-C非正式协议与正式协议的区别 这两个概念困扰我很久了,一直都很像搞清楚到非正式协议和正式协议有什么区别和联系,下面结合网上的资料和自己的看法谈谈这个问题. 一.非正式协议 显然这个名词是 ...

  8. opencv 2.46与visual studio 2012 配置方法

    一开学就搞实训,还是没学过的图像处理.痛苦啊!图像处理时一般使用Matlab中的图像工具箱,或者是C/C++和OpenCV结合使用.以前看过一些关于opencv的文章,没想到现在要用上了. 把搭建开发 ...

  9. 【技术贴】解决使用maven jetty启动后无法加载修改过后的静态资源

    如何使用jetty自动热部署修改后的所有文件,比如js,jpg,class等,哇咔咔 太爽啦比tomcat舒服多了. jetty模式是不能修改js文件的,比如你现在调试前端js,发现在myeclips ...

  10. 终端上设置git

    http://blog.163.com/xianfuying@126/blog/static/21960005201181482518631/ 在-/.ssh的位置vi id_rsa.pub 拷贝的时 ...