noip模拟赛#15

#15

T1:a[i]>=a[i/2]。输出a的最大字典序

=>可以发现这是二叉树的情况那么就先预处理出每个点有多少个儿子然后递归处理就可以了。

#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
using namespace std;
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define clr(x,c) memset(x,c,sizeof(x))
int read(){
    int x=0,f=1;char c=getchar();
    while(!isdigit(c)){
        if(c==‘-‘) f=-1;c=getchar();
    }
    while(isdigit(c)) x=x*10+c-‘0‘,c=getchar();
    return x;
}
const int nmax=1e5+5;
const int inf=0x7f7f7f7f;
int a[nmax],son[nmax],ans[nmax],n;
void dfs(int x,int l,int r){
    if(x>n) return ;ans[x]=a[l];
    dfs(x*2,r-son[x*2]+1,r);dfs(x*2+1,l+1,l+son[x*2+1]);
}
int main(){
    freopen("lazy.in","r",stdin);
    freopen("lazy.out","w",stdout);
    n=read();rep(i,1,n) a[i]=read();sort(a+1,a+n+1);
    dwn(i,n,1) son[i]=son[i*2]+son[i*2+1]+1;
    //rep(i,1,n) printf("%d ",son[i]);printf("\n");
    dfs(1,1,n);
    rep(i,1,n) printf("%d ",ans[i]);printf("\n");
    fclose(stdin);
    fclose(stdout);
    return 0;
}
/*
7
1 2 3 4 5 6 7
6
1 2 3 4 5 6
*/

  

T2:n:5e4,k=7 k维空间求曼哈顿距离的最远点对。

=>二维的情况下是O(N2K)的显然不行,然后我们可以根据2维的情况推广到k维的情况。复杂度是O(nk2^k)的。

#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
using namespace std;
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define clr(x,c) memset(x,c,sizeof(x))
#define ll long long
int read(){
    int x=0,f=1;char c=getchar();
    while(!isdigit(c)){
        if(c==‘-‘) f=-1;c=getchar();
    }
    while(isdigit(c)) x=x*10+c-‘0‘,c=getchar();
    return x*f;
}
const int nmax=5e4+5;
const int maxn=8;
const ll inf=1e17;
int a[nmax][maxn];bool vis[maxn];
int main(){
    freopen("escape.in","r",stdin);
    freopen("escape.out","w",stdout);
    int n=read(),k=read();rep(i,1,n) rep(j,1,k) a[i][j]=read();
    int all=(1<<k)-1;ll u,v,d,tmp,temp,cnt,ans=0;
    rep(i,0,all){
        u=inf;v=-inf;
        clr(vis,0);for(int eo=i,et=1;eo;eo>>=1,++et) vis[et]=eo&1;
        //printf("%d\n",i);
        //rep(j,1,k) printf("%d",vis[j]);printf("\n");
        rep(j,1,n){
            temp=0;
            rep(t,1,k) temp+=vis[t]?a[j][t]:-a[j][t];
            u=min(u,temp);v=max(v,temp);
            //printf("%d ",temp);
        }
        //printf("()\n");
        ans=max(ans,v-u);
    }
    printf("%lld\n",ans);
    fclose(stdin);fclose(stdout);
    return 0;
}

  

T3:n个数可以取出k个宽度为d的块。求最大值。取出后数的权值为0。

=>完全没有思路。。。正解好像是单调队列+dp?妈呀先留坑吧。。

=>发现一个奇怪的状态就是早操前想题总是可以很快的想出来。。。然后我就发现这道题不是傻叉单调队列和前缀和优化dp么。。。不要总是以为第三题不可做!

=>然后写了个暴力跑了跑造造数据跑了跑。。。嗯交。A了三个点。。。

=>于是我不服。。。想了想可能的原因:代码应该是不会写错的,那么应该就是题看错了。果然我没考虑右边界的情况。。。TAT

=>一定要看清楚题一定要看清楚题一定要看清楚题一定要看清楚题一定要看清楚题一定要看清楚提!

嗯扔代码:

#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
using namespace std;
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define clr(x,c) memset(x,c,sizeof(x))
int read(){
    int x=0,f=1;char c=getchar();
    while(!isdigit(c)){
        if(c==‘-‘) f=-1;c=getchar();
    }
    while(isdigit(c)) x=x*10+c-‘0‘,c=getchar();
    return x*f;
}
const int nmax=12330;
const int maxn=505;
const int inf=0x7f7f7f7f;
int dp[maxn][nmax],t[nmax],a[nmax],q[nmax];
int main(){
    freopen("bowling.in","r",stdin);
    freopen("bowling.out","w",stdout);
    int T=read();
    rep(_T,1,T){
        int n=read(),k=read(),w=read();
        rep(i,1,n) a[i]=read()+a[i-1];
        rep(i,n+1,n+w) a[i]=a[n];n+=w;
        rep(i,1,n) dp[1][i]=a[i]-a[max(i-w,0)];
        rep(i,1,n) t[i]=max(t[i-1],dp[1][i]);
        rep(i,2,k){
            int l=1,r=0;
            rep(j,1,n) {
                dp[i][j]=-inf;
                if(j>=w) dp[i][j]=max(dp[i][j],t[j-w]+a[j]-a[j-w]);
                if(l<=r&&q[l]<=j-w) ++l;
                while(l<=r&&dp[i-1][j]-a[j]>=dp[i-1][q[r]]-a[q[r]]) --r;
                q[++r]=j;
                dp[i][j]=max(dp[i][j],dp[i-1][q[l]]+a[j]-a[q[l]]);
            }
            rep(j,1,n) t[j]=max(t[j-1],dp[i][j]);
        }
        int ans=-inf;
        rep(i,0,n) ans=max(ans,dp[k][i]);
        printf("%d\n",ans);
    }
    fclose(stdin);fclose(stdout);
    return 0;
}

  

