题目:

给你一个01串,现在你可以(或者不用)选取其中一个元素进行一次反转操作0-1,1-0;从而使得串中的逆序对个数最多。

题目链接:codeforce origin problem

思路:
1. 如何统计逆序对的个数?
  • 从后向前扫描,定义zero,记录0的个数,如果遇到1,则逆序对增加的个数就等于的此时zero。
点击查看代码
vector<int>a;
ll f(decltype(a)& d)
{
ll zero = 0, sum = 0;
rfor(i, d.size() - 1, 0)
{
//cout << d[i] << " ";
if ( d[i] == 0 )
zero++;
else sum += zero;
}
return sum;
}
2.如何进行一次反转使得逆序对个数最多?
  • 我们考虑0-1反转,让逆序对数量更多,则应该让下标最小的0filp为1,这样子,逆序对个数最多。

  • 我们考虑1-0反转,让逆序对数量更多,则应该让下标最小的1filp为0,这样子,逆序对个数最多。

AC代码

//注意事项:记得开longlong,避免溢出

// 其次,不用经过反转01,可能已经是最大的了,需要先做记录

vector<int>a;
ll f(decltype(a)& d)
{
ll zero = 0, sum = 0;
rfor(i, d.size() - 1, 0)
{
//cout << d[i] << " ";
if ( d[i] == 0 )
zero++;
else sum += zero;
}
return sum;
}
void solve()
{
ll n;
cin >> n;
a.resize(n);
ifor(i, 0, n - 1)
{
cin >> a[i];
}
ll res;
res = f(a);
ifor(i, 0, n - 1)
{
if ( a[i] == 0 )
{
a[i] = 1;
ll s1 = f(a);
res = max(s1, res);
a[i] = 0;
break;
}
}
rfor(i, n-1, 0)
{
if ( a[i] == 1 )
{
a[i] = 0;
ll s1 = f(a);
res = max(s1, res);
a[i] = 1;
break;
}
}
cout << res<<endl;
a.clear();
}
int main(int args, char** argv)
{
/*ios::sync_with_stdio(false);
cin.tie(nullptr);
cin.tie(nullptr);*/
long t;
cin >> t;
while ( t-- )
{
solve();
}
return 0;
}

最新文章

  1. SQL Server Replication issues-the row was not found at the subscriber end
  2. CentOS关机
  3. delphi的取整函数round、trunc、ceil和floor
  4. PHP读取Excel文件内容
  5. [CareerCup] 3.5 Implement Queue using Two Stacks 使用两个栈来实现队列
  6. Step
  7. ps aux 查看进程信息
  8. Spring实战2:装配bean—依赖注入的本质
  9. Understanding node.js
  10. 数据库的应用——直接从内存中读取osg节点 (转)
  11. What is the difference between supervised learning and unsupervised learning?
  12. Linux(ubuntu)下安装JDK、Tomcat
  13. MATLAB基础入门笔记
  14. ios应用,今年最蛋疼的6月,IPV6!!
  15. updatepanel的用法之triggers
  16. Confluence 6 附件是如何被索引的
  17. Linux 编程笔记(四)
  18. Eclipse里的代码光标变成一个黑色块
  19. Maven 系列 一 :Maven 快速入门及简单使用
  20. UVaLive 3353 Optimal Bus Route Design (最小费用流)

热门文章

  1. 使用Docker方式部署Mongodb多副本集(replSet)
  2. elk使用微信ElartAlert企业微信告警,自定义告警内容
  3. 03_配置Java环境变量
  4. CAS核心思想、底层实现
  5. DeepHyperX代码理解-HamidaEtAl
  6. HM VNISEdit2.0.3修正版
  7. 关于pwd命令小技巧-确认当前工作目录的绝对路径中是否包含软链接目录名
  8. spring boot集成redis基础入门
  9. 2022-08-14-esp32把玩记-③_轻轻松松显示个二维码(esp32+ssd1306显示图片)
  10. vue+spirngboot 分离技术实现图书信息的增删改查(改造这学期的课程设计【1】)