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()); }
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; }
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()); }
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; }