这样类似的题目不少,很多都是一堆优化条件求最优解,这个题的策略就是二分+贪心。
对时间二分, 对费用采用贪心。

 /* 377B */
#include <iostream>
#include <string>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <vector>
#include <deque>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <ctime>
#include <cstring>
#include <climits>
#include <cctype>
#include <cassert>
#include <functional>
#include <iterator>
#include <iomanip>
using namespace std;
//#pragma comment(linker,"/STACK:102400000,1024000") #define sti set<int>
#define stpii set<pair<int, int> >
#define mpii map<int,int>
#define vi vector<int>
#define pii pair<int,int>
#define vpii vector<pair<int,int> >
#define rep(i, a, n) for (int i=a;i<n;++i)
#define per(i, a, n) for (int i=n-1;i>=a;--i)
#define clr clear
#define pb push_back
#define mp make_pair
#define fir first
#define sec second
#define all(x) (x).begin(),(x).end()
#define SZ(x) ((int)(x).size())
#define lson l, mid, rt<<1
#define rson mid+1, r, rt<<1|1 typedef struct node_t {
int x, id;
node_t() {}
node_t(int x_, int id_):
x(x_), id(id_) {}
friend bool operator< (const node_t& a, const node_t& b) {
return a.x > b.x;
}
} node_t; typedef struct student {
int x, p, id;
student() {}
student(int x_, int p_, int id_):
x(x_), p(p_), id(id_) {}
friend bool operator< (const student& a, const student& b) {
return a.x > b.x;
}
} student; const int maxn = 1e5+;
int a[maxn];
int n, m, s;
node_t N[maxn];
student S[maxn]; bool comp(const student& a , const student& b) {
return a.x > b.x;
} bool judge(int t) {
priority_queue<int,vi, greater<int> > Q;
int i, j, k;
int p;
int tot = s; i = ; // i for student
j = ; // j for Q
while (j < m) {
while (i<n && S[i].x>=N[j].x) {
Q.push(S[i].p);
++i;
}
if (Q.empty())
break;
p = Q.top();
Q.pop();
if (p > tot)
return false;
tot -= p;
j += t;
} return j>=m;
} void bfs(int t) {
priority_queue<pii,vpii, greater<pii> > Q;
int i, j, k, id;
int m_; i = ; // i for student
j = ; // j for Q
while (j < m) {
while (i<n && S[i].x>=N[j].x) {
Q.push(mp(S[i].p, S[i].id));
++i;
}
id = Q.top().sec;
Q.pop();
m_ = min(m, j+t);
for (k=j; k<m_; ++k)
a[N[k].id] = id;
j += t;
}
} int main() {
ios::sync_with_stdio(false);
#ifndef ONLINE_JUDGE
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
#endif int ans = -; scanf("%d %d %d", &n, &m, &s);
rep(i, , m) {
scanf("%d", &N[i].x);
N[i].id = i;
}
rep(i, , n) {
scanf("%d", &S[i].x);
S[i].id = i+;
}
rep(i, , n)
scanf("%d", &S[i].p); sort(N, N+m);
sort(S, S+n); if (S[].x < N[].x) {
puts("NO");
return ;
} int l = ;
int r = m+;
int mid; while (l <= r) {
mid = (l+r)>>;
if (judge(mid)) {
ans = mid;
r = mid - ;
} else {
l = mid + ;
}
} if (ans > ) {
puts("YES");
bfs(ans);
rep(i, , m)
printf("%d ", a[i]);
putchar('\n');
} else {
puts("NO");
} #ifndef ONLINE_JUDGE
printf("time = %d.\n", (int)clock());
#endif return ;
}

