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]\)表示将这个 ...
随机推荐
- Mysql基本操作指令集锦
一.MySQL服务的启动.停止与卸载 在 Windows 命令提示符下运行: 启动: net start MySQL 停止: net stop MySQL 卸载: sc delete MySQL 二. ...
- 自然语言处理NLP快速入门
自然语言处理NLP快速入门 https://mp.weixin.qq.com/s/J-vndnycZgwVrSlDCefHZA [导读]自然语言处理已经成为人工智能领域一个重要的分支,它研究能实现人与 ...
- scrollTo不起作用
最近,我在HorizontalScrollview中使用scrollTo不起作用? ...... 以上省略N个字. 我只想说: 在使用scrollTo的时候,要先保证该HorizontalScroll ...
- idea连接服务器上传jar并运行
.打开idea tools-deployment-configuration.. .打开如图 点击 + 号 .如 ...
- 一个表里有多个字段需要同时使用字典表进行关联显示,如何写sql查询语句
参考:https://bbs.csdn.net/topics/330032307 数据库里面有一个字典表,这张表里面有id段和对应的名字字段.在另外一个记录的表里面有对应的上述字典表的id,而且有多个 ...
- SQL server常用函数使用示例
select convert(nvarchar(10),id)+name from t //convert():数据类型转换,将“id”列转换为“nvarchar”. select cast(id a ...
- 我现在有个表,里面有100个不同的单词,每个单词对应有大概20个词组,我想通过sql,每个单词随机获取对应的3个词组,请问怎么写可以实现?
闲来无事刷技术论坛,看到一个这样的问题: 我现在有个表,里面有100个不同的单词,每个单词对应有大概20个词组,我想通过sql,每个单词随机获取对应的3个词组,请问怎么写可以实现? 感觉题材很新颖,角 ...
- 做移动端电子签名发现canvas的 一些坑
做移动端收集电子签名项目的时候发现了一些坑: 1. 移动端的手指按下.移动.抬起事件跟PC端的鼠标按下.移动.弹起事件是不一样的 2. canvas它的属性宽高和样式宽高是不一样的,通过CSS来设置c ...
- Docker 架构(二)【转】
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器. Docker 容器通过 Docker 镜像来创建. 容器与镜像的关系类似于面向对象编程中的对象与类 ...
- PHAR系列之导言
由于之前都是在现成的PHP框架下写web项目,一般都只专注于框架内部的使用跟优化.但是对于一些PHP很有特色的功能跟特性很少过多的深入了解.最近做项目调研的时候偶尔注意到一个PHP中一个比较常见的概念 ...