BIT&spfa_081006day1
来源:互联网 发布:网络信息采集软件 编辑:程序博客网 时间:2024/06/03 22:39
又看了看,树状数组,明白了以前死背的的东西。关于离线算法有了初步的认识。另外,今天看了看spfa算法,这些的确都淡忘了。
BIT.pas_code:
var n,m,q,i,j,k,x1,y1,x2,y2:longint; c:array[1..1000,1..1000] of longint; z:char;procedure modify(i,j,k:longint);var temp:longint;begin temp:=j; while i<=n do begin j:=temp; while j<=m do begin c[i,j]:=c[i,j]+k; inc(j,j and -j); end; inc(i,i and -i); end;end;function sum(i,j:longint):longint;var temp,ans:longint;begin temp:=j; ans:=0; while i>0 do begin j:=temp; while j>0 do begin ans:=ans+c[i,j]; dec(j,j and -j); end; dec(i,i and -i); end; exit(ans);end;begin assign(input,'BIT.in'); reset(input); assign(output,'BIT.out'); rewrite(output); readln(n,m,q); for i:=1 to q do begin read(z); case z of 'C':begin readln(x1,y1,k); modify(x1,y1,k); end; 'Q':begin readln(x1,y1,x2,y2); writeln(sum(x2,y2)-sum(x1-1,y2)-sum(x2,y1-1)+sum(x1-1,y1-1)); end; end; end; close(input); close(output);end.
depressedJ.cpp_code:
#include<iostream>using namespace std;const int MXN=100010;const int MXQ=400010;struct opt{int t,q,n,x,y;}w[MXQ];int n,m,o,c[MXN];void optinsert(int t,int q,int n,int x,int y) {w[o].t=t; w[o].q=q; w[o].n=n; w[o].x=x; w[o].y=y;o++;}bool cmp(const opt &a,const opt &b) {return (a.n<b.n || (a.n==b.n&&a.t<b.t));}bool cmp2(const opt &a,const opt &b) {return (a.t<b.t);}void modify(int i,int k) {while (i<=n) {c[i]+=k;i+=i&(-i);}}int search(int i) {int ans=0;while (i>0) {ans+=c[i];i-=i&(-i);}return(ans);}int main(){int i,k,x,y,a[MXN];char st[3];freopen("depressedJ.in","r",stdin);freopen("depressedJ.out","w",stdout);scanf("%d%d",&n,&m);for(i=1;i<=n;i++) {scanf("%d",&a[i]);optinsert(0,0,a[i],i,0);}gets(st);for(i=1;i<=m;i++) {if (getchar()=='C') {scanf("%d%d",&x,&k);optinsert(i,1,a[x],x,0);optinsert(i,0,k,x,0);a[x]=k;}else {scanf("%d%d%d",&x,&y,&k);optinsert(i,2,k,x,y);}gets(st);}for(i=1;i<=n;i++) optinsert(m+1,1,a[i],i,0);sort(w,w+o,cmp);for(i=0;i<o;i++) if (w[i].q==2) w[i].y=search(w[i].y)-search(w[i].x-1);else if (w[i].q==0) modify(w[i].x,1); else modify(w[i].x,-1);sort(w,w+o,cmp2);for(i=0;i<o;i++)if (w[i].q==2) printf("%d\n",w[i].y);return 0;}
FloatingMedian.cpp_code:
#include<iostream>#define NEXT(a) (((a)*mul+add)%M)using namespace std;const int M=65536;int c[M+1];void modify(int i,int k) {while (i<=M) {c[i]+=k;i+=i&-i;}}int find(int k) {int i,cnt=0,ans=0;for(i=16;i>=0;i--) {ans+=1<<i;if (ans>M||cnt+c[ans]>=k) ans-=1<<i;else cnt+=c[ans];}return ans+1;}int main(){freopen("FloatingMedian.in","r",stdin);freopen("FloatingMedian.out","w",stdout); int seed,mul,add,n,k,i;cin>>seed>>mul>>add>>n>>k;int mid=(k+1)/2;unsigned long a=seed,b=seed;long long ans=0;for(i=1;i<=n;i++) {modify(a+1,1);a=NEXT(a);if (i>=k) {ans+=find(mid)-1;modify(b+1,-1);b=NEXT(b);}}cout<<ans<<endl;return 0;}
turncard.cpp_code:
#include<iostream>using namespace std;const int MXN=100010;int n,m;bool c[MXN];void modify(int i) {if (!i) return;while (i<=n) {c[i]=!c[i];i+=i&(-i);}}bool sum(int i) {bool ans=0;while (i>0) {ans^=c[i];i-=i&(-i);}return ans;}int main(){int i,x,y;char st[3];freopen("turncard.in","r",stdin);freopen("turncard.out","w",stdout);scanf("%d%d",&n,&m);gets(st);for(i=1;i<=m;i++) {if (getchar()=='T') {scanf("%d%d",&x,&y);modify(y);modify(x-1);}else{scanf("%d",&x);if (sum(n)^sum(x-1)) puts("no"); else puts("yes");}gets(st);}return 0;}
spfa.pas_code:
var a,b,e:array[1..1000] of longint; vis:array[1..2000] of boolean; q,d,f:array[1..2001] of longint; n,m,i,s,t:longint;procedure qsort(l,r:longint); var i,j,x,y:longint; begin i:=l; j:=r; x:=a[(l+r) shr 1]; repeat while a[i]<x do inc(i); while a[j]>x do dec(j); if not(i>j) then begin y:=a[i]; a[i]:=a[j]; a[j]:=y; y:=b[i]; b[i]:=b[j]; b[j]:=y; y:=e[i]; e[i]:=e[j]; e[j]:=y; inc(i); dec(j); end; until i>j; if i<r then qsort(i,r); if l<j then qsort(l,j); end;procedure spfa(s:longint); var i,k,l,t:longint; begin fillchar(vis,sizeof(vis),0); for i:=1 to n do d[i]:=maxlongint; d[s]:=0; l:=0; t:=1; q[1]:=s; vis[s]:=true; repeat l:=l mod 10000 +1; k:=q[l]; for i:=f[k] to f[k+1]-1 do if d[k]+e[i]<d[b[i]] then begin d[b[i]]:=d[k]+e[i]; if not vis[b[i]] then begin t:=t mod 10000 +1; q[t]:=b[i]; vis[b[i]]:=true; end; end; vis[k]:=false; until l=t; end;Begin readln(n,m); for i:=1 to m do readln(a[i],b[i],e[i]); qsort(1,m); for i:=1 to m do if f[a[i]]=0 then f[a[i]]:=i; f[n+1]:=m+1; for i:=n downto 1 do if f[i]=0 then f[i]:=f[i+1]; readln(s,t); spfa(s); writeln(d[t]);end.
- BIT&spfa_081006day1
- bit
- Bit++
- bit
- BIT
- Bit++
- 12bit,24bit,32bit颜色
- APCCAL bit
- 64 bit
- Bit数组
- Bit 操作
- bit操作
- Bit Operations
- bit operation
- byte bit
- Lowest Bit
- Lowest Bit
- Bit-map
- 第一次编程序求最大公约数2.15
- Notification的使用
- 由于隐式转换导致的负载过高的处理
- boost::pool概览
- Latex中文字体问题
- BIT&spfa_081006day1
- 杭电 1084
- 四、生成随即图形
- 算法竞赛入门经典 3.1 数组
- Java中常用的加密方法(JDK)
- WinCE中listview的应用
- 五,能动的图形
- Hibernate学习笔记1— Hibernate中的集合映射
- postfix用smtp.qq.com做relay发送邮件