Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

边界条件真难处理

Posted by 117474335 at 2010-10-14 17:47:15 on Problem 2010
#include <stdio.h>
#include <stdlib.h>

int n, m , v, f[201000], h[201000];
struct q{int a, b;}q[1001000];

void geng (int p, int r)
{
    int k ; 
    if (p < r) {
        k = hui (p, r ) ;
        geng (p, k ) ;
        geng (k + 1 , r) ;}
} 
int hui (int p, int r)
{
    int i = p - 1, j = r + 1, x = q[p].a, t ;
    while (1) {
        do {
            j -- ;}while (q[j].a > x) ;
        do {
            i ++ ;}while (q[i].a < x) ;
        if (i < j){
            t = q[i].a; q[i].a = q[j].a; q[j].a = t ;
            t = q[i].b; q[i].b = q[j].b; q[j].b = t ;}
        else return j; }
} 

void down (int i)
{
    int t = i , r ;
    if (i * 2 <= h[0] && h[i] < h[i * 2]) t = i * 2;
    if (i * 2 + 1 <= h[0] && h[i * 2 + 1] > h[t]) t = i * 2 + 1 ;
    if (t != i){
        r = h[t]; h[t] = h[i]; h[i] = r ;
        down (t) ;}
}

void up (int i )
{
    int t, r ;
    while (i > 1 && h[i / 2] < h[i]){
        t = i / 2 ;
        r = h[i]; h[i] = h[t]; h[t] = r ;
        i /= 2 ;}
}

main ()
{
    int i , j , t ;
    scanf ("%d%d%d", &n, &m, &v) ;
    for (i = 1; i <= m; i ++ ) scanf ("%d%d", &q[i].a, &q[i].b) ;
    geng (1, m) ;
    n /= 2 , f[n] = h[0] = 0 ;
    for (i = 1; i <= n; i ++ ){
        f[n] += q[i].b ;
        h[0] ++ ;
        h[h[0]] = q[i].b;
        up (h[0]) ;}
    while (i <= m){
        if (q[i].b < h[1]){
            f[i] = f[i - 1] + q[i].b - h[1] ;
            h[1] = q[i].b ;
            down (1) ;}
        else f[i] = f[i - 1] ;
        i ++ ;}
    t = 0, h[0] = 0;
    for (i = m; i > m - n; i -- ){
        t += q[i].b;
        h[0] ++ ;
        h[h[0]] = q[i].b;
        up (h[0]) ;}
    if (t + q[i].b + f[i - 1] <= v) i ++ ; 
    while (i >= n + 2 ){
        if (q[i].b < h[1]){
            t += q[i].b - h[1] ;
            h[1] = q[i].b ;
            down (1) ;}
        if (t + q[i - 1].b + f[i - 2] <= v ){i -- ; break ;}
        i -- ;}
    printf ("%d\n", i != n + 1 || t + f[i - 1] + q[i].b <= v? q[i].a : - 1) ;
    system ("pause") ;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator