洛谷题目链接:[POI2007]TET-Tetris Attack

题目描述

A puzzle called "Tetris Attack" has lately become a very popular game in Byteotia. The game itself is highlysophisticated, so we shall only introduce its simplified rules: the player is given a stack of \(2n\) elements, placedone on another and marked with \(n\) different symbols. Exactly two elements of the stack are marked with eachsymbol. A player's move consists in swapping two neighbouring elements, ie. interchanging them. If, as aresult of the swap, there are some two neighbouring elements marked with the same symbol, they are bothremoved from the stack. Then all the elements that have been above them fall down in consequence and mayvery well cause another removals. The player's goal is emptying the stack in the least possible number ofmoves.

TaskWrite a programme that:

reads the description of the initial stack content from the standard input, finds a solution with the minimum number of moves possible, writes out the outcome to the standard output.

给定一个长度为2n的序列,1~n各出现两次,可以交换相邻两项,两个同样的数放在一起会对消,求把所有数对消的最小交换次数。

温馨提示,输出方案。

输入输出格式

输入格式:

In the first line of the standard input there is one integer \(n\), \(1\le n\le 50\ 000\).

The following \(2n\) lines describe theinitial content of the stack. The \((i+1)\)'th line contains one integer \(a_i\) -the symbol which the \(i\)'th (\(1\le a_i\le n\))element from the bottom is marked with. Each symbol appears in the stack exactly twice. Moreover, notwo identical symbols neighbour initially. The test data is well chosen so that a solution with no more than \(1\ 000\ 000\) moves exists.

输出格式:

A solution with the minimum number of moves possible should be written out to the standard output asfollows. The first line should contain one integer \(m\) -the minimum number of moves. The following \(m\) should describe the optimal solution itself, i.e. a sequence of \(m\) integers \(p_1,\cdots,p_m\)​), one in each line. \(p_i\) denotes that in \(i\)'th move the player has chosen to swap the \(p_i\)'th and \((p_i+1)\)'th elements from the bottom.

If more than one optimal solution exists, your programme should write out any one of them.

输入输出样例

输入样例#1:

5

5

2

3

1

4

1

4

3

5

2

输出样例#1:

2

5

2

说明

SPJ返回WA:Something Left为方案错误

温馨提示,输出方案。


一句话题意: 给定一个长度为\(2n\)的序列,\(1\)~\(n\)各出现两次,可以交换相邻两项,两个同样的数放在一起会对消,求把所有数对消的最小交换次数.


题解: 先直接讲做法吧:

直接从\(1\)到\(2n\)读入每个值,当这个值第一次出现就向树状数组这个位置+1,并记录下这个值第一次出现的位置. 当这个值第二次出现的时候计算这个值与它上一次出现的位置之间加入进的值,并把上一次修改的位置-1.

那么这个方法为什么是正确的呢? (其实我自己做这道题的时候也是大力猜的结论233)

我们可以简单证明一下(可能有点伪证的成分,感性理解一下):

如果我们要使两个相同的数字合并,那么这两个数字中间的数字一定要合并.

所以这样在我们第二遍扫到一个数字的时候,要合并这个数字,就至少要将这个数字之间的数字都合并掉.

然而在树状数组中这个区间内只会有只出现过一次的数字,因为如果有还没计算的数字,就会在前面的循环中扫到.

这样的话为了让这个数字能合并,至少需要让它与之前每一个数字交换一次,不然一定会有数字夹在这两个数字中间导致不能消掉这个数字.

所以这样算出来的答案是可以保证最优的

然后在输出方案的时候就每次算出距离就可以了,可以自己想一下怎么模拟算位置.

#include<bits/stdc++.h>
using namespace std;
const int N=50000+5; int n, c[N*2], ans = 0, pos[N], stk[N*100], top = 0, res, size = 0, p; int lowbit(int x){ return -x & x; }
void update(int x,int val){ for(;x<=n*2;x+=lowbit(x)) c[x] += val; } int query(int x){
int res;
for(res = 0;x;x-=lowbit(x)) res += c[x];
return res;
} int main(){
int x; scanf("%d", &n);
for(int i=1;i<=n*2;i++){
scanf("%d", &x);
if(pos[x]){
update(pos[x], -1), res = query(i)-query(pos[x]-1);
ans += res, p = i;
while(res > 0) stk[++top] = p-size-1, p--, res--;
size += 2;
}
else pos[x] = i, update(i, 1);
}
printf("%d\n", ans);
for(int i=1;i<=top;i++) printf("%d\n", stk[i]);
return 0;
}

