题意: 给出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 思维+前缀和+填表加减复杂度(复杂度计算错误)的更多相关文章

  1. [JZOJ5280]膜法师题解--思维+前缀和

    [JZOJ5280]膜法师题解--思维+前缀和 题目链接 暴 力 过 于

  2. Codeforces 1082C Multi-Subject Competition(前缀+思维)

    题目链接:Multi-Subject Competition 题意:给定n名选手,每名选手都有唯一选择的科目si和对应的能力水平.并且给定科目数量为m.求选定若干个科目,并且每个科目参与选手数量相同的 ...

  3. Codeforces 776C - Molly's Chemicals(思维+前缀和)

    题目大意:给出n个数(a1.....an),和一个数k,问有多少个区间的和等于k的幂 (1 ≤ n ≤ 10^5, 1 ≤ |k| ≤ 10, - 10^9 ≤ ai ≤ 10^9) 解题思路:首先, ...

  4. Codeforces_776_C_(思维)(前缀和)

    C. Molly's Chemicals time limit per test 2.5 seconds memory limit per test 512 megabytes input stand ...

  5. 2019牛客多校训练第三场B.Crazy Binary String(思维+前缀和)

    题目传送门 大致题意: 输入整数n(1<=n<=100000),再输入由n个0或1组成的字符串,求该字符串中满足1和0个数相等的最长子串.子序列. sample input: 801001 ...

  6. atcode E - guruguru(思维+前缀)

    题目链接:http://arc077.contest.atcoder.jp/tasks/arc077_c 题解:一道思维题.不容易想到类似区间求和具体看一下代码. #include <iostr ...

  7. CodeForces - 519D(思维+前缀和)

    题意 https://vjudge.net/problem/CodeForces-519D 给定每个小写字母一个数值,给定一个只包含小写字母的字符串 s,求 s 的子串 t 个数,使 t满足: 首位字 ...

  8. Spotlights【思维+前缀和优化】

    https://blog.csdn.net/mengxiang000000/article/details/53291883   原博客地址 http://codeforces.com/group/1 ...

  9. Educational Codeforces Round 102 (Rated for Div. 2) D. Program (思维,前缀和)

    题意:给你一个只含\(+\)和\(-\)的字符串,给你一个数\(x\),\(x\)初始为\(0\),随着字符串的遍历会加一减一,现在有\(m\)个询问,每个询问给出一个区间\([l,r]\)表示将这个 ...

随机推荐

  1. 升级本地部署的CRM到Dynamics 365及部分新特性介绍。

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复241或者20161226可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong. ...

  2. 控制台程序(C#)不弹出认证窗口连接到Dynamics CRM Online的Web API

    摘要: 本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复271或者20180602可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyon ...

  3. iOS----------Xcode9无线调试教程

    软硬件要求: - Xcode 9.0 beat 及以上版本 - macOS 10.12.5 及以上版本 - iOS 11.0 beat 及以上版本 网络连接要求 - 电脑和设备处于同一 Wifi 环境 ...

  4. 算法: 整数中1出现的次数(从1到n整数中1出现的次数)

    问题: 整数中1出现的次数(从1到n整数中1出现的次数) 问题:求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数? 为此他特别数了一下1~13中包含1的数字有1.10.11 ...

  5. MongoDB在已有账号的实例下还原数据库报错的分析(error applying oplog)

    一. 背景 今天在MongoDB 4.0.4版本下,在还原恢复数据库时报错. 主要错误为: Failed: restore error: error applying oplog: applyOps: ...

  6. MySQL的自动提交模式

      默认情况下, MySQL启用自动提交模式(变量autocommit为ON).这意味着, 只要你执行DML操作的语句,MySQL会立即隐式提交事务(Implicit Commit).这个跟SQL S ...

  7. win10安装JDK详细教程

    电脑进行了重装机器.需要重新安装,在此记录一下. 点击下一步.选择安装路径 . 等待后,选择安装位置. 点击下一步,继续等待. 安装完成. 设置环境变量 在桌面右键单击 我的电脑→属性→高级系统设置→ ...

  8. UGUI合批原理笔记

    可以通过Frame debugger查看每个drawcall绘制了哪些东西 UGUI源码下载地址:https://bitbucket.org/Unity-Technologies/ui/downloa ...

  9. 让 Windows7 - 64bit 支持 VC++ 6.0 的解决方法(无法启动此程序,因为计算机中丢失 MSVCRTD.dll。尝试重新安装该程序以解决此问题)

    源地址:https://www.cnblogs.com/poissonnotes/p/4372136.html 无法启动此程序,因为计算机中丢失 MSVCRTD.dll.尝试重新安装该程序以解决此问题 ...

  10. php $$可变变量理解

    //在变量前面加上两个$$,如$$name,这表示可变变量,可以动态的设置和使用,先设置一个普通变量,一个可变变量会获取了一个普通变量的值作为这个可变变量的变量名 $a = 'b'; $b = 'c' ...