Luogu 2147 洞穴勘测 - LCT

Solution

$LCT$ 打上 $cut$ , $link$ 和 $finroot$ 即可

 

Code

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<algorithm>
  4 #define rd read()
  5 using namespace std;
  6 
  7 const int N = 1e4 + 5;
  8 
  9 int n, m;
 10 
 11 int read() {
 12     int X = 0, p = 1; char c = getchar();
 13     for (; c > '9' || c < '0'; c = getchar())
 14         if (c == '-') p = -1;
 15     for (; c >= '0' && c <= '9'; c = getchar())
 16         X = X * 10 + c - '0';
 17     return X * p;
 18 }
 19 
 20 namespace LCT {
 21     int f[N], ch[N][2], tun[N];
 22 #define lc(x) ch[x][0]
 23 #define rc(x) ch[x][1]
 24     
 25     int isroot(int x) {
 26         return rc(f[x]) != x && lc(f[x]) != x;
 27     }
 28 
 29     int get(int x) {
 30         return rc(f[x]) == x;
 31     }
 32 
 33     void rev(int x) {
 34         swap(lc(x), rc(x));
 35         tun[x] ^= 1;
 36     }
 37 
 38     void pushdown(int x) {
 39         if (tun[x]) {
 40             if (lc(x)) rev(lc(x));
 41             if (rc(x)) rev(rc(x));
 42             tun[x] = 0;
 43         }
 44     }
 45 
 46     void pd(int x) {
 47         if (!isroot(x))
 48             pd(f[x]);
 49         pushdown(x);
 50     }
 51     
 52     void rotate(int x) {
 53         int old = f[x], oldf = f[old], son = ch[x][get(x) ^ 1];
 54         if (!isroot(old)) ch[oldf][get(old)] = x;
 55         ch[x][get(x) ^ 1] = old;
 56         ch[old][get(x)] = son;
 57         f[old] = x; f[x] = oldf; f[son] = old;
 58     }
 59 
 60     void splay(int x) {
 61         pd(x);
 62         for (; !isroot(x); rotate(x))
 63             if (!isroot(f[x]))
 64                 rotate(get(f[x]) == get(x) ? f[x] : x);
 65     }
 66 
 67     void access(int x) {
 68         for (int y = 0; x; y = x, x = f[x])
 69             splay(x), ch[x][1] = y;
 70     }
 71 
 72     void mroot(int x) {
 73         access(x); splay(x); rev(x);
 74     }
 75 
 76     int findr(int x) {
 77         access(x); splay(x);
 78         while(lc(x)) pushdown(x), x = lc(x);
 79         return x;
 80     }
 81 
 82     void split(int x, int y) {
 83         mroot(x); access(y); splay(y);
 84     }
 85     
 86     void cut(int x, int y) {
 87         split(x, y);
 88         f[x] = ch[y][0] = 0;
 89     }
 90 
 91     void link(int x, int y) {
 92         mroot(x);
 93         f[x] = y;
 94     }
 95 }using namespace LCT;
 96 
 97 int main()
 98 {
 99     n = rd; m = rd;
100     for (; m; m--) {
101         char op[10];
102         scanf("%s", op);
103         if (op[0] == 'Q') {
104             int u = rd, v = rd;
105             mroot(u); 
106             if (findr(v) != u)
107                 puts("No");
108             else puts("Yes");
109         }
110         if (op[0] == 'C') {
111             int u = rd,  v = rd;
112             link(u, v);
113         }
114         if (op[0] == 'D') {
115             int u = rd, v = rd;
116             cut(u, v);
117         }
118     }
119 }
View Code

 

转载于:https://www.cnblogs.com/cychester/p/9685971.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、付费专栏及课程。

余额充值