【YY】Oxer的noi

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<cstdio>
  2 #include<cstring>
  3 #include<algorithm>
  4 #include<cmath>
  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<q.id);
 19 }
 20 int find(int x){
 21     if (father[x]!=x) father[x]=find(father[x]);
 22     return father[x];
 23 }
 24 void addop(int a,int b,int x,int y){
 25     cntop++;
 26     op[cntop].next=headop[a];
 27     headop[a]=cntop;
 28     op[cntop].to=b;
 29     op[cntop].a=x;
 30     op[cntop].b=y;
 31 }
 32 void addqu(int a,int id,int x,int y){
 33     cntqu++;
 34     qu[cntqu].next=headqu[a];
 35     headqu[a]=cntqu;
 36     qu[cntqu].a=x;
 37     qu[cntqu].b=y;
 38     qu[cntqu].id=id;
 39 }
 40 void dfs(int x){
 41     for (int e=headqu[x];e;e=qu[e].next){
 42         int a=find(qu[e].a);
 43         int b=find(qu[e].b);
 44         if (a!=b) qu[e].ans=0;
 45         else qu[e].ans=1;
 46     }
 47     for (int e=headop[x];e;e=op[e].next){
 48         int mark=0; 
 49         int r1=find(op[e].a);
 50         int r2=find(op[e].b);
 51         if (r1!=r2){
 52             if (size[r1]>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

(1)普通用户端(全平台) 音乐播放核心体验: 个性化首页:基于 “听歌历史 + 收藏偏好” 展示 “推荐歌单(每日 30 首)、新歌速递、相似曲风推荐”,支持按 “场景(通勤 / 学习 / 运动)” 切换推荐维度。 播放页功能:支持 “无损音质切换、倍速播放(0.5x-2.0x)、定时关闭、歌词逐句滚动”,提供 “沉浸式全屏模式”(隐藏冗余控件,突出歌词与专辑封面)。 多端同步:自动同步 “播放进度、收藏列表、歌单” 至所有登录设备(如手机暂停后,电脑端打开可继续播放)。 音乐发现与管理: 智能搜索:支持 “歌曲名 / 歌手 / 歌词片段” 搜索,提供 “模糊匹配(如输入‘晴天’联想‘周杰伦 - 晴天’)、热门搜索词推荐”,结果按 “热度 / 匹配度” 排序。 歌单管理:创建 “公开 / 私有 / 加密” 歌单,支持 “批量添加歌曲、拖拽排序、一键分享到社交平台”,系统自动生成 “歌单封面(基于歌曲风格配色)”。 音乐分类浏览:按 “曲风(流行 / 摇滚 / 古典)、语言(国语 / 英语 / 日语)、年代(80 后经典 / 2023 新歌)” 分层浏览,每个分类页展示 “TOP50 榜单”。 社交互动功能: 动态广场:查看 “关注的用户 / 音乐人发布的动态(如‘分享新歌感受’)、好友正在听的歌曲”,支持 “点赞 / 评论 / 转发”,可直接点击动态中的歌曲播放。 听歌排行:个人页展示 “本周听歌 TOP10、累计听歌时长”,平台定期生成 “全球 / 好友榜”(如 “好友中你本周听歌时长排名第 3”)。 音乐圈:加入 “特定曲风圈子(如‘古典音乐爱好者’)”,参与 “话题讨论(如‘你心中最经典的钢琴曲’)、线上歌单共创”。 (2)音乐人端(创作者中心) 作品管理: 音乐上传:支持 “无损音频(FLAC/WAV)+ 歌词文件(LRC)+ 专辑封面” 上传,填写 “歌曲信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值