10.8

 1 #include
 2 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 }
T1
 1 #include
 2 #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||xreturn 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;ii)
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(l2+C(l,-1)-C(l,r)),++l;
40         while(rr));
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 }
T2
  1 #include
  2 #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     vectorh[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     vectorvec[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 }
T380分

 

 

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)$强艹过??

$咱也不敢说,咱也不敢问。$

你可能感兴趣的:(10.8)