Example #1
0
void PointUpdate(int k,int u)
{
    int mid;
    node[u].sum++;
    if (node[u].l==node[u].r) return;
    mid=(node[u].l+node[u].r)/2;
    if (k<=mid) PointUpdate(k,u*2);
    else PointUpdate(k,u*2+1);
}
void tui::LayoutCanvas::OnMouseWheel(wxMouseEvent& event)
{
   int delta    = event.GetWheelDelta();
   int fulldist = event.GetWheelRotation();
   double scroll = fulldist / delta;
   wxCommandEvent eventZOOM(wxEVT_CANVAS_ZOOM);
   if (event.ShiftDown())
   {
      if      ( 1 <= scroll) eventZOOM.SetInt(ZOOM_UP);
      else if (-1 >= scroll) eventZOOM.SetInt(ZOOM_DOWN);
   }
   else if (event.ControlDown())
   {
      if      ( 1 <= scroll) eventZOOM.SetInt(ZOOM_RIGHT);
      else if (-1 >= scroll) eventZOOM.SetInt(ZOOM_LEFT);
   }
   else
   {
      const double scalefactor = event.AltDown() ? 0.8 : 0.5;
      CTM tmpmtrx;
      TP markerpos(event.GetX(), event.GetY());
      if      ( 1 <= scroll)
         tmpmtrx.Scale(scalefactor,scalefactor);
      else if (-1 >= scroll)
         tmpmtrx.Scale(1/scalefactor,1/scalefactor);
      tmpmtrx.Translate(markerpos * _LayCTM - markerpos * _LayCTM * tmpmtrx);
      DBbox* box = DEBUG_NEW DBbox( lp_BL, lp_TR );
      (*box) = (*box) * tmpmtrx;
      eventZOOM.SetInt(tui::ZOOM_WINDOW);
      eventZOOM.SetClientData(static_cast<void*>(box));
   }
   OnZoom(eventZOOM);
   PointUpdate(event.GetX(), event.GetY());
}
Example #3
0
int main()
{
    int n,i,sum,ans;
    freopen("hdoj1394.txt","r",stdin);
    freopen("hdoj1394ans.txt","w",stdout);
    while (scanf("%d",&n)!=EOF)
    {
        BuildTree(0,n-1,1);
        sum=0;
        for (i=0;i<n;i++)
        {
            scanf("%d",&val[i]);
            sum+=SegmentQuery(val[i],n-1,1);  //查询已经插入的数里有多少个在val[i]
            PointUpdate(val[i],1);            //到n-1之间,即为逆序数,并插入这个数
        }
        ans=sum;
        for (i=0;i<n;i++)
        {
            sum=sum-val[i]+(n-val[i]-1);
            if (sum<ans) ans=sum;
        }
        printf("%d\n",ans);
    }
    return 0;
}
Example #4
0
void PointUpdate(int x,int u)
{
    if (node[u].maxlen<x)      //进入的区间无法满足,返回-1
    {
        ans=-1;
        return;
    }
    if (node[u].l==node[u].r)  //到叶节点,直接更新
    {
        node[u].maxlen-=x;
        ans=node[u].l;
        return;
    }
    //先更新左右两个子树
    if (node[u*2].maxlen>=x) PointUpdate(x,u*2);
    else if (node[u*2+1].maxlen>=x) PointUpdate(x,u*2+1);
    //然后更新当前的节点情况
    node[u].maxlen=Max(node[u*2].maxlen,node[u*2+1].maxlen);
}
void tui::LayoutCanvas::OnChar(wxKeyEvent& event)
{
   wxCommandEvent eventZOOM(wxEVT_CANVAS_ZOOM);
   switch(event.GetKeyCode())
   {
      case WXK_LEFT : eventZOOM.SetInt(ZOOM_LEFT ); break;
      case WXK_RIGHT: eventZOOM.SetInt(ZOOM_RIGHT); break;
      case WXK_UP   : eventZOOM.SetInt(ZOOM_UP   ); break;
      case WXK_DOWN : eventZOOM.SetInt(ZOOM_DOWN ); break;
      case '+'      : eventZOOM.SetInt(ZOOM_IN   ); break;
      case '-'      : eventZOOM.SetInt(ZOOM_OUT  ); break;
            default : event.Skip(); return;
   }
   OnZoom(eventZOOM);
   PointUpdate(event.GetX(), event.GetY());
}
Example #6
0
int main()
{
    int i,k;
    freopen("hdoj2795.txt","r",stdin);
    freopen("hdoh2795ans.txt","w",stdout);
    while (scanf("%d%d%d",&h,&w,&n)!=EOF)
    {
        BuildTree(1,Min(h,n),1);
        while (n--)
        {
            scanf("%d",&k);
            PointUpdate(k,1);
            printf("%d\n",ans);
        }
    }
    return 0;
}