【CF】222 Div.1 B Preparing for the Contest的更多相关文章

  1. Codeforces Round #222 (Div. 1) B. Preparing for the Contest 二分+线段树

    B. Preparing for the Contest 题目连接: http://codeforces.com/contest/377/problem/B Description Soon ther ...

  2. 【CF】121 Div.1 C. Fools and Roads

    题意是给定一棵树.同时,给定如下k个查询: 给出任意两点u,v,对u到v的路径所经过的边进行加计数. k个查询后,分别输出各边的计数之和. 思路利用LCA,对cnt[u]++, cnt[v]++,并对 ...

  3. 【CF】310 Div.1 C. Case of Chocolate

    线段树的简单题目,做一个离散化,O(lgn)可以找到id.RE了一晚上,额,后来找到了原因. /* 555C */ #include <iostream> #include <str ...

  4. 【CF】110 Div.1 B. Suspects

    这题目乍眼一看还以为是2-sat.其实很水的,O(n)就解了.枚举每个人,假设其作为凶手.观察是否满足条件.然后再对满足的数目分类讨论,进行求解. /* 156B */ #include <io ...

  5. 【CF】207 Div.1 B.Xenia and Hamming

    这题目一看很牛逼,其实非常easy.求求最小公倍数,最大公约数,均摊复杂度其实就是O(n). /* 356B */ #include <iostream> #include <str ...

  6. 【CF】142 Div.1 B. Planes

    SPFA.注意状态转移条件,ans的求解需要在bfs中间求解.因为只要到了地点n,则无需等待其他tourist.还是蛮简单的,注意细节. /* 229B */ #include <iostrea ...

  7. 【CF】196 Div.2 D. Book of Evil

    显然这个图是一课树,看着题目首先联想到LCA(肯定是可以解的).但是看了一下数据大小,应该会TLE.然后,忽然想到一个前面做过的题目,大概是在一定条件下树中某结点旋转成为根后查询最长路径.结果灵感就来 ...

  8. 【CF】223 Div.1 C Sereja and Brackets

    水线段树. /* 380C */ #include <iostream> #include <string> #include <map> #include < ...

  9. 【CF】259 Div.1 B Little Pony and Harmony Chest

    还蛮有趣的一道状态DP的题目. /* 435B */ #include <iostream> #include <string> #include <map> #i ...

随机推荐

  1. 首页TAB页的技术选择与功能实现

    一般的选择是用viewpager,这个有开源库.不过因为要引入开源库,所以有时候显得比较大. 下面这段代码是用在一个BaseActivity上面的,下面继承的Activity直接使用该方法,就可以完成 ...

  2. MVC小系列(七)【分部视图中的POST】

    MVC小系列(七)[分部视图中的POST] 在PartialView中进行表单提交的作用:1 这个表单不止一个地方用到,2 可能涉及到异步的提交问题 这两种情况都可能需要把表单建立在分部视图上, 使用 ...

  3. SQLServer2012分离出的数据库存放路径

    分离出的数据库没有保存位置提示,经常会导致分离出的数据库找不到  以下是分离出的数据库默认位置: C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQL ...

  4. sql中truncate 、delete与drop区别

    SQL truncate .delete与drop区别   相同点: 1.truncate和不带where子句的delete.以及drop都会删除表内的数据. 2.drop.truncate都是DDL ...

  5. UVA 11991 Easy Problem from Rujia Liu?(vector map)

    Easy Problem from Rujia Liu? Though Rujia Liu usually sets hard problems for contests (for example, ...

  6. Codevs 1702 素数判定 2(Fermat定理)

    1702 素数判定 2 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description 一个数,他是素数么? 设他为P满足(P< ...

  7. 导入外部jar包的方法

    注:使用的编译平台为eclipse <算法>一书中需要引入外部jar包(algs4.jar),因此特地去学了下导入外部jar包的方法.步骤如下: 1.先将algs4.jar拷到j如下路径: ...

  8. cleartool mkview snapshot windows

    mkview 用法详解:mkview - Support - IBM 创建View的命令相对来讲十分直截了当. cleartool mkview -snapshot -tag ViewName -vw ...

  9. CentOs install oracle instant client

    rpm -ivh oracle-instantclient11.2-basic-11.2.0.3.0-1.x86_64.rpm rpm -ivh oracle-instantclient11.2-de ...

  10. 禁止选择文本和禁用右键 v2.0

    禁止鼠标右键(注:在火狐浏览器没有起到效果作用) <script> function stop() { return false }; document.oncontextmenu = s ...