【校赛小分队之我们有个女生】训练赛6

传送门

A.[CodeForces 631C] Report

题意

每个manager给数组a的第1到r[i]个数排序,t[i]==1则排升序,2则排降序。求m个manager排序完的序列。

分析

如果之前的r比较小,肯定会被更大的r的操作覆盖掉,所以我们要找到r的递减序列。
先找出最大的r,然后在这个r的后面再找最大的r,循环这样,找出了一个r的递减的序列,然后再模拟排序。

但是最坏情况:【r刚好从最大到最小,这样每次都要排一下序】时间复杂度mlogm+m*nlogn,会超时。

改成填数复杂度就变成mlogm+n,填数就是先给a的最大的r之前的数排个序,最大的r到第二大之间,如果是升序,那就把a大的那一头填进去,如果是降序,就把小的那一头填进去。以此类推前面的区间。

不过我找r的递减序列时出错了:只要id大于刚刚的manager的id(出现得更迟),并且排序方法不一样就让这个manager排一下。

int j=1;solve(j);//第j个(按r排)manager来排afor(int i=2; i<=m; i++){    if(b[i].id>b[j].id&&b[i].t!=b[j].t)    {        solve(i);        j=i;    }}

wa在test 14,但是因为太长,没法看到完整的数据,所以自己造数据,终于找出错在哪了,一个反例:

9 31 2 3 4 5 6 7 8 92 91 42 6

n=9,m=3
r:9 4 6
t:2 1 2
我的程序会先排9,升序,然后因为6升序,所以不排,于是j没有更新为6,然后排4,降序,这样就错了,因为4其实在6之前出现,所以应该忽略。
循环里改为这样就好了:

if(b[i].id>b[k].id){    if(b[i].t!=b[j].t)    {        r[cnt++]=i;        j=i;    }    k=i;}

k就是上一个排序的id,如果现在这个id大,就是后面的manager,现在的排法和前一个记录在r序列里的不一样,就记录进去。

代码

#include<cstdio>#include<algorithm>#define N 200005using namespace std;int n,m,a[N],c[N],r[N];struct mng{    int r,t,id;} b[N];int cmp(mng a,mng b){    return a.r>b.r;}int main(){    scanf("%d%d",&n,&m);    for(int i=1; i<=n; i++)        scanf("%d",&a[i]);    for(int i=1; i<=m; i++)    {        scanf("%d%d",&b[i].t,&b[i].r);        b[i].id=i;    }    sort(b+1,b+1+m,cmp);//manager按r排降序    int j=0,k=0,cnt=0;    //筛选出r递减的manager序列    for(int i=1; i<=m; i++)    {        if(b[i].id>b[k].id)        {            if(b[i].t!=b[j].t)            {                r[cnt++]=i;                j=i;            }            k=i;        }    }    for(int i=b[1].r+1; i<=n; i++) c[i]=a[i];    sort(a+1,a+1+b[1].r);//a数组b[1].r前的排升序    int tou=1,wei=b[1].r;    for(int i=0; i<cnt; i++)        if(b[r[i]].t==2)//当前的第r[i]个manager要降序            for(int j=b[r[i]].r; j>b[r[i+1]].r; j--) //小的从右到左放过去                c[j]=a[tou++];        else            for(int j=b[r[i]].r; j>b[r[i+1]].r; j--)                c[j]=a[wei--];//大的从右到左放过去    for(int i=1; i<=n; i++)        printf("%d ",c[i]);    return 0;}

B.没看

时间: 2024-11-08 03:22:37

【校赛小分队之我们有个女生】训练赛6的相关文章

HDU 5371 (2015多校联合训练赛第七场1003)Hotaru&#39;s problem(manacher+二分/枚举)

