博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【YY】Oxer的noi
阅读量:4582 次
发布时间:2019-06-09

本文共 2752 字,大约阅读时间需要 9 分钟。

EZOI+1

【问题描述】

“君不见Oxer 感染 AHdoc,愈发喜爱毒瘤题。

 “君不见多组数据卡常数,难写难调难对拍

“……”

 一首《将进酒》道出了Oxer 对于毒瘤题的热爱与执着。

现在,他开始对一些毒瘤题进行分类,开始时,每道毒瘤题都是各自一类,每次,他会选择两道毒瘤题,认为他们是类似的(我们也认为类似是可以传递的,即类似,类似,则类似),然后把他们写在自己的博客里,来准备即将到来的noi。 

有趣的是,Oxer 有时会否定自己的分类,所以,他会从以往的一篇博客中找出一篇,以此为基础来进行新的分类。 

可是,山东省西北部某个奇怪的学校里的一些别有用心的奇怪的人总希望能够按照Oxer 对于毒瘤题的分类来进行复习noi。 

他们写了一个程序,能够快速查询两道毒瘤题在 Oxer 的某一篇博客中的是否是一类。

Oxer 对于他们的程序很感兴趣,希望能把这个程序出成一道毒瘤题来放在未来的 noi 中。

那么,你帮忙写个标程(暴力也行)好吗。

注意:开始时,Oxer 的博客中已经有一篇博客,我们称其为第篇,在第0篇博客中,每道题都是两两不类似的。

【输入格式】从文件 noi.in 读入输入文件共m+1 行。

第一行包括两个整数n  m,n 表示题目数量,表示程序的指令数量。第二行到第m+1 行,第 i+1 行分为如下两种情况:

L k a b 表示将第k 篇博客(初始为第0 篇)中的a 和b 两道题是类似的,并将现在的分类情况保存到第篇博客中。(如果已经是类似的,那么忽略这次操作)

Q k a b 表示查询第k 篇博客(初始为第0 篇)中的a 和b 两道题是否是类似的,若是,则输出“Fangfang”;若不是,则输出“Yuanyuan”。

 

 

 

思路:可持久化并查集

大致上,离线建操作树,dfs每次进入到一个建立在其father上的操作合并,退出时操作撤销

合并时使用启发式合并(就是说size小的连到大的上)

附代码:

1 #include
2 #include
3 #include
4 #include
5 #define N 1100000 6 using namespace std; 7 int n,m,cntop,cntqu,sz1,sz2; 8 struct fx{ 9 int to,a,b,next; 10 }op[N]; 11 struct gx{ 12 int ans,id,a,b,next; 13 }qu[N]; 14 int headop[N],headqu[N]; 15 int size[N],father[N]; 16 char ch[5]; 17 bool cmp(gx p,gx q){ 18 return (p.id
size[r2]) 53 mark=1; 54 else 55 mark=0; 56 if (mark){ 57 father[r2]=father[r1]; 58 size[r1]+=size[r2]; 59 } 60 else { 61 father[r1]=father[r2]; 62 size[r2]+=size[r1]; 63 } 64 dfs(op[e].to); 65 if (mark){ 66 father[r2]=r2; 67 size[r1]-=size[r2]; 68 } 69 else { 70 father[r1]=r1; 71 size[r2]-=size[r1]; 72 } 73 } 74 else 75 dfs(op[e].to); 76 } 77 } 78 int main(){ 79 freopen("noi.in","r",stdin); 80 freopen("noi.out","w",stdout); 81 cntqu=cntop=0; 82 scanf("%d %d",&n,&m); 83 for (int i=1;i<=n;i++){ 84 father[i]=i; 85 size[i]=1; 86 } 87 for (int i=1;i<=m;i++){ 88 scanf("%s",ch); 89 int tmp,x,y; 90 scanf("%d %d %d",&tmp,&x,&y); 91 if (ch[0]=='L') 92 addop(tmp,i,x,y); 93 if (ch[0]=='Q') 94 addqu(tmp,i,x,y); 95 } 96 dfs(0); 97 sort(qu+1,qu+cntqu+1,cmp); 98 for (int e=1;e<=cntqu;e++) 99 if (qu[e].ans==1)100 printf("Fangfang\n");101 else 102 printf("Yuanyuan\n");103 return 0;104 }
STD

 

转载于:https://www.cnblogs.com/Absolute-Zero/p/5982688.html

你可能感兴趣的文章
fiddler 抓取 nodejs
查看>>
1.Nginx服务应用
查看>>
MySQL基础
查看>>
凹凸贴图与法线贴图
查看>>
sqlserver跨服务器数据库sql语句
查看>>
设计模式-结构型模式,外观模式(6)
查看>>
Trie模版
查看>>
2018HDU多校训练-3-Problem F. Grab The Tree
查看>>
2016012032四则运算网页版结对项目报告
查看>>
淘宝专业版改基础版方法
查看>>
[转]ARM Pipeline
查看>>
[转]Blocking Code Injection on iOS and OS X
查看>>
颜色分类函数
查看>>
(中等) HDU 4725 The Shortest Path in Nya Graph,Dijkstra+加点。
查看>>
sort-归并排序
查看>>
django 快速实现完整登录系统(cookie)
查看>>
.NET中的out和ref关键字
查看>>
Python之ftp服务器
查看>>
KMP预处理
查看>>
oracle的wm_concat函数实现行转列
查看>>