因为最近学了Splay,刚看到这个题目总共四种操作,把某个数移到另一个数的左边 或者右边 交换两个数 翻转整个序列,马上想到用Splay,因为总点数和总操作数都为10^5,如果用Splay把操作优化到logN级别,应该是可以再1sec过得。

于是我就好心急的在那里敲Splay,敲着敲着就发现不对劲了,题目要求的把x移到y的左边或者右边 或者交换x和y的值,不是指序列的第x位和y位,而是就直接指数值为x和y的那两个数。所以Splay根本就不适用

所以还是回到链表来,其实用链表也挺简单的,一开始我还想复杂了,每个x和y就固定对应自己的节点x,y,进行4个操作的时候,前三个,只要把节点x和节点y连起来或者交换即可,当然要处理好彼此的前缀和后继。然后最后一个翻转整个序列操作,其实就是把每个点的前缀变后继 后继变前缀即可。所以一开始不要固定前缀和后继,用个ch[2],再设置个p变量,初始设为0,这样 ch[p]代表前缀,ch[!p]代表后缀。当出现翻转操作,把p变一下,就直接实现了前变后 后变前的作用。

还要注意添加 0点和 n+1点来预防越界操作,而且0点和n+1还可以作为整个序列的头部,因为对这两个点是不会有操作的,所以最后遍历链表的时候,看p的值选择0或者n+1点作为序列头部,至此,完美解决此题。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 100010
using namespace std;
int n,m,p;
struct node
{
int ch[];
} num[N];
void link(int a,int b)
{
num[b].ch[p]=a;
num[a].ch[!p]=b;
}
int main()
{
int kase=,x,y,d;
while (scanf("%d%d",&n,&m)!=EOF)
{
p=;
for (int i=;i<=n;i++)
{
link(i,i+);
}
for (int i=;i<m;i++)
{
scanf("%d",&d);
if (d==)
{
p^=;
continue;
}
scanf("%d%d",&x,&y);
if (d==)
{
if (num[y].ch[p]==x)
continue;
else
{
link(num[x].ch[p],num[x].ch[!p]);
int tmp=num[y].ch[p];
link(tmp,x);
link(x,y);
}
}
if (d==)
{
if (num[y].ch[!p]==x)
continue;
link(num[x].ch[p],num[x].ch[!p]);
int tmp=num[y].ch[!p];
link(y,x);
link(x,tmp);
}
if (d==)
{
if (num[x].ch[p]==y)
{
int tmp=num[x].ch[!p];
link(num[y].ch[p],x);
link(x,y);
link(y,tmp);
continue;
}
if (num[x].ch[!p]==y)
{
int tmp=num[x].ch[p];
link(x,num[y].ch[!p]);
link(y,x);
link(tmp,y);
continue;
}
int tmp1=num[y].ch[p];
int tmp2=num[y].ch[!p];
link(num[x].ch[p],y);
link(y,num[x].ch[!p]);
link(tmp1,x);
link(x,tmp2);
}
}
int sta;
if (p) sta=n+;
else sta=;
int cur=;
p^=;
long long ans=;//结果可能超过int,所以用64位来表示
for (int i=sta;;)
{
i=num[i].ch[p];
cur++;
if (cur>n) break;
if (cur&)
{
ans+=(long long)i;
}
}
printf("Case %d: %lld\n",++kase,ans);
}
return ; }