时间: 2024-11-03 03:28:05

noip模拟赛#15的相关文章

NOIP模拟赛 6.29

2017-6-29 NOIP模拟赛 Problem 1 机器人(robot.cpp/c/pas) [题目描述] 早苗入手了最新的Gundam模型.最新款自然有着与以往不同的功能,那就是它能够自动行走,厉害吧. 早苗的新模型可以按照输入的命令进行移动,命令包括‘E’.‘S’.‘W’.‘N’四种,分别对应东南西北.执行某个命令时,它会向对应方向移动一个单位.作为新型机器人,它可以执行命令串.对于输入的命令串,每一秒它会按命令行动一次.执行完命令串的最后一个命令后,会自动从头开始循环.在0时刻时机器人

【简单思考】noip模拟赛 NTR酋长

NTR酋长 (ntr.pas/.c/.cpp) 黄巨大终于如愿以偿的进入了czy的后宫中……但是czy很生气……他要在黄巨大走到他面前的必经之路上放上几个NTR酋长来阻挡黄巨大. 众所周知,NTR酋长有一个技能是沟壑(F).它会在地图上产生一条长长的障碍物阻挡人前进.Czy打算在一个n*m的矩形(必经之路?)中放上NTR酋长.NTR酋长要一个一个放下去,而且每放一个都会向四角倾斜的方向放出无限长的沟壑,而已经被沟壑挡住的地方就不能再放NTR酋长了. 请注意:不会出现沟壑的路径挡住另一个沟壑的情况

【noip模拟赛】 射击

这题似乎是什么安阳一中的模拟题,不管了,反正是学长出的noip模拟赛里面的题目.... 射击(shoot.pas/.c/.cpp) 时间限制:1s,内存限制128MB 题目描述: 据史书记载,对越反击战时期,有位中国侦察兵,他的代号叫814.一天他执行狙击任务,他的任务地区是n座恰巧在一条直线上的山.这些山所在直线恰巧为东西走向,山从东到西依次编号为1~n.一天814隐藏在编号为k的山上,每座山上都有1个目标. 814也非常的厉害,任务结束时杀了很多人,可是史书中只记载了两点: 1:814一定攻

NOIP模拟赛

#1[Nescafé 31]杯NOIP模拟赛 t1 题意:n*m的棋盘上从(1,1)走到(n,m),只能向下或向右,一些格子有老鼠,每个老鼠互不相同,当处于与老鼠有重边的格子时,视为看见了这只老鼠,求到终点看到最少的不同老鼠数. 分析:DP 由于求得是看到的不同的老鼠数目,不能直接用过河卒做,因为同一个位置的老鼠可能会统计多次,我们还需要增加一维即方向. f[i,j,0]表示到从上面一个格子走到(i,j)时最少老鼠数,f[i,j,1]表示左边. f[i,j,0]:=min(f[i-1,j,0]+

2012-10-20 NOIP模拟赛

      2012-10-20 NOIP模拟赛 by coolyangzc 共3道题目,时间3小时 题目名 高级打字机 不等数列 经营与开发 源文件 type.cpp/c/pas num.cpp/c/pas exploit.cpp/c/pas 输入文件 type.in num.in exploit.in 输出文件 type.out num.out exploit.out 时间限制 1000MS 1000MS 1000MS 内存限制 256MB 256MB 256MB 测试点 5+(5) 10

2017 9 11 noip模拟赛T2

#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=205; int map[N][N]; int d[N],tag[N],book[N],f[N]; int n,m; void work(int x) { memset(d,63,sizeof(d)); memset(book,0,sizeof(book)); memset(f,0,sizeof(

【noip模拟赛4】Matrix67的派对 暴力dfs

[noip模拟赛4]Matrix67的派对 描述 Matrix67发现身高接近的人似乎更合得来.Matrix67举办的派对共有N(1<=N<=10)个人参加,Matrix67需要把他们安排在圆桌上.Matrix67的安排原则是,圆桌上任意两个相邻人的身高之差不能超过K.请告诉Matrix67他共有多少种安排方法. 输入 第一行输入两个用空格隔开的数N和K,其中1<=N<=10,1<=K<=1 000 000. 第二行到第N+1行每行输入一个人的身高值.所有人的身高都是不

2014-11-3 NOIP模拟赛2

NOIP 2014 水题模拟赛 (请选手务必仔细阅读本页内容) 一.题目概况 中文题目名称 数列 刷漆 排队 英文题目与子目录名 seq paint layout 可执行文件名 seq paint layout 输入文件名 seq.in paint.in layout.in 输出文件名 seq.out paint.out layout.out 每个测试点时限 2 秒 1 秒 1 秒 测试点数目 10 10 10 每个测试点分值 10 10 10 附加样例文件 无 无 无 结果比较方式 全文比较(

liu_runda 给辣鸡蒟蒻做的 NOIP模拟赛 1.0 第二题 任(duty) 题解

问题 B: 任(duty) 时间限制: 2 Sec  内存限制: 512 MB 题目描述 liu_runda退役之后就失去梦想开始咸鱼生活了- Bilibili夏日画板活动中,所有人都可以在一块画板上进行像素画创作.UOJ群有一群无聊的人决定在画板上创作一个50*50的UOJ的LOGO.如下图. 这块画板实际上是很大的矩形网格.一个网格是一像素. 一个人每三分钟才能画一个像素.所以liu_runda的咸鱼生活非常无聊. 郭神表示他实在是看不下去liu_rudna这只颓狗了,于是随手出了一道神题,