题解 [CF332C] Students' Revenge
解析
辣鸡题面毁我青春
因为翻译的题面中写了一句\(剩下的n−k个不会完成\).
所以就以为剩下的\(n-k\)个都会算上不满意值.
(然而事实是只有\(p-k\)个...)
首先根据主席的规则,我们可以先钦定\(p-k\)个绝对不会被选的任务,
把\(b\)从大到小,再把\(a\)从小到大取最后面就行了.
(应该很容易理解吧...)
然后再把剩下的按\(a\)从大到小,
再把\(b\)从大到小排序,取前\(k\)个就是白头发最多的情况了.
这里把\(b\)从大到小是因为剩下的\(p-k\)个还要使不满意度最大,
所以从大到小的话就有了更多机会.
然后考虑剩下的\(p-k\)个,
因为之前钦定的不一定是不满意度最大的情况,
因此我们要再按第一次的顺序,
取已经取了的前\(k\)个中在最后面的任务的后面\(p-k\)个就行了.
这里听起来可能有点绕口...
因为我们要保证剩下的\(p-k\)个不能干扰前面的\(k\)个(即在主席的规则中优先度更高).
再自己\(yy\)下应该就行了.
还有一点要注意的是,
因为有两个任务可能\(a,b\)都相等,
因此两次排序的结果可能不一样(因为这个WA到吐...)
所以在排序的时候把编号作为第三关键字就好了.
code:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define fre(x) freopen(x".in","r",stdin),freopen(x".out","w",stdout)
using namespace std;
inline int read(){
int sum=0,f=1;char ch=getchar();
while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0' && ch<='9'){sum=sum*10+ch-'0';ch=getchar();}
return f*sum;
}
const int N=200005;
struct node{int x,y,tag,id,pos;}a[N],b[N];
int n,K,P,sum=0x3f3f3f3f,ret=0;
inline bool cmp(node a,node b){
return a.y!=b.y? a.y<b.y:a.x>b.x;
}
inline bool cmp1(node a,node b){
// if(a.tag!=b.tag) return a.tag<b.tag;
if(a.x!=b.x) return a.x>b.x;
return a.y>b.y;
}
inline bool cmp2(node a,node b){return a.y!=b.y? a.y>b.y:a.x<b.x;}
signed main(){
n=read();P=read();K=read();
for(int i=1;i<=n;i++) a[i].x=read(),a[i].y=read();
for(int i=1;i<=n;i++) a[i].id=i;
sort(a+1,a+n+1,cmp2);
memcpy(b,a,sizeof(b));
for(int i=1;i<=n;i++) a[i].pos=i;
int ss=P-K;
sort(a+1,a+n-ss+1,cmp1);
for(int i=1;i<=K;i++) printf("%d ",a[i].id);
for(int i=1;i<=K;i++) ret=max(ret,a[i].pos);
// sort(a+ret+1,a+n+1,cmp2);
for(int i=1;i<=ss;i++){
printf("%d ",b[i+ret].id);
}
// for(int i=1;i<=n;i++) if(a[i].tag) printf("%d ",a[i].id);
puts("");
return 0;
}
题解 [CF332C] Students' Revenge的更多相关文章
- 【Codeforces 332C】Students' Revenge
Codeforces 332 C 我爱对拍,对拍使我快乐... 题意:有\(n\)个议题,学生们会让议会同意\(p\)个,其中主席会执行\(k\)个, 每一个议题执行后主席会掉\(a_i\)的头发,不 ...
- 题解 GRE Words Revenge
题目传送门 题目大意 给出 \(m\) 次操作,分别为以下两种操作: 学习一个单词 给出一个段落,查询里面有多少个学过的单词.注意,如果学习过 \(\text{ab,bc}\) ,当前查询段落为 \( ...
- HDU P3341 Lost's revenge 题解+数据生成器
Lost and AekdyCoin are friends. They always play "number game"(A boring game based on numb ...
- HDU 3341 Lost's revenge (AC自动机 + DP + 变进制/hash)题解
题意:给你些分数串,给你一个主串,主串每出现一个分数串加一分,要你重新排列主串,最多几分 思路:显然这里开$40^4$去状压内存不够.但是我们自己想想会发现根本不用开那么大,因为很多状态是废状压,不是 ...
- Spring-2-B Save the Students(SPOJ AMR11B)解题报告及测试数据
Save the Students Time Limit:134MS Memory Limit:0KB 64bit IO Format:%lld & %llu Descri ...
- HDU 5019 Revenge of GCD(数学)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5019 Problem Description In mathematics, the greatest ...
- HDU5088——Revenge of Nim II(高斯消元&矩阵的秩)(BestCoder Round #16)
Revenge of Nim II Problem DescriptionNim is a mathematical game of strategy in which two players tak ...
- 【HDU 4898】 The Revenge of the Princess’ Knight (后缀数组+二分+贪心+...)
The Revenge of the Princess’ Knight Problem Description There is an old country and the king fell in ...
- hdu_4787_GRE Words Revenge(在线AC自动机)
题目链接:hdu_4787_GRE Words Revenge 题意: 总共有n个操作,2种操作.每行读入一个字符串. 1.如果字符串以+开头,此为单词(即模式串,不考虑重复) 2.如果字符串以?开头 ...
随机推荐
- js中的var a = new A;与var a = new A()的区别
JavaScript 中的new关键字与C#,JAVA中的概念完全不一样. 例:var a=new A(); 让我们来看看在JavaScript中的new发生了什么? var a={};//建立 ...
- [转帖]2019-03-26 发布 深入理解 MySQL ——锁、事务与并发控制
深入理解 MySQL ——锁.事务与并发控制 https://segmentfault.com/a/1190000018658828 太长了 没看完.. 数据库 并发 mysql 639 次阅读 ...
- [转帖].NET导出Excel的四种方法及评测
.NET导出Excel的四种方法及评测 https://www.cnblogs.com/sdflysha/p/20190824-dotnet-excel-compare.html 导出Excel是.N ...
- es6学习笔记(一)环境搭建
1.安装node.js.这个自行百度安装就好了,没什么说的,安装完配置环境变量.因为后面安装第三方包是要用到npm命令,装完node就等于安装完了npm 2.项目目录创建 mkdir es6 cd e ...
- 【AtCoder】ARC069
ARC069 C - Scc Puzzle --不说了 #include <bits/stdc++.h> #define fi first #define se second #defin ...
- 二叉查找树 & B(B-)树 & B+树 & B*树
一 二叉查找树 1 特点 (1)所有非叶子结点至多拥有两个子节点, left和right (2)一个结点存储一个关键字 (3)非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树 2 ...
- Python 装饰&生成&迭代器
Python 的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承.Py ...
- 牛客 128A 礼物 (组合计数)
大意: n种一元的奥利奥, m种2元的奥利奥, 求花恰好k元钱购买奥利奥的方案数. 可重组合问题, 直接dp即可. #include <iostream> #include <sst ...
- java实现4种内部排序
两种插入类排序: 直接插入排序: public static void insertSort(int[] arr, int len){ for(int i=1; i<len; i++){ int ...
- zepto学习(二)之tap事件以及tap事件点透处理
前言 为什么通过touch可以触发click事件? touch事件的来源 PC网页上的大部分操作都是用鼠标的,即响应的是鼠标事件,包括mousedown.mouseup.mousemove和click ...