C. Multi-Subject Competition 思维+前缀和+填表加减复杂度(复杂度计算错误)
题意: 给出n个学生 m类题目 每个人会做s[i]类的题 并且做这个题的能力为r[i] 组成一个竞赛队 要求可以选择一些题目 在竞赛队中 擅长每一个题目的
人数要均等 求max(sigma(r[i]))
思路:贪心思想 每类题目选k个学生 先对每一类学生的能力值排序 如果这k个学生的能力值大于0 就选上 一开始写的是类似扫描的思想 从k从1---max(擅长一类题目的学生) 然后把他们前k个相加
如果擅长其中一类题目的sum<=0或者没有k个学生擅长该类题目就忽略 这样在枚举的时候就会爆炸T O(n*m) 换一个想法 用填表的思想ans[i]表示选取i个学生时候的max(sigma(r[i])) 每次枚举一类 如果
前缀和sum大于0就把它填在适当的ans[i]中 这样复杂度就为O(nlogn+m)
此题注意扫描不行就换填表 以减少复杂度
AC:
#include<bits/stdc++.h>
#define pb push_back
using namespace std;
const int maxn=2e5+;
const int inf =0x3f3f3f3f;
vector<int>v[maxn];
vector<int>sum[maxn];
bool cmp(int x,int y){
return x>y;
}
int vis[maxn];
int ans[maxn];
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
int a,b;
scanf("%d%d",&a,&b);
v[a].pb(b);
}
for(int i=;i<=m;i++){
sort(v[i].begin(),v[i].end(),cmp);
}
int ans1=;
int maxsize=;
for(int i=;i<=m;i++){
int sum=;
for(int j=;j<v[i].size();j++){
sum+=v[i][j];
if(sum>)ans[j]+=sum;
else break;
}
maxsize=max(maxsize,int(v[i].size()));
}
for(int i=;i<maxsize;i++)ans1=max(ans1,ans[i]);
cout<<ans1<<endl; }
T:
#include<bits/stdc++.h>
#define pb push_back
using namespace std;
const int maxn=2e5+;
const int inf =0x3f3f3f3f;
vector<int>v[maxn];
vector<int>sum[maxn];
bool cmp(int x,int y){
return x>y;
}
int vis[maxn];
int ans[maxn];
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
int a,b;
scanf("%d%d",&a,&b);
v[a].pb(b);
}
for(int i=;i<=m;i++){
sort(v[i].begin(),v[i].end(),cmp);
}
int big=inf;
int maxsize=;
for(int i=;i<=m;i++){
int j;
for( j=;j<int(v[i].size());j++){
if(j>)
sum[i].pb(sum[i][j-]+v[i][j]);
else sum[i].pb(v[i][j]);
if(sum[i][j]<=){
break;
} }
/* if(j>0&&sum[i][j-1]>0){
sum[i].pb(-sum[i][j-1]);
}*/ maxsize=max(maxsize,int(sum[i].size()));
} int tmp=;
int ans=;
for(int i=;i<maxsize;i++){
tmp=;
for(int j=;j<=m;j++){
if(vis[j]||i>=int(sum[j].size()))continue;
if(sum[j][i]<=){
vis[j]=;
continue;
}
tmp+=sum[j][i];
}
ans=max(tmp,ans);
} /*for(int i=1;i<=m;i++){
int sum=0;
for(int j=0;j<v[i].size();j++){
sum+=v[i][j];
if(sum>=0)ans[j]+=sum;
else break;
}
maxsize=max(maxsize,int(v[i].size()));
}
int ans1=0;
for(int i=0;i<maxsize;i++)ans1=max(ans1,ans[i]);*/ cout<<ans<<endl; }
C. Multi-Subject Competition 思维+前缀和+填表加减复杂度(复杂度计算错误)的更多相关文章
- [JZOJ5280]膜法师题解--思维+前缀和
[JZOJ5280]膜法师题解--思维+前缀和 题目链接 暴 力 过 于
- Codeforces 1082C Multi-Subject Competition(前缀+思维)
题目链接:Multi-Subject Competition 题意:给定n名选手,每名选手都有唯一选择的科目si和对应的能力水平.并且给定科目数量为m.求选定若干个科目,并且每个科目参与选手数量相同的 ...
- Codeforces 776C - Molly's Chemicals(思维+前缀和)
题目大意:给出n个数(a1.....an),和一个数k,问有多少个区间的和等于k的幂 (1 ≤ n ≤ 10^5, 1 ≤ |k| ≤ 10, - 10^9 ≤ ai ≤ 10^9) 解题思路:首先, ...
- Codeforces_776_C_(思维)(前缀和)
C. Molly's Chemicals time limit per test 2.5 seconds memory limit per test 512 megabytes input stand ...
- 2019牛客多校训练第三场B.Crazy Binary String(思维+前缀和)
题目传送门 大致题意: 输入整数n(1<=n<=100000),再输入由n个0或1组成的字符串,求该字符串中满足1和0个数相等的最长子串.子序列. sample input: 801001 ...
- atcode E - guruguru(思维+前缀)
题目链接:http://arc077.contest.atcoder.jp/tasks/arc077_c 题解:一道思维题.不容易想到类似区间求和具体看一下代码. #include <iostr ...
- CodeForces - 519D(思维+前缀和)
题意 https://vjudge.net/problem/CodeForces-519D 给定每个小写字母一个数值,给定一个只包含小写字母的字符串 s,求 s 的子串 t 个数,使 t满足: 首位字 ...
- Spotlights【思维+前缀和优化】
https://blog.csdn.net/mengxiang000000/article/details/53291883 原博客地址 http://codeforces.com/group/1 ...
- Educational Codeforces Round 102 (Rated for Div. 2) D. Program (思维,前缀和)
题意:给你一个只含\(+\)和\(-\)的字符串,给你一个数\(x\),\(x\)初始为\(0\),随着字符串的遍历会加一减一,现在有\(m\)个询问,每个询问给出一个区间\([l,r]\)表示将这个 ...
随机推荐
- angular打包后路由和文件路径不对
base href换成如下script标签 <!-- <base href="/"> --> <script> document.write(' ...
- 上海启动5G试用!104页PPT,为你深度解析5G终端的创新和机遇
文章发布于公号[数智物语] (ID:decision_engine),关注公号不错过每一篇干货. 来源:国泰君安证券 作者:分析师王聪.张阳.陈飞达 导读:2019年是5G元年,各大品牌将陆续推出5G ...
- Windows7 WIN 7 64位 环境编译6sv2.1版本的大气传输模型
从来没见过Fortran...这次为了添加国产卫星光谱响应的支持,只能从零开始肯了. 6S模型主页:http://6s.ltdri.org/index.html. 下载最新的2015年更新的6SV2. ...
- Mac 系统占用100g的解决办法
Mac 关于本机-磁盘管理,如果发现系统占用超过80g以上的小伙伴们可以做以下操作只需要以下4个步骤,轻松降到30g以内!!!!!!!(仅适用于安装了Xcode的小伙伴) 打开Finder,comma ...
- java之网络爬虫介绍
文章大纲 一.网络爬虫基本介绍二.java常见爬虫框架介绍三.WebCollector实战四.项目源码下载五.参考文章 一.网络爬虫基本介绍 1. 什么是网络爬虫 网络爬虫(又被称为网页蜘蛛, ...
- Centos7 安装Tomcat并运行程序
运行环境:Centos7 jdk:1.8.0_171 Tocmcat:8.5.31 下载地址 :https://tomcat.apache.org/download-80.cgi#8.5.31 Ap ...
- 【原】无脑操作:eclipse创建maven工程时,如何修改默认JDK版本?
问题描述:eclipse建立maven项目时,JDK版本默认是1.5,想创建时默认版本设置为1.8,如何修改? 解决方案: 找到本机maven仓库存放位置,比如:${user.home}/.m2/路径 ...
- c/c++ 网络编程 getaddrinfo 函数
网络编程 getaddrinfo 函数 解析网址,返回IP地址. 例子: #include <iostream> #include <string.h> #include &l ...
- [RHEL 6]GPT分区--parted
对于2T以上的硬盘,划分分区表需要GPT分区,RHEL 6中使用parted进行分区 用法:parted [选项]... [设备 [命令 [参数]...]...] 将带有“参数”的命令应用于“设备”. ...
- Linux Mysql 每天定时备份
1.创建脚本 dbback.sh,内容如下: #!/bin/bash mysqldump -uroot -p123456 hexin>/work/db_back/hexin_$(date +%Y ...