【JZOJ6273】欠钱
description

analysis
读懂题就可知\(b\)的收益即为\(a\)到\(b\)这一条链上边权的最小值
那么就是动态维护一个森林,询问链上最小值,同时必须满足儿子走向父亲
明显\(LCT\)是吧,但是需要认真思考不少额外知识
由于原树是有根树,每一次查询会把一棵\(splay\)翻转,导致原树形态变化
于是每次查询之后要\(makeroot\)原来的根,只有加边原树根才会变
还需要保证\(b\)一定是\(a\)的祖先,\(LCT\)没有祖先的限制,要怎么做?
其实可以先后\(access(x),access(y)\),\(splay(x,0)\)后,此时\(x\)是某\(splay\)的根
那么\(pf[x]\)就是原树中的\(LCA\),这个方法同样可以用于求动态树的\(LCA\)
然后就没了
code
就没了?
体验过肛\(6h+\)之后莫名其妙\(MLE\)和\(RE\)根本调不出来的感觉吗?
体验过卡常数卡到想吃屎吃到哭的感觉吗?
妈的
#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#pragma GCC optimize(3)
#pragma GCC target("avx")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<cctype>
#define MAXN 100005
#define INF 1000000007
#define reg register int
#define max(x,y) ((x>y)?(x):(y))
#define min(x,y) ((x<y)?(x):(y))
#define fo(i,a,b) for (reg i=a;i<=b;++i)
#define fd(i,a,b) for (reg i=a;i>=b;--i)
using namespace std;
int tr[MAXN*2][2];
int fa[MAXN*2],pf[MAXN*2],st[MAXN*2],fat[MAXN];
int n,m,lastans,cnt,pos,root;
bool flag,bz;
struct node
{
int val,mn;
bool rev;
}a[MAXN*2];
__attribute__((optimize("-O3")))
inline char getcha()
{
static char buf[100000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
__attribute__((optimize("-O3")))
inline int read()
{
int res=0;char ch=getcha();bool XX=false;
for(;!isdigit(ch);ch=getcha())
(ch=='-') && (XX=true);
for(;isdigit(ch);ch=getcha())
res=(res<<3)+(res<<1)+(ch^48);
return XX?-res:res;
}
__attribute__((optimize("-O3")))
inline void write(int x)
{
int num=0;static char c[15];
while (x)c[++num]=(x%10)+48,x/=10;
while (num)putchar(c[num--]);
putchar('\n');
}
__attribute__((optimize("-O3")))
inline void swap(int &x,int &y){int z=x;x=y,y=z;}
__attribute__((optimize("-O3")))
inline int getfa(int x){return fat[x]==x?x:fat[x]=getfa(fat[x]);}
__attribute__((optimize("-O3")))
inline void update(int x)
{
if (x)a[x].mn=min(a[x].val,min(a[tr[x][0]].mn,a[tr[x][1]].mn));
}
__attribute__((optimize("-O3")))
inline void reverse(int x)
{
if (x)a[x].rev^=1,swap(tr[x][0],tr[x][1]);
}
__attribute__((optimize("-O3")))
inline void down(int x)
{
if (a[x].rev)
{
reverse(tr[x][0]),reverse(tr[x][1]);
a[x].rev=0;
}
}
__attribute__((optimize("-O3")))
inline void downdata(int x)
{
while (x)st[++st[0]]=x,x=fa[x];
while (st[0])down(st[st[0]--]);
}
__attribute__((optimize("-O3")))
inline int lr(int x)
{
return tr[fa[x]][1]==x;
}
__attribute__((optimize("-O3")))
inline void rotate(int x)
{
int y=fa[x],k=lr(x);
tr[y][k]=tr[x][!k];
if (tr[x][!k])fa[tr[x][!k]]=y;
fa[x]=fa[y];if (fa[y])tr[fa[y]][lr(y)]=x;
tr[x][!k]=y,fa[y]=x,pf[x]=pf[y];
update(y),update(x);
}
__attribute__((optimize("-O3")))
inline void splay(int x,int y)
{
downdata(x);
while (fa[x]!=y)
{
if (fa[fa[x]]!=y)rotate(lr(fa[x])==lr(x)?fa[x]:x);
rotate(x);
}
}
__attribute__((optimize("-O3")))
inline void access(int x)
{
for (int y=0;x;update(x),y=x,x=pf[x])
{
splay(x,0);
fa[tr[x][1]]=0,pf[tr[x][1]]=x;
tr[x][1]=y,fa[y]=x,pf[y]=0;
}
}
__attribute__((optimize("-O3")))
inline void makeroot(int x)
{
access(x),splay(x,0),reverse(x);
}
__attribute__((optimize("-O3")))
inline void link(int x,int y)
{
makeroot(x),pf[x]=y;
}
__attribute__((optimize("-O3")))
inline bool judge(int x,int y)
{
access(x),access(y),splay(x,0);
return pf[x]==y;
}
int main()
{
//freopen("T3.in","r",stdin);
freopen("money.in","r",stdin);
freopen("money.out","w",stdout);
n=read(),m=read();
fo(i,0,n)a[i].mn=a[i].val=INF,fat[i]=i;
while (m--)
{
int type=read(),x=(read()+lastans)%n+1,y=(read()+lastans)%n+1,z;
if (!type)
{
if (!root || root==x)root=y;
z=(read()+lastans)%n+1,++cnt;
link(x,n+cnt),link(n+cnt,y);
a[n+cnt].mn=a[n+cnt].val=z;
fat[getfa(x)]=getfa(y);
}
else
{
if (getfa(x)==getfa(y) && judge(x,y))
{
makeroot(y),access(x),splay(x,0);
write(a[x].mn),lastans=a[x].mn,makeroot(root);
}
else printf("0\n"),lastans=0;
}
}
return 0;
}
【JZOJ6273】欠钱的更多相关文章
- TY创新D总个人经历谈
这是深圳一个公司的老板(就叫D总吧)在吃饭间和我们讲起的他的个人经历,这中间个人的苦辣酸甜,有些意思,值得玩味,就做了个实录. D总:我当时做餐饮是在我第一次创业失败之后.我做的是一家火锅店. 这家餐 ...
- BP(back propagation)反向传播
转自:http://www.zhihu.com/question/27239198/answer/89853077 机器学习可以看做是数理统计的一个应用,在数理统计中一个常见的任务就是拟合,也就是给定 ...
- BZOJ_1021_[SHOI2008]_Debt循环的债务_(DP)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1021 三个人相互欠钱,给出他们每个人各种面额的钞票各有多少张,求最少需要传递多少张钞票才能把账 ...
- UVA 538 - Balancing Bank Accounts(贪心)
UVA 538 - Balancing Bank Accounts 题目链接 题意:给定一些人的欠钱关系,要求在n-1次内还清钱,问方案 思路:贪心,处理出每一个人最后钱的状态,然后直接每一个人都和最 ...
- CF Round #353 Div.2
http://codeforces.com/contest/675 A. Infinite Sequence 题意:给出等差数列的首项a以及公差c,问数b是不是该数列中的数,若是输出YES否则输出NO ...
- 如何直观的解释back propagation算法?
转自:知乎-https://www.zhihu.com/question/27239198 作者:匿名用户链接:https://www.zhihu.com/question/27239198/answ ...
- 夏令营提高班上午上机测试 Day 2 解题报告
那一天,日照一中夏令营数据结构提高班的同学们终于想起了,被Day2上午的三道题支配的恐惧…… 是的..这一天的题有点难想.. 本来打算前天写这篇随笔,然而前天在机房和同学打luogu月赛…… 昨天 ...
- 信利SC123金融财务计算器评测——不错的HP 12C仿品
最近X宝48包邮购入信利SC123金融计算器,只是为了玩一玩(没错你的好友盗版狂魔又上线了),因为这是目前市面上能买到的最便宜的金融计算器了,也是能买到的最便宜的RPN计算器,顺手出个评测.这个计算器 ...
- 前向传播算法(Forward propagation)与反向传播算法(Back propagation)
虽然学深度学习有一段时间了,但是对于一些算法的具体实现还是模糊不清,用了很久也不是很了解.因此特意先对深度学习中的相关基础概念做一下总结.先看看前向传播算法(Forward propagation)与 ...
随机推荐
- 创建UI的线程才能访问UI,那么怎样才算访问UI呢
只有创建UI元素的线程(主线程又叫UI线程)才能访问UI元素.在UI线程中工作,不会有这个问题. 在后台线程中,如果直接访问UI元素,会抛出 “调用线程无法访问此对象,因为另一个线程拥有该对象” 异常 ...
- 逻辑右移函数 srl()与算术右移函数 sra() (转)
比如一个有符号位的8位二进制数11001101,逻辑右移就不管符号位,如果移一位就变成01100110.算术右移要管符号位,右移一位变成10100110. 逻辑左移=算数左移,右边统一添0 逻辑右移, ...
- Peasy.NET学习之并发问题处理
Peasy.net之并发处理 BusinessServiceBase是ServiceBase的自定义实现,提供了额外的独特功能 首先,创建一个业务服务,该业务服务必须继承BusinessService ...
- struts2注解方式的验证
struts2的验证分为分编程式验证.声明式验证.注解式验证.因现在的人越来越懒,都追求零配置,所以本文介绍下注解式验证. 一.hello world 参考javaeye的这篇文章,按着做一次,起码有 ...
- vue cli3 vue.config配置
跳地址:https://cli.vuejs.org/zh/config/#publicpath
- windows下安装jenkins初级(1)
这里是基于Windows系统下安装Jenkins 首先下载jenkins 下载地址:https://jenkins.io/download/ 选择所需要的系统 我这里选择Windows 开始安装 一直 ...
- 41. wait notify 方法
wait() 等待,如果一个线程执行了wait方法,那么该线程就会进去一个以锁对象为标识符的线程池中等待 notity() 唤醒,如果一个线程执行了notity方法,那么就会唤醒以锁对象为标识符的线 ...
- 53 windows 系统下
0 引言 本篇主要记录windows下编程以及系统安装与恢复等问题. 1 Visual Studio (1)debug "warning LNK4042: 对象被多次指定:已忽略多余的指定& ...
- RTC, Real Time Clock
配置 写入RTC_PRL, RTC_CNT, RTC_ALR寄存器时,需要先进入配置模式,通过把RTC_CRL寄存器的CNF位置一. 另外,在每次配置一个寄存器时必须等待上一次配置完成,可以通过检测R ...
- Python3 From Zero——{最初的意识:001~数据结构和算法}
一.从队列两端高效插入.删除元素,及保留固定数量的数据条目: collections.deque([iterable[,maxlen=N]]) a = collections.deque([1, 2] ...