[洛谷P3460] [POI2007]TET-Tetris Attack的更多相关文章

  1. [洛谷3457][POI2007]POW-The Flood

    洛谷题目链接:[POI2007]POW-The Flood 题意翻译 Description 你手头有一张该市的地图.这张地图是边长为 m∗n 的矩形,被划分为m∗n个1∗1的小正方形.对于每个小正方 ...

  2. 洛谷P3459 [POI2007]MEG-Megalopolis(树链剖分,Splay)

    洛谷题目传送门 正解是树状数组维护dfn序上的前缀和,这样的思路真是又玄学又令我惊叹( 我太弱啦,根本想不到)Orz各路Dalao 今天考了这道题,数据范围还比洛谷的小,只有\(10^5\)(害我复制 ...

  3. 洛谷P3459 [POI2007]MEG-Megalopolis [树链剖分]

    题目传送门 MEG 题目描述 Byteotia has been eventually touched by globalisation, and so has Byteasar the Postma ...

  4. 洛谷 P3462 [POI2007]ODW-Weights

    题面: https://www.luogu.org/problemnew/show/P3462 https://www.lydsy.com/JudgeOnline/problem.php?id=111 ...

  5. 洛谷 P3456 [POI2007]GRZ-Ridges and Valleys

    P3456 [POI2007]GRZ-Ridges and Valleys 题意翻译 给定一个地图,为小朋友想要旅行的区域,地图被分为n*n的网格,每个格子(i,j) 的高度w(i,j)是给定的.若两 ...

  6. 洛谷 P3455 [POI2007]ZAP-Queries (莫比乌斯函数)

    题目链接:P3455 [POI2007]ZAP-Queries 题意 给定 \(a,b,d\),求 \(\sum_{x=1}^{a} \sum_{y=1}^{b}[gcd(x, y) = d]\). ...

  7. 洛谷P3459 [POI2007]MEG-Megalopolis [2017年6月计划 树上问题02]

    [POI2007]MEG-Megalopolis 题目描述 Byteotia has been eventually touched by globalisation, and so has Byte ...

  8. 【刷题】洛谷 P3455 [POI2007]ZAP-Queries

    题目描述 Byteasar the Cryptographer works on breaking the code of BSA (Byteotian Security Agency). He ha ...

  9. 洛谷P3457 [POI2007]POW-The Flood [并查集,模拟]

    题目传送门 pow 题意翻译 Description 你手头有一张该市的地图.这张地图是边长为 m∗n 的矩形,被划分为m∗n个1∗1的小正方形.对于每个小正方形,地图上已经标注了它的海拔高度以及它是 ...

随机推荐

  1. HDU 3062 Party(2-SAT模版题)

    Problem Description 有n对夫妻被邀请参加一个聚会,因为场地的问题,每对夫妻中只有1人可以列席.在2n 个人中,某些人之间有着很大的矛盾(当然夫妻之间是没有矛盾的),有矛盾的2个人是 ...

  2. matlab 直方图均衡化(含rgb)

    步骤: 统计原图像素每个像素的个数 统计原图像<每个灰度级的像素的累积个数 家里灰度级得映射规则 将原图每个像素点的灰度映射到新图 代码: clear all I=imread('1.jpg') ...

  3. 后端设置cookie写不到前端页面

    javax.servlet.http.Cookie cookie = new javax.servlet.http.Cookie("id",session.getId()); co ...

  4. 个人github blog环境设置

    每个人都想拥有自己的网站,但是大部分比较屌丝,不想花钱租赁服务器,哈哈,屌丝有屌丝办法.github应该都听说过吧,github.io提供了此功能,而且使用github来管理自己的代码,如果你有域名, ...

  5. 微信小程序项目笔记以及openId体验版获取问题

    公司一直说要搞小程序,说了几个月,最近才算落地,一个很小的项目,就结果来讲,勉强让自己窥得小程序门径. 下面总结一下,为了弄好小程序,所学到的知识,以及项目中遇到的问题以及解决的办法.纯属个人见解. ...

  6. C#中Console.ReadLine()和Console.Read()有何区别?

    Console.Read 表示从控制台读取字符串,不换行. Console.ReadLine 表示从控制台读取字符串后进行换行. Console.Read() Console.ReadLine()方法 ...

  7. C语言100例02 PHP版(练习)

    问题: 企业发放的奖金根据利润提成. 利润(I)低于或等于10万元时,奖金可提10%: 利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%: 20万到 ...

  8. ErrorUnable to tunnel through proxy. Proxy returns HTTP1.1 400 Bad Reques

    导入项目的时候,一般会出现这种错误,因为我们的gradle版本,不对,所以默认AS导入后,回去下载你需要的gradle,所以很慢, 先打开:项目路径底下的\gradle\wrapper\gradle- ...

  9. Maven面试宝典

    一.Maven有哪些优点和缺点 优点如下: 简化了项目依赖管理: 易于上手,对于新手可能一个"mvn clean package"命令就可能满足他的工作 便于与持续集成工具(jen ...

  10. [计算机网络-传输层] 面向连接的传输:TCP

    参考:http://blog.csdn.net/macdroid/article/details/49070185 在学习TCP之前我们先来看一下可靠数据传输需要提供什么样的机制: ·差错检测机制:检 ...