XJOI网上同步训练DAY1 T3

时间:2022-12-18 02:01:45

XJOI网上同步训练DAY1 T3

XJOI网上同步训练DAY1 T3

思路:一开始看到这题的时候想DP,可是发现貌似不行。。因为有前缀也有后缀,而且有的后缀会覆盖到现在的前缀,这就不满足无后效性了啊!

但是有个很巧妙的思路:如果我们知道a[i]的最大值,那么p的数量和q的数量也确定了。所以序列长度也确定了,设m为序列长度。

而且对于每个a[i]都代表了一个固定数量的p和q和长度。

因此,长度大于m/2的前缀,我们可以用总的p和总的q减去它,转换成小于等于m/2长度的前缀后缀。

这样我们可以设计DP为f[i][j][k],代表从左往右i个中有j个p,从右往左i个有k个p,这样f[(m+1)/2]的位置就是最终答案!

注意要记录一个pre数组记录这个状态的最优解是从哪个位置转移过来的。

 #include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#define ll long long
ll a[];
const ll PW=;
const ll QW=;
int c[][],n,pre[][][][],w[][],f[][][];
int ans[],cn;
int read(){
char ch=getchar();int t=,f=;
while (ch<''||''<ch){if (ch=='-') f=-;ch=getchar();}
while (''<=ch&&ch<=''){t=t*+ch-'';ch=getchar();}
return t*f;
}
void init(){
n=read();
for (int i=;i<n;i++){
double x;scanf("%lf",&x);
a[i]=(ll)(x*+0.5);
}
}
void solve(){
int mxpos=;
for (int i=;i<n;i++){
if (a[i]>a[mxpos]) mxpos=i;
}
int totp=-,totq=-;
for (int i=;(ll)i*PW<=a[mxpos];i++)
if ((a[mxpos]-(ll)i*PW)%QW==){
totp=i;
totq=(int)((a[mxpos]-(ll)i*PW)/QW);
break;
}
for (int i=;i<n;i++){
int p=-,q=-;
for (int j=;(ll)j*PW<=a[i];j++)
if ((a[i]-(ll)j*PW)%QW==){
p=j;
q=(int)((a[i]-(ll)j*PW)/QW);
break;
}
if (p!=-&&p+q<=totp+totq){
c[cn][]=p;
c[cn][]=q;
cn++;
}
}
int m=totp+totq;
for (int i=;i<cn;i++){
if (c[i][]+c[i][]<=m/){
w[c[i][]+c[i][]][c[i][]]++;
}else{
w[m-c[i][]-c[i][]][totq-c[i][]]++;
}
}
f[][][]=;
for (int i=;i<=m/;i++)
for (int j=;j<=i;j++)
for (int k=;k<=i;k++){
int s=-;
for (int p=;p<=;p++){
for (int q=;q<=;q++){
if (j-p>=&&j-p<i&&k-q>=&&k-q<i&&f[i-][j-p][k-q]>s){
s=f[i-][j-p][k-q];
pre[i][j][k][]=p;
pre[i][j][k][]=q;
}
}
}
f[i][j][k]=s+w[i][j]+((k==j)?:w[i][k]);
}
int ansi=-,ansj=-,ansk=-;
for (int k=;k<=m%;k++)
for (int i=;i<=m/;i++){
int j=totq-k-i;
if (j>=&&j<=m/&&(ansi==-||f[m/][i][j]>f[m/][ansi][ansj])){
ansi=i;
ansj=j;
ansk=k;
}
}
if (m%) ans[m/]=ansk;
for (int i=m/;i>;i--){
int p=pre[i][ansi][ansj][];
int q=pre[i][ansi][ansj][];
ans[i-]=p;
ans[m-i]=q;
ansi-=p;
ansj-=q;
}
for (int i=;i<m;i++)
if (ans[i]) printf("Q");
else printf("P");
}
int main(){
init();
solve();
}

