博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CF868F Yet Another Minimization Problem(决策单调性)
阅读量:6692 次
发布时间:2019-06-25

本文共 1226 字,大约阅读时间需要 4 分钟。

题目描述:给定一个序列,要把它分成k个子序列。每个子序列的费用是其中相同元素的对数。求所有子序列的费用之和的最小值。

输入格式:第一行输入n(序列长度)和k(需分子序列段数)。下一行有n个数,序列的每一个元素。

输出格式:输出一个数,费用和的最小值。

2<=n<=10^5,2<=k<=min(n,20),序列的每一个元素值大于等于1,小于等于n。

 

决策单调性到底是个什么神仙……

这题用分治做决策单调性……

问题是我连题解都看不懂……

米娜桑自己看题解吧,如果有会了的麻烦教我一下……->

1 //minamoto 2 #include
3 #include
4 #include
5 #define ll long long 6 using namespace std; 7 #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++) 8 char buf[1<<21],*p1=buf,*p2=buf; 9 inline int read(){10 #define num ch-'0'11 char ch;bool flag=0;int res;12 while(!isdigit(ch=getc()))13 (ch=='-')&&(flag=true);14 for(res=num;isdigit(ch=getc());res=res*10+num);15 (flag)&&(res=-res);16 #undef num17 return res;18 }19 const int N=1e5+5;20 int a[N],c[N],n,k;21 ll ff[N],gg[N],*f=ff,*g=gg;22 void solve(int l,int r,int kl,int kr,ll w){23 if(l>r) return;24 int m=l+r>>1,k=0,p=m
f[i]+w?g[m]=f[i]+w,k=i:0;27 for(int i=kl;i<=p;++i) w+=c[a[i]]++;28 for(int i=l;i<=m;++i) w-=--c[a[i]];29 solve(l,m-1,kl,k,w);30 for(int i=l;i<=m;++i) w+=c[a[i]]++;31 for(int i=kl;i

 

转载于:https://www.cnblogs.com/bztMinamoto/p/9551214.html

你可能感兴趣的文章
属性化字符串问题集
查看>>
Windows 2012 下如何强制同步 AD SYSVOL
查看>>
Java AtomicInteger的用法
查看>>
利用公有云平台构建网站项目总结
查看>>
php 与 C# 之间的DES加解密
查看>>
NetApp DataONTAP 集群模式 学习笔记2
查看>>
网络营销的优势
查看>>
允许java运行不安全或不可信的应用程序
查看>>
Java为Hyperledger Fabric(超级账本)开发区块链链代码智能合约之环境部署
查看>>
思科三层网络设计公式
查看>>
Groovy基本类型与运算符
查看>>
rabbitmq java.util.concurrent.TimeoutException
查看>>
IPsec***
查看>>
sql语句优化的十二条建议
查看>>
《数据库系统概念》5-连接、视图和事务
查看>>
那些亮瞎你的奇葩癖好!别再说程序猿不会玩了
查看>>
memcached安装与应用
查看>>
AWS举行AI大会re:MARS 焦点ML、自动化、机器人和太空科学
查看>>
Python正则表达式初识(四)
查看>>
构建LVS负载均衡群集
查看>>