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

贪心+线段树 为啥WA了?

Posted by ljqdfn990412 at 2018-06-22 23:36:43 on Problem 1201
想问问大家为啥WA了 不是很理解
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#define dbg(x) cout<<#x<<" = "<< (x)<< endl
using namespace std;
const int MAX_N = 51024;
int vis[MAX_N<<2];
int s[MAX_N<<2],col[MAX_N<<2];
void up(int p){
   s[p] = s[p*2] + s[p*2+1];
}
void down(int p,int l,int r){
    if(col[p]){
        int mid = (l+r)>>1;
        col[p*2]+=col[p];
        col[p*2+1]+=col[p];
        s[p*2]+=col[p]*(l-mid+1);
        s[p*2+1]+=col[p]*(r-mid);
        col[p] = 0;
    }
}
void build (int p,int l,int r){
    col[p]=0;
    if(l==r){
        s[p] = 0;
        return;
    }
    int mid = (l+r)>>1;
    build(p*2,l,mid);
    build(p*2+1,mid+1,r);
    up(p);
}
void change(int p,int l,int r,int x,int y,int c){
    if(x<=l&&r<=y){
        col[p]+=c;
        s[p]+=c*(r-l+1);
        return;
    }
    down(p,l,r);
    int mid = (l+r)>>1;
    if(x<=mid) change(p*2,l,mid,x,y,c);
    if(y>mid) change(p*2+1,mid+1,r,x,y,c);
    up(p);
}
int query(int p,int l,int r,int x){
    if(l==r){
        return s[p];
    }
    down(p,l,r);
    int mid = (l+r)>>1,res;
    if(x<=mid) res = query(p*2,l,mid,x);
    else res = query(p*2+1,mid+1,r,x);
    return res;
}
struct node {
   int x;
   int y;
   int num;
   bool operator < (const node &other)const{
      if(y==other.y) return x>other.x;
      return y<other.y;
   }
}arr[MAX_N];
int main(){
    s[0] = 0;
    int n;
    while(~scanf("%d",&n)){
    memset(vis,0,sizeof(vis));
    int maxx=-1;
    for(int i= 1;i<=n;i++){
       scanf("%d%d%d",&arr[i].x,&arr[i].y,&arr[i].num);
       arr[i].x++;
       arr[i].y++;
    }
    sort(arr+1,arr+1+n);
    build(1,1,arr[n].y);
    for(int i=0;i<arr[1].num;i++){
    vis[arr[1].y-arr[1].num+1+i]=1;
    change(1,1,arr[n].y,arr[1].y-arr[1].num+1+i,arr[n].y,1);
    }
    int cnt=arr[1].num;
    for(int i =2;i<=n;i++){
        int numx = query(1,1,arr[n].y,arr[i].x-1);
        int numy = query(1,1,arr[n].y,arr[i].y);
        //dbg(numy);
        //dbg(numx);
        if((arr[i].num-(numy-numx))<0) arr[i].num=0;
        else arr[i].num-=(numy-numx);
        //dbg(arr[i].num);
        cnt+=arr[i].num;
        //dbg(cnt);
        if(!arr[i].num) continue;
        else {
            int cnt_now = 0;
         for(int k = 0;k<arr[i].num;k++){
          while(vis[arr[i].y-arr[i].num+1+k-cnt_now]==1) cnt_now++;
          change(1,1,arr[n].y,arr[i].y-arr[i].num+1+k-cnt_now,arr[n].y,1);
          vis[arr[i].y-arr[i].num+1+k-cnt_now]=1;
          //dbg(arr[i].y-arr[i].num+1+k-cnt_now);
         }
        }
    }
    printf("%d\n",cnt);
    }
    return 0;
}

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