![](http://img.e-com-net.com/image/info8/2b246dbcfe82488397e9aa432bbc4e31.gif)
1 #include2 using namespace std; 3 inline int read(){ 4 register int x=0,f=1;char ch=getchar(); 5 while(!isdigit(ch)) f=ch=='-'?-1:1,ch=getchar(); 6 while(isdigit(ch)) x=(x<<1)+(x<<3)+ch-48,ch=getchar(); 7 return x*f; 8 } 9 int n; 10 struct Heap{ 11 int heap[200005],cnt; 12 void push(int V){ 13 heap[++cnt]=V;int x=cnt; 14 while(x>1){ 15 int now=x>>1; 16 if(heap[now]>heap[x]) swap(heap[now],heap[x]); 17 x=now; 18 } 19 } 20 int top(){return heap[1];} 21 bool empty(){return cnt==0;} 22 void pop(){ 23 heap[1]=heap[cnt--];int x=1; 24 while((x<<1)<=cnt){ 25 int now=x<<1; 26 if((now|1)<=cnt&&heap[now|1] ; 27 if(heap[now]<heap[x]) swap(heap[now],heap[x]); 28 x=now; 29 } 30 } 31 }q; 32 long long ans; 33 int main(){//freopen("text.in","r",stdin); 34 n=read(); 35 for(int i=1;i<=n;++i){ 36 int W=read(); 37 if(!q.empty()){ 38 int V=q.top(); 39 if(W>V) ans+=W-V,q.push(W),q.pop(); 40 } 41 q.push(W); 42 } 43 printf("%lld\n",ans); 44 return 0; 45 }
![](http://img.e-com-net.com/image/info8/2b246dbcfe82488397e9aa432bbc4e31.gif)
1 #include2 #define mod 1000000007LL 3 #define LL long long 4 using namespace std; 5 inline int read(){ 6 register int x=0,f=1;char ch=getchar(); 7 while(!isdigit(ch)) f=ch=='-'?-1:1,ch=getchar(); 8 while(isdigit(ch)) x=(x<<1)+(x<<3)+ch-48,ch=getchar(); 9 return x*f; 10 } 11 int q,Max,bl,bel[100005]; 12 LL ans[100005],fac[100005],inv[100005],Ans; 13 struct node{int n,m,id;}Q[100005]; 14 bool cmp(const node &a,const node &b){return bel[a.n]!=bel[b.n]?bel[a.n] b.m;} 15 LL Mo(LL x){return (x>=mod)?(x-=mod):((x<0)?(x+=mod):x);} 16 LL C(int x,int y){ 17 if(x<0||y<0||x return 0; 18 return fac[x]*inv[y]%mod*inv[x-y]%mod; 19 } 20 int main(){ 21 fac[0]=inv[0]=inv[1]=1; 22 for(int i=1;i<=1e5;++i) fac[i]=fac[i-1]*i%mod; 23 for(int i=2;i<=1e5;++i) inv[i]=inv[mod%i]*(mod-mod/i)%mod; 24 for(int i=2;i<=1e5;++i) inv[i]=inv[i-1]*inv[i]%mod; 25 26 int Id=read();//我终于不用靠id过日子啦! 27 q=read(); 28 for(int i=1;i<=q;++i) Q[i].n=read(),Q[i].m=read(),Max=max(Max,Q[i].n),Q[i].id=i; 29 bl=sqrt(Max)+1; 30 for(int i=1;i i) 31 for(int j=(i-1)*bl+1;j<=i*bl&&j<=Max;++j) 32 bel[j]=i; 33 sort(Q+1,Q+q+1,cmp); 34 int l=Q[1].n,r=Q[1].m; 35 for(int i=0;i<=r;++i) Ans=Mo(Ans+C(l,i)); 36 for(int i=1;i<=q;++i){//先变大再变小 37 int L=Q[i].n,R=Q[i].m; 38 while(r>R) Ans=Mo(Ans-C(l,r--)); 39 while(l 2+C(l,-1)-C(l,r)),++l; 40 while(r r)); 41 while(l>L) Ans=Mo((Ans+C(l-1,r)-C(l-1,-1))*inv[2]%mod),--l; 42 ans[Q[i].id]=Ans; 43 } 44 for(int i=1;i<=q;++i) printf("%lld\n",ans[i]); 45 return 0; 46 }
![](http://img.e-com-net.com/image/info8/2b246dbcfe82488397e9aa432bbc4e31.gif)
1 #include2 #define N 100005 3 #define LL long long 4 #define lch k<<1 5 #define rch k<<1|1 6 using namespace std; 7 inline int read(){ 8 register int x=0,f=1;char ch=getchar(); 9 while(!isdigit(ch)) f=ch=='-'?-1:1,ch=getchar(); 10 while(isdigit(ch)) x=(x<<1)+(x<<3)+ch-48,ch=getchar(); 11 return x*f; 12 } 13 int n,m,jsxm,scsl;//建设项目,视察数量 14 struct JS{int a,b,c,d;}js[N]; 15 struct SC{int u,v;}sc[N<<1]; 16 17 18 namespace substack1{ 19 int a[105][105],ans[2][105],vis[105][105]; int cnt; 20 const int lx[4]={0,-1,0,1},ly[4]={-1,0,1,0}; 21 bool che(int x,int y,int i){ 22 return (x<=0||x>i||y<=0||y>m||!a[x][y]||vis[x][y])?false:true; 23 } 24 void dfs(int x,int y,int i){ 25 vis[x][y]=1; 26 for(int j=0;j<=3;++j) 27 if(che(x+lx[j],y+ly[j],i)) 28 dfs(x+lx[j],y+ly[j],i); 29 } 30 void work(){ 31 for(int i=1;i<=jsxm;++i){ 32 int A=js[i].a,b=js[i].b,c=js[i].c,d=js[i].d; 33 for(int x=A;x<=c;++x) 34 for(int y=b;y<=d;++y) 35 a[x][y]=1; 36 } 37 for(int i=1;i<=n;++i){ 38 for(int j=1;j<=m;++j) ans[0][i]+=a[i][j]; 39 ans[0][i]+=ans[0][i-1]; 40 cnt=0; 41 for(int x=1;x<=i;++x) 42 for(int y=1;y<=m;++y) vis[x][y]=0; 43 for(int x=1;x<=i;++x) 44 for(int y=1;y<=m;++y){ 45 if(vis[x][y]||!a[x][y]) continue; 46 cnt++;dfs(x,y,i); 47 } 48 ans[1][i]=cnt; 49 } 50 for(int i=1;i<=scsl;++i){ 51 int u=sc[i].u,v=sc[i].v; 52 printf("%d\n",ans[u][v]); 53 } 54 } 55 } 56 57 namespace substack2{ 58 LL S[N],ans[N];int lim; 59 void add(int pos,LL V){ 60 while(pos<=lim) S[pos]+=V,pos+=pos&-pos; 61 } 62 LL Get(int pos){ 63 LL ans=0; 64 while(pos) ans+=S[pos],pos-=pos&-pos; 65 return ans; 66 } 67 void work(){lim=n+1; 68 for(int i=1;i<=jsxm;++i){ 69 int a=js[i].a,b=js[i].b,c=js[i].c,d=js[i].d; 70 if(a==c) add(a,d-b+1),add(a+1,-(d-b+1)); 71 else add(a,1),add(c+1,-1); 72 } 73 for(int i=1;i<=n;++i) ans[i]=Get(i)+ans[i-1]; 74 for(int i=1;i<=scsl;++i){ 75 int v=sc[i].v; 76 printf("%lld\n",ans[v]); 77 } 78 } 79 } 80 //jsxm,scsl 81 namespace substack3{ 82 struct node{ 83 int id,l,r; 84 friend bool operator < (const node &a,const node &b){ 85 return a.l<b.l; 86 } 87 }; 88 vector h[N],l[N]; 89 int fa[N<<1]; 90 inline int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);} 91 void Merge(int id,int x,int y,int ans=0){ 92 for(int i=0;i<(int)h[x].size();++i) 93 if(h[x][i].l<=y&&h[x][i].r>=y){ 94 ans=h[x][i].id; 95 goto ed; 96 } 97 for(int i=0;i<(int)l[y].size();++i) 98 if(l[y][i].l<=x&&l[y][i].r>=x){ 99 ans=l[y][i].id; 100 goto ed; 101 } 102 ed:if(ans) fa[find(ans)]=fa[find(id)]; 103 } 104 void work(){ 105 for(int i=1;i<=jsxm;++i) fa[i]=i; 106 for(int i=1;i<=jsxm;++i){ 107 int a=js[i].a,b=js[i].b,c=js[i].c,d=js[i].d; 108 h[a].push_back((node){i,b,d});h[c].push_back((node){i,b,d}),l[b].push_back((node){i,a,c}),l[d].push_back((node){i,a,c}); 109 } 110 for(int i=1;i<=jsxm;++i){ 111 int a=js[i].a,b=js[i].b,c=js[i].c,d=js[i].d; 112 if(js[i].a==js[i].c) 113 Merge(i,a,b-1),Merge(i,a,d+1),Merge(i,a-1,b),Merge(i,a+1,b); 114 else 115 Merge(i,a-1,b),Merge(i,c+1,d),Merge(i,a,b-1),Merge(i,a,b+1); 116 } 117 int cnt=0; 118 for(int i=1;i<=jsxm;++i) if(fa[i]==i) cnt++; 119 printf("%d\n",cnt); 120 } 121 } 122 123 namespace substack4{ 124 struct node{ 125 int l,r,id,lz; 126 friend bool operator < (const node &a,const node &b){ 127 return a.l<b.l; 128 } 129 }; 130 vector vec[N]; 131 int fa[N<<1],t[N<<1],cnt; 132 LL ans[N]; 133 inline int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);} 134 void work(){ 135 for(int i=1;i<=jsxm;++i) vec[js[i].a].push_back((node){js[i].b,js[i].d,i,0}); 136 for(int i=1;i<=n;++i) sort(vec[i].begin(),vec[i].end()); 137 for(int i=1;i<=scsl;++i) fa[i]=i; 138 for(int i=1;i<=n;++i){ 139 ans[i]=ans[i-1]; 140 for(int j=0;j<(int)vec[i].size();++j){ 141 if(j!=(int)vec[i].size()-1&&vec[i][j].r==vec[i][j+1].l-1){ 142 vec[i][j].lz=1; 143 vec[i][j+1].l=vec[i][j].l; 144 continue; 145 } 146 cnt=0; 147 for(int k=0;k<(int)vec[i-1].size();++k){ 148 if(vec[i-1][k].lz) continue; 149 if(max(vec[i-1][k].l,vec[i][j].l)>min(vec[i-1][k].r,vec[i][j].r)) continue; 150 t[++cnt]=find(vec[i-1][k].id); 151 } 152 sort(t+1,t+cnt+1); 153 cnt=unique(t+1,t+cnt+1)-(t+1); 154 ans[i]-=cnt-1; 155 for(int k=1;k<=cnt;++k) fa[find(t[k])]=find(vec[i][j].id); 156 } 157 } 158 for(int i=1;i<=scsl;++i){ 159 int v=sc[i].v; 160 printf("%lld\n",ans[v]); 161 } 162 } 163 } 164 165 166 int main(){//freopen("text.in","r",stdin); 167 int id=read(); 168 n=read(),m=read(),jsxm=read(),scsl=read(); 169 for(int i=1,a,b,c,d;i<=jsxm;++i){ 170 a=read(),b=read(),c=read(),d=read(); 171 js[i]=(JS){a,b,c,d}; 172 } 173 for(int i=1;i<=scsl;++i) sc[i].u=read(),sc[i].v=read(); 174 if(id<=4) substack1::work(); 175 else if(id<=8) substack2::work(); 176 else if(id<=12) substack3::work(); 177 else if(id<=16) substack4::work(); 178 else puts("从下午开始打到现在20分的部分分我都咩拿到,我死了,mmp"); 179 }
A. trade
做法一:同大脸$O(n^2)$dp
做法二:可反悔堆
B. sum
发现$S(n,m)$可以$O(1)$到达$S(n+1,m) S(n,m+1) S(n,m-1) S(n,m+1)$
那么可以用莫队了。
$O(n×sqrt(n))$
记得开大数组,因为会T
C. building
考试打完了前40分,一下午打完了后40分。
- 测试点一:暴力dfs即可。
- 测试点二:维护差分的差分,两次前缀和。(我用的树状数组是不是没救了)
- 测试点三:对每个一条,把它的行列四个顶点放到分别的行列vector里,然后查时直接用每个条条查上下左右然后并茶几维护并查性最后看有几个人的fa等于自己即可
- 测试点四:将每行的条按横坐标排序,然后直接暴力枚举上一行的条条即可
我的三四都是$O(n^2)$的。
好像听第一机房的大佬们说这题可以$O(n^2)$强艹过??
$咱也不敢说,咱也不敢问。$