XJOI网上同步训练DAY1 T3的更多相关文章

  1. XJOI网上同步训练DAY5 T3

    就是对于一个数,我们去考虑把t*****减到(t-1)9999*的代价. #include<cstdio> #include<cmath> #include<algori ...

  2. XJOI网上同步训练DAY1 T2

    思路:似曾相识?...见http://www.cnblogs.com/qzqzgfy/p/5266874.html 一看时限还是4s!,于是就开开心心地打了70%的分,就是用容斥原理,就可以n^3解决 ...

  3. XJOI网上同步训练DAY1 T1

    思路:我们考虑由于没有人的区间会覆盖其他人,所以我们将区间按左端点排序,发现如果地盘长度已知,可以贪心地尽量往左放,来判断是否有解,因此做法很简单,就是二分答案,然后O(n)贪心判定,复杂度为O(nl ...

  4. XJOI网上同步测试DAY14 T3

    思路:tarjan把桥找出来,然后缩点,注意这里的缩点是:如果两个点之间的连边不是桥,那么就把他们缩起来,然后用一个lct维护,对于每个询问,如果官道连接的是两个联通块的话,就把他们连起来,否则我们就 ...

  5. XJOI网上同步训练DAY6 T2

    思路:记得FJ省队集训好像有过这题,可是我太弱了,根本不懂T_T #include<cstdio> #include<iostream> #include<cmath&g ...

  6. XJOI网上同步训练DAY6 T1

    思路:考试的时候直接想出来了,又有点担心复杂度,不过还是打了,居然是直接A掉,开心啊. 我们发现,Ai<=7,这一定是很重要的条件,我们考虑状态压缩,去枚举路径中出现了哪些数字,然后我们把原来n ...

  7. XJOI网上同步训练DAY5 T1

    思路:考虑得出,最终的集合一定是gcd=1的集合,那么我们枚举n个数中哪个数必须选,然后把它质因数分解,由于质数不会超过9个,可以状态压缩,去得出状态为0的dp值就是答案. #include<c ...

  8. XJOI网上同步训练DAY3 T2

    考试的时候已经想出来怎么做了,但是没有时间打了T_T 思路:我们考虑将询问以lim排序,然后树链剖分,把边作为线段树的节点,然后随着询问lim的增大,改变线段树中节点的信息,然后每次询问我们用树链剖分 ...

  9. XJOI网上同步训练DAY3 T1

    思路:看来我真是思博了,这么简单的题目居然没想到,而且我对复杂度的判定也有点问题.. 首先我们选了一个位置i的b,那一定只对i和以后的位置造成改变,因此我们可以这样看: 我们从前往后选,发现一个位置的 ...

随机推荐

  1. 微信公众号入门学习1&lowbar;使用C&num;,ASP&period;NET APIController如何公众号接入服务器并启动开发者模式

    前言:  本文是以微信公众号中的订阅号(个人)来进行简单介绍,本人也是刚刚开始学习,有不足之处,欢迎批评指正. 先粘贴2个帮助链接: 入门指引:http://mp.weixin.qq.com/wiki ...

  2. CodeBlock

    CodeBlock官网是: http://www.codeblocks.org/ 选择Download the binary release: 根据自己电脑的情况选择想要的版本:(以博主电脑为例,wi ...

  3. Linux收集

    1.rsync快速删除文件 rsync --delete -avH /empty /rmdir 选项说明: –delete-before 接收者在传输之前进行删除操作 –progress 在传输时显示 ...

  4. UIScrollView的滚动位置设置

    1.如果手动设置滚动异常,可以从最小值到最大值,极限调试.最小值取一个,中间值取n个,最大值取一个.

  5. DataSet&period;Clear Method &lpar;&rpar;

    Clears the DataSet of any data by removing all rows in all tables. 需要注意的是这个方法不会清空DataSet中的DataTable, ...

  6. Service代码示例

    package com.homily.training.service; import android.app.Service; import android.content.Intent; impo ...

  7. Java&lowbar;Web 连接池

    对于共享资源,有一个很著名的设计模式:资源池(Resource Pool).该模式正是为了解决资源的频繁分配﹑释放所造成的问题.为解决我们的问题,可以采用数据库连接池技术.数据库连接池的基本思想就是为 ...

  8. javascript实现的功能--二级联动

    <head> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8&quot ...

  9. Xcode Could not load NIB 的一个问题解决

    # Could not load NIB 的一个问题 html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pr ...

  10. android四大组件学习总结以及各个组件示例&lpar;2&rpar;

    上篇博文讲解了activity.content provider,此篇博文来仔细总结service.broadcast receiver: 3. Service >什么是服务?>windo ...