noi08糖果雨: program ex2; const mlen=1001; var a:array[0..mlen*4,0..mlen*4] of longint; l,r:array[0..1000000] of longint; b:array[0..mlen*2] of longint; n,i,j,q,t,s,ll,rr,tt,len,ans,len2:longint; procedure ins2(x,y,o:longint); begin i:=len-y+x+1; while i>0 do begin j:=len*3-x-y+1; while j>0 do begin inc(a[i,j],o); dec(j,j and -j); end; dec(i,i and -i); end; end; function ask2(x,y:longint):longint; begin ask2:=0; i:=len-y+x+1; while i<=len<<2 do begin j:=len*3-x-y+1; while j<=len<<2 do begin inc(ask2,a[i,j]); inc(j,j and -j); end; inc(i,i and -i); end; end; function ask(i:longint):longint; begin ask:=0; i:=(i+len2) mod len2+1; while i>0 do begin inc(ask,b[i]); dec(i,i and -i); end; end; procedure ins(x,y,o:longint); begin i:=x+1; inc(s,o); while i<=len2 do begin inc(b[i],o); inc(i,i and -i); end; ins2(x,y,o); if x<=len then if x+y<=len then ins2(x+len2,y,o) else else if x-y>len then ins2(x-len2,y,o); end; begin assign(input,'candy.in');reset(input); assign(output,'candy.out');rewrite(output); readln(n,len); len2:=len*2; for n:=1 to n do begin read(q,t); if q=1 then begin readln(i,l[i],r[i],j); r[i]:=r[i]-l[i]; l[i]:=(len+j*(len-l[i])+t) mod len2; if l[i]<0 then inc(l[i],len2); ins(l[i],r[i],1); end else if q=2 then begin inc(tt); readln(ll,rr); t:=t mod len2; if rr=len then ans:=0 else ans:=ask(t+rr)-ask(t-rr-1); inc(ans,ord((t+rr>=len2)or(t-rr-1<0))*s); dec(ans,ask2(t,ll-1)); writeln(ans); end else begin readln(i); ins(l[i],r[i],-1); end; end; close(input);close(output); end. wc最短路:(常数写大了,还超两个点。。) program ex1;{$inline+} const maxn=100000; type mt=array[1..6,1..6] of longint; var f,fl,fr:array[0..maxn*3] of mt; o:array[0..maxn,1..6] of longint; i,j,k,q,x,y,n,x1,x2,y1,y2,ans,task:longint; tl,tr,tt,t1,t2,ll,lr,rr:mt; procedure swap(var a,b:longint);begin q:=a;a:=b;b:=q end; function min(a,b:longint):longint;inline; begin if a>b then min:=b else min:=a end; procedure fan(var a,b:mt);inline;var i,j:longint; begin for i:=1 to 6 do for j:=1 to 6 do b[i,j]:=a[j,i]; end; procedure getmin(var a,b:mt);inline;var i,j:longint; begin for i:=1 to 6 do for j:=1 to 6 do b[i,j]:=min(b[i,j],a[i,j]); end; procedure merge(var a,b,c:mt);inline;var i,j,k:longint; begin for i:=1 to 6 do for j:=1 to 6 do begin c[i,j]:=1<<30; for k:=1 to 6 do c[i,j]:=min(c[i,j],a[i,k]+b[k,j]); end; end; procedure update(i,l,r:longint);inline;var m,t:longint; begin if l=r then begin for j:=1 to 6 do f[i,j,j]:=o[l,j]; for j:=1 to 5 do for k:=j+1 to 6 do f[i,j,k]:=f[i,j,k-1]+o[l,k]; for j:=2 to 6 do for k:=1 to j-1 do f[i,j,k]:=f[i,k,j]; fl[i]:=f[i];fr[i]:=f[i]; for j:=1 to 6 do fl[i,j,j]:=0; for j:=1 to 6 do fr[i,j,j]:=0; end else begin m:=(l+r)>>1;t:=i+i; merge(f[t],fl[t+1],tl); merge(fr[t],f[t+1],tr); merge(tl,tr,f[i]); fan(f[t],tt); merge(tl,tt,fl[i]); fan(f[t+1],tt); merge(tt,tr,fr[i]); getmin(fl[t],fl[i]); getmin(fr[t+1],fr[i]); end; end; procedure build(i,l,r:longint);inline;var m,t:longint; begin if l<r then begin m:=(l+r)>>1;t:=i+i; build(t,l,m); build(t+1,m+1,r); end; update(i,l,r); end; procedure ck(i,l,r:longint);inline;var m,t:longint; begin if l<r then begin m:=(l+r)>>1;t:=i+i; if x>m then ck(t+1,m+1,r) else ck(t,l,m); end; update(i,l,r); end; procedure find(i,l,r:longint);inline;var m,t:longint; begin if (x>l)or(y<r) then begin m:=(l+r)>>1;t:=i+i; if x<=m then find(t,l,m); if y>m then find(t+1,m+1,r); end else begin merge(tt,fl[i],t1); merge(t1,tl,t2); merge(t2,f[i],tt); merge(tl,f[i],t1); fan(f[i],t2); merge(t2,t1,tl); getmin(fr[i],tl); end; end; procedure find2(i,l,r,x:longint);inline;var m,t:longint; begin if l=r then begin merge(f[i],ll,t1); merge(t1,f[i],ll); getmin(f[i],ll); merge(f[i],lr,t1); merge(t1,f[i],lr); getmin(f[i],lr); getmin(lr,ll); end else begin m:=(l+r)>>1;t:=i+i; if x>m then begin merge(ll,f[t],t1); fan(f[t],t2); merge(t2,t1,ll); getmin(fr[t],ll); end else begin merge(f[t+1],lr,t1); fan(f[t+1],t2); merge(t1,t2,lr); getmin(fl[t+1],lr); end; if x<=m then find2(t,l,m,x) else find2(t+1,m+1,r,x); end; end; begin assign(input,'shortest.in');reset(input); assign(output,'shortest.out');rewrite(output); readln(n); for i:=1 to 6 do for j:=1 to n do read(o[j,i]); build(1,1,n); readln(task); for task:=1 to task do begin read(q); if q=1 then begin readln(y,x,o[x,y]); ck(1,1,n); end else begin readln(y1,x1,y2,x2); if x1>x2 then begin swap(x1,x2);swap(y1,y2); end; fillchar(ll,sizeof(ll),65); fillchar(lr,sizeof(ll),65); fillchar(tt,sizeof(tt),65); fillchar(tl,sizeof(tl),65); for i:=1 to 6 do tl[i,i]:=0; for i:=1 to 6 do tt[i,i]:=-ord(x1=x2)*o[x1,i]; x:=x1+1;y:=x2-1;find(1,1,n); find2(1,1,n,x2);rr:=ll; fillchar(ll,sizeof(ll),65); fillchar(lr,sizeof(ll),65); find2(1,1,n,x1); for i:=1 to 6 do for j:=1 to 6 do for k:=1 to 6 do begin ll[j,k]:=min(ll[j,k],ll[j,i]+ll[i,k]-o[x1,i]); rr[j,k]:=min(rr[j,k],rr[j,i]+rr[i,k]-o[x2,i]); end; merge(ll,tt,t1); merge(t1,rr,t2); writeln(t2[y1,y2]); end; end; close(input);close(output); end. 统计简单多边形内的格点数: program ex1; const e=1e-10; var a,x1,y1,x2,y2,p:array[0..1000] of longint; j1,j2:array[0..1000] of extended; n,i,j,k,l,t,r,ax,ay,bx,by,cx,cy,dx,dy,sj,xj,mid,tmp:longint; tt,k1,k2,dd,jy:extended; ans:int64; procedure swap(var a,b:longint);begin tmp:=a;a:=b;b:=tmp end; procedure swap(var a,b:extended);begin tt:=a;a:=b;b:=tt end; procedure fan(var a,b,e,f,c,d:longint); begin a:=c+d-a;b:=c+d-b;swap(a,b);swap(e,f) end; function gcd(a,b:int64):int64; begin if b=0 then gcd:=a else gcd:=gcd(b,a mod b) end; function ggcd(a,b,c,d:int64):int64; begin ggcd:=a div c *d*(d-1)>>1+b div c*d; a:=a mod c;b:=b mod c; if a=0 then exit; inc(ggcd,ggcd(c,(b+a*d)mod c,a,(b+a*d)div c)); end; procedure sort(l,r:longint);var i,j:longint; begin i:=l;j:=r; k1:=j1[(l+r)>>1]; k2:=j2[(l+r)>>1]; repeat while (j1[i]>k1+e)or (abs(j1[i]-k1)<e)and(j2[i]>k2+e) do inc(i); while (j1[j]<k1-e)or (abs(j1[j]-k1)<e)and(j2[j]<k2-e) do dec(j); if i<=j then begin swap(j1[i],j1[j]);swap(j2[i],j2[j]); swap(p[i],p[j]);inc(i);dec(j); end; until i>j; if l<j then sort(l,j); if i<r then sort(i,r); end; procedure cal(ax,ay,bx,by,l,r,o:longint);var dx,dy,g:int64; begin if l=r then exit; if ay>by then fan(ax,bx,ay,by,l,r); dx:=bx-ax;dy:=by-ay; g:=dx div gcd(dx,dy); inc(ans,int64(o)*(ggcd(dy,0,dx,r-ax)- ggcd(dy,0,dx,l-ax)+int64(ay)*int64(r-l))); if o=-1 then dec(ans,(dy*int64(r-ax)+dx-1)div dx+r-(r-ax-1)div g -(dy*int64(l-ax)+dx-1)div dx-l+(l-ax-1)div g -ord((l=ax)and(g<>1))); end; begin assign(input,'input.txt');reset(input); assign(output,'output.txt');rewrite(output); readln(n); for i:=1 to n do readln(x1[i],y1[i]); for i:=2 to n do x2[i]:=x1[i-1]; for i:=2 to n do y2[i]:=y1[i-1]; x2[1]:=x1[n];y2[1]:=y1[n];a:=x1; for i:=1 to n do for j:=i to n do if a[i]>a[j] then swap(a[i],a[j]); for i:=1 to n do if x1[i]>x2[i] then begin swap(x1[i],x2[i]); swap(y1[i],y2[i]); end; for i:=2 to n do if a[i]<>a[i-1] then begin t:=0; for j:=1 to n do if (x1[j]<=a[i-1])and(x2[j]>=a[i]) then begin inc(t); dd:=(y2[j]-y1[j])/(x2[j]-x1[j]); j1[t]:=y1[j]+dd*(a[i-1]-x1[j]); j2[t]:=y1[j]+dd*(a[i]-x1[j]); p[t]:=j; end; sort(1,t); for j:=1 to t>>1 do begin k:=p[j*2-1];l:=p[j*2]; ax:=x1[k];ay:=y1[k]; bx:=x2[k];by:=y2[k]; cx:=x1[l];cy:=y1[l]; dx:=x2[l];dy:=y2[l]; jy:=j1[j*2-1]-j1[j*2]; dd:=j2[j*2-1]-j2[j*2]; if dd<jy then begin fan(ax,bx,ay,by,a[i-1],a[i]); fan(cx,dx,cy,dy,a[i-1],a[i]); swap(dd,jy); end; jy:=(by-ay)/(bx-ax); dd:=(dy-cy)/(dx-cx); sj:=ord(jy<0); xj:=ord(dd>0); l:=a[i-1];r:=a[i]; while l<r do begin mid:=(l+r)>>1; if jy*(mid-ax+sj)+ay-dd*(mid-cx+xj)-cy>1-e then r:=mid else l:=mid+1; end; cal(ax,ay,bx,by,l,a[i],1); cal(cx,cy,dx,dy,l,a[i],-1); end; end; writeln(ans); close(input);close(output); end.