NOIP2013火柴排队
Solution
恕我直言,这题是真的坑。
对于这道题,一个很显然的思路是对于A B两个序列,他们交换完后相对的两个数在原序列中的相对大小是相同的,于是我们就把序列按照A排序,在把B离散化,求逆序对,诶,这题真水。
期望得分100,实际得分10。
WTF???我写挂了??
正解,将A,B分别排序,c[a[i].pos]=b[i].pos,再将c求一波逆序对。
为什么这样可以,而上一种做法不行?
随便举个栗子
2 4 5 6 1 3
3 4 1 6 5 2
这是离散化后的序列,我们固定A序列,让B序列动,那么对于B序列来说,3应当在第六个,4应当在2个,1应当在第五个,6应当在第四个,5应当在第三个,2应当在第一个。于是B序列就变成了
6 2 5 4 3 1
这就是正解的合理性,而错误解法通过直接排序,将相邻元素的相对顺序打乱了,导致求出的解一定是错的(但是样例都能过【喷血】)。
Code
#include<iostream>
#include<cstdio>
#include<algorithm>
#define mod 99999997
#define N 100009
using namespace std;
long long n,tot,tr[N],c[N];
long long ans;
struct de
{
long long a,b;
}a[N],b[N];
void add(int u)
{
while(u<=n)
{
tr[u]++;
tr[u]%=mod;
u+=u&-u;
}
}
long long q(int u)
{
long long an=;
while(u)
{
an+=tr[u];
u-=u&-u;
}
return an;
}
bool cmp(de a,de b)
{
return a.a<b.a;
}
int main()
{
scanf("%lld",&n);
for(int i=;i<=n;++i)
scanf("%lld",&a[i].a),a[i].b=i;
for(int i=;i<=n;++i)
scanf("%lld",&b[i].a),b[i].b=i;
sort(a+,a+n+,cmp);
sort(b+,b+n+,cmp);
for(int i=;i<=n;++i)
c[a[i].b]=b[i].b;
for(int i=;i<=n;++i)
{
(ans+=i-q(c[i])-)%=mod;
add(c[i]);
}
// for(int i=1;i<=n;++i)
// cout<<c[i]<<" ";
cout<<ans;
return ;
}
最后一句话
Think twice,code once
NOIP2013火柴排队的更多相关文章
- LOJ2609. NOIP2013 火柴排队 【树状数组】
LOJ2609. NOIP2013 火柴排队 LINK 题目大意: 给你两个数列,定义权值∑i=1(ai−bi)^2 问最少的操作次数,最小化权值 首先需要发现几个性质 最小权值满足任意i,j不存在a ...
- [树状数组+逆序对][NOIP2013]火柴排队
火柴排队 题目描述 涵涵有两盒火柴,每盒装有n根火柴,每根火柴都有一个高度.现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为:∑ (ai-bi)2,i=1,2,3,. ...
- NOIP2013火柴排队[逆序对]
题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: ∑(ai-bi)^2 其中 ai 表示 ...
- [NOIP2013] 火柴排队(归并排序)
题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: ∑(ai-bi)^2 其中 ai 表示 ...
- noip2013 火柴排队
题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: ∑(ai-bi)^2 其中 ai 表示 ...
- jzoj[1438]NOIP2013火柴排队
读题: 相邻两个火柴可以交换?两个火柴序列?嗅到了归并排序的味道. 读完题目之后,我们可以知道,如果想要交换次数最少,可以先固定一个序列不变,比如说a序列不变,变b序列 样例是 4 2 3 1 4 3 ...
- noip2013火柴排队_Solution
要想对任意(ai,bi)和(aj和bj),当ai<aj时,都有bi<=bj:当ai>=aj时,bi>=bj,当对a进行升序排序后(b同时发生改变,从而不改变值,最后有a1& ...
- NOIp2013 火柴排队【逆序对/思维】 By cellur925
题目大意:给你两列数\(ai\)和\(bi\),你可以交换每列数中相邻的两个数,求一个最小交换次数使\(\sum_{i=1}^{n}(a_i-b_i)^2\) 最小. 最后满足条件的两个序列一定是各个 ...
- NOIP 2013 火柴排队
洛谷 P1966 火柴排队 洛谷传送门 JDOJ 2227: [NOIP2013]火柴排队 D1 T2 JDOJ传送门 Description 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高 ...
随机推荐
- SQL not exist out join
sql中exists,not exists的用法 - 飞翔-方向 积累 沉淀 - 博客园http://www.cnblogs.com/mytechblog/articles/2105785.html ...
- CentOS查看和修改PATH环境变量的方法 profile
https://blog.csdn.net/dongheli/article/details/83987092
- 快速理解Git结构
git pull:拉取远程服务器最新代码到本地(会自动merge) git add:将本地代码添加到暂存区 git commit:将暂存区的所有内容提交到当前分支(git会自动为我们创建第一个分支 ...
- vue-router路由懒加载(解决vue项目首次加载慢)
懒加载:----------------------------------------------------? 也叫延迟加载,即在需要的时候进行加载,随用随载. 为什么需要懒加载? 像vue这种单 ...
- Mysql优化单表查询
借助explain分析SQL,判断该怎么建立索引. 还需要注意,有些情况会导致索引失效,用不上索引,应该优化SQL,应用上索引. 什么情况导致索引失效? 1.在索引列上做任何操作(计算.函数.类型转换 ...
- python之路--字典
一. 字典 字典是以key:value的形式来保存数据的,用{}表示 字典的增删改查 字典的增加 dic = {"意大利": "李云龙", "美国&q ...
- jenkins中通过execute shell启动的进程会被杀死的问题
在jenkins中配置自动更新部署项目时,如果采取用execute shell启动/关闭tomcat,会发现可以进行关闭tomcat, 但是无法启动tomcat,虽然构建会显示执行成功,但是查看进程, ...
- vue自定义组件及传值
1.使用 Vue.component() 方法注册组件 2.使用 props 属性传递参数 v-for="item in items": 遍历 Vue 实例中定义的名为 items ...
- java.lang.Exception: No tests found matching [{ExactMatcher:fDisplayName=fun2], {ExactMatcher:fDisplayName=fun2(cn.itcast.demo2.fun1)], {LeadingIdentifierMatcher:fClassName=cn.itcast.demo2.fun1,fLeadi
Junit报的错误, 在测试方法前面没有添加注解@Test
- 百度编辑器UEditor使用方法
http://www.cnblogs.com/lionden/archive/2012/07/13/ueditor.html 介绍图片上传:http://uikoo9.com/blog/detail/ ...