UVA 12657/COJ 1329 HN第九届省赛 链表模拟的更多相关文章

  1. nyoj1273 河南省第九届省赛_"宣传墙"、状压DP+矩阵幂加速

    宣传墙 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 ALPHA 小镇风景美丽,道路整齐,干净,到此旅游的游客特别多.CBA 镇长准备在一条道路南 面 4*N 的墙上做 ...

  2. NYOJ 1272 表达式求值 第九届省赛 (字符串处理)

    title: 表达式求值 第九届省赛 nyoj 1272 tags: [栈,数据结构] 题目链接 描述 假设表达式定义为: 1. 一个十进制的正整数 X 是一个表达式. 2. 如果 X 和 Y 是 表 ...

  3. 河南省acm第九届省赛--《表达式求值》--栈和后缀表达式的变形--手速题

    表达式求值 时间限制:1000 ms | 内存限制:65535 KB 难度:3   描述 假设表达式定义为:1. 一个十进制的正整数 X 是一个表达式.2. 如果 X 和 Y 是 表达式,则 X+Y, ...

  4. UVA 12663 第九届省赛 高桥与低桥 线段树

    题意很简单,n个桥的高度是事先给出来的,然后有m次涨水与落水的高度,问有多少座桥在这m次涨落之后 被淹超过了k次,如果某桥本身被水淹了,此时再涨水,就不能算多淹一次 看下数据10的五次方,10的五次方 ...

  5. ZOJ 3606 Lazy Salesgirl 浙江省第九届省赛

    Lazy Salesgirl Time Limit: 5 Seconds      Memory Limit: 65536 KB Kochiya Sanae is a lazy girl who ma ...

  6. ZOJ 3601 Unrequited Love 浙江省第九届省赛

    Unrequited Love Time Limit: 16 Seconds      Memory Limit: 131072 KB There are n single boys and m si ...

  7. NYOJ--1276--机器设备(河南省第九届省赛,简单的bfs)

    机器设备 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 Alpha 公司设计出一种节能的机器设备.它的内部结构是由 N 个齿轮组成.整个机器设备有 一个驱动齿轮,当 ...

  8. SD第九届省赛B题 Bullet

    Bullet Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Description In G ...

  9. 蓝桥杯第九届省赛 sscanf(),str.c_str()函数的使用

    标题:航班时间 [问题背景]小h前往美国参加了蓝桥杯国际赛.小h的女朋友发现小h上午十点出发,上午十二点到达美国,于是感叹到“现在飞机飞得真快,两小时就能到美国了”. 小h对超音速飞行感到十分恐惧.仔 ...

随机推荐

  1. Jackson学习笔记

    老版本的Jackson使用的包名为org.codehaus.jackson,而新版本使用的是com.fasterxml.jackson. Jackson主要包含了3个模块: jackson-core ...

  2. linux 查看运行进程详细信息

    Linux在启动一个进程时,系统会在/proc下创建一个以PID命名的文件夹,在该文件夹下会有我们的进程的信息 通过ll或ls –l命令即可查看. ll /proc/PID cwd符号链接的是进程运行 ...

  3. H5页面,华为手机打开不加载JS的问题

    今天在做H5页面放在其他手机上面都可以刷出列表,但是就是放在华为手机上面刷不出来,怎么想都想不通,后面主管说华为手机的浏览器是严格遵守H5什么鬼东西的,然后其他浏览器做到比较好的,如果有报错就帮我们解 ...

  4. P1042 字符统计

    P1042 字符统计 转跳点:

  5. P1050 螺旋矩阵

    P1050 螺旋矩阵 转跳点:

  6. HDU - 1394 Minimum Inversion Number(线段树求逆序数---点修改)

    题意:给定一个序列,求分别将前m个数移到序列最后所得到的序列中,最小的逆序数. 分析:m范围为1~n,可得n个序列,求n个序列中最小的逆序数. 1.将序列从头到尾扫一遍,用query求每个数字之前有多 ...

  7. 中兴获25个5G商用合同

    网易科技讯,6 月 25 日消息,在 2019 年 MWC 上海展期间,中兴通讯宣布随着全球首批 5G 规模商用部署展开,已在全球获得 25 个 5G 商用合同,覆盖中国.欧洲.亚太.中东等主要 5G ...

  8. NRF51822和NRF52832的主要区别

    对于NRF51822和NRF52832的选择性相信大家也是非常困惑的,哪个性价比高?下面为大家讲下NRF51822和NRF52832的一个区别,让大家能够更好的快速选型加快研发产品进度!   主要分为 ...

  9. 分享一个简单的C#的通用DbHelper类(支持数据连接池)

    每次新项目的时候,都要从头去找一遍数据库工具类.这里分享一个简单实用的C#的通用DbHelper工具类,支持数据连接池. 连接池配置 <connectionStrings> <add ...

  10. 093-PHP数组比较

    <?php $arra=array('hello','hi'); //定义多个数组 $arrb=array(1=>'hi',0=>'hello'); $arrc=array(1,2) ...