HDU 5371 题意: 定义一个序列为N序列:这个序列按分作三部分,第一部分与第三部分相同,第一部分与第二部分对称. 现在给你一个长为n(n<10^5)的序列,求出该序列中N序列的最大长度. 思路: 来自官方题解:修正了一些题解错别字(误 先用求回文串的Manacher算法,求出以第i个点为中心的回文串长度,记录到数组p中 要满足题目所要求的内容,需要使得两个相邻的回文串,共享中间的一部分,也就是说,左边的回文串长度的一半,要大于等于共享部分的长度,右边回文串也是一样. 因为我们已经记录下来以

HDU 5371 (2015多校联合训练赛第七场1003)Hotaru&amp;#39;s problem(manacher+二分/枚举)

pid=5371">HDU 5371 题意: 定义一个序列为N序列:这个序列按分作三部分,第一部分与第三部分同样,第一部分与第二部分对称. 如今给你一个长为n(n<10^5)的序列,求出该序列中N序列的最大长度. 思路: 来自官方题解:修正了一些题解错别字(误 先用求回文串的Manacher算法.求出以第i个点为中心的回文串长度.记录到数组p中 要满足题目所要求的内容.须要使得两个相邻的回文串,共享中间的一部分,也就是说.左边的回文串长度的一半,要大于等于共享部分的长度,右边回文串也

HDU-4930 Fighting the Landlords 多校训练赛斗地主

只需要判断一个回合就可以了,枚举判断可以一次出完所有牌或者大过对面的牌的可能,注意的是4张相同的牌带两张牌的话是可以被炸弹炸的. #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <queue> #include <algorithm> #include <cstdlib> #include <ioma

HDU 4864 Task (贪心+STL多集(二分)+邻接表存储)(杭电多校训练赛第一场1004)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4864 解题报告:有n台机器用来完成m个任务,每个任务有一个难度值和一个需要完成的时间,每台机器有一个可以工作的最长时间和一个可以完成的任务的难度的最大值, 一台机器能完成一个任务的条件是这台机器的最长工作时间和能完成任务的难度值必须都大于等于这个任务,而且一台机器最多完成一个任务,假设一个任务的时间为t,难度值为x,那么完成这个任务可以赚到的钱 money = 500 * t + 2 * x; 现在

HDU 4902 Nice boat 2014杭电多校训练赛第四场F题(线段树区间更新)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4902 解题报告:输入一个序列,然后有q次操作,操作有两种,第一种是把区间 (l,r) 变成x,第二种是把区间 (l,r) 中大于x的数跟 x 做gcd操作. 线段树区间更新的题目,每个节点保存一个最大和最小值,当该节点的最大值和最小值相等的时候表示这个区间所有的数字都是相同的,可以直接对这个区间进行1或2操作, 进行1操作时,当还没有到达要操作的区间但已经出现了节点的最大值跟最小值相等的情况时,说明

HDU 4941 Magical Forest(map映射+二分查找)杭电多校训练赛第七场1007

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4941 解题报告:给你一个n*m的矩阵,矩阵的一些方格中有水果,每个水果有一个能量值,现在有三种操作,第一种是行交换操作,就是把矩阵的两行进行交换,另一种是列交换操作,注意两种操作都要求行或列至少要有一个水果,第三种操作是查找,询问第A行B列的水果的能量值,如果查询的位置没有水果,则输出0. 因为n和m都很大,达到了2*10^9,但水果最多一共只有10^5个,我的做法是直接用结构体存了之后排序,然后m

校队训练赛,同时也是HDU4497(数论:素数分解+组合数学)

一.题目 http://acm.hdu.edu.cn/showproblem.php?pid=4497 二.思路 将满足条件的一组x,z,y都除以G,得到x‘,y',z',满足条件gcd(x',y',x') = 1,同时lcm(x',y',x') = G/L.特判,当G%L != 0 时,无解.然后素数分解G/L,假设G/L = p1^t1 * p2^t2 *````* pn^tn.满足上面条件的x,y,z一定为这样的形式.x' = p1^i1 * p2^i2 *```* pn^in.y' =

最后一周第二天训练赛之第二题

试题: B - B Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Practice SPOJ ICODER Description Mathews uses a brand new 16-bit instruction processor. (Yeah i am being sarcastic!). It has one register (say R) and it su

Dream_Chaser队训练赛第一场 I题

Dream_Chaser队训练赛第一场 I题 题目来自2012成都区域赛 I - Count Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 4472 Description Prof. Tigris is the head of an archaeological team who is currently in charge of a