2141: 排队 - #include <Seter> - using namespace Orz;

2141: 排队

Seter posted @ 2011年12月27日 19:31 in BZOJ with tags BalancedTree SegTree Splay , 2785 阅读

http://www.zybbs.org/JudgeOnline/problem.php?id=2141

RunID User Problem Result Memory Time Language Code Length Submit Time
182939 Seter 2141 Accepted 9576 kb 1136 ms C/Edit 3633 B 2011-12-27 19:09:14

写了N天,花了N小时各种委以后决定换方法,然后写了1小时就A了……这题的数据范围暴力居然比树套树快T^T

动态维护逆序对数目。每次交换两个数。初始逆序对数归并排序暴力乱求,然后呢?

每次交换位于i,j上的两个数后,如果这两个数一样,那么等于没交换,否则呢?

最好自己想一想……(我一开始想错了,然后调了不下5个小时,囧)

考虑哪些数与Ai,Aj的逆序关系会变。1..i-1和j+1..n肯定是没有影响的(原来在前面还是在前面)。有影响的是(假设Ai<Aj):

1.Ai,Aj,会产生一组逆序对

2.A(i+1..j-1)。这里有五种情况,可以构造出来:2 1 2 3 4 5 4,交换A1,A7,可以发现A2..6中,1和5没变,2和4各产生一组逆序对,3产生两组。

即,A(i+1..j-1)中,等于Ai或Aj的数会产生/消除一个逆序对,大小在Ai和Aj之间的数会产生/消除两个逆序对。

Ai<Aj时全部是产生逆序对,Ai>Aj时全部是消除逆序对。

于是可以树状数组/线段树套平衡树……也可以暴力找(会掉RP)……

一开始写的是每个节点记录数值外再记录一个编号,这样可以保证没有相同节点,调了N天后发生了灵异事件……

我用自己写的maker弄了个小数据出来,死循环了……于是我在自己感觉可能委掉的地方加了个putchar('!')来观察是否运行到了这个地方,另外没动,结果不死循环了……但是换一组数据又死循环……有没有神犇知道这个是神马意思!?

最后写了相同的数值合并在一个节点里,写了个手动堆,1Y……88行,也许是我写过最长的程序了吧……

By Seter
331299064 说:
2012年1月24日 22:36

这题分成sqrt(n)块来也挺快的啦。。。

Avatar_small
Seter 说:
2012年1月25日 14:25

每块再用平衡树等维护?恩……


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter
Host by is-Programmer.com | Power by Chito 1.3.3 beta | © 2007 LinuxGem | Design by Matthew "Agent Spork" McGee