$2019$ 暑期刷题记录 $2$(基本算法专题)

$ 2019 $ 暑期刷题记录 $ 2 $ (基本算法专题)

$ by~~wch $



$ BZOJ~1958~Strange~Towers~of~Hanoi $ (动态规划,递推)

题目大意:

求有 $ n $ 个盘子和 $ 4 $ 座塔的汉诺塔问题。

$ solotion: $

  1. 首先需要参考一下三座塔的汉诺塔问题: $ g[i]=2*g[i-1]+1 $
  2. 然后我们将四座塔转换为三座塔问题:将前 $ i $ 个盘子一道2号塔,剩下的 $ n-i $ 个为三汉诺问题移到4号塔,再将前 $ i $ 个用四汉诺塔问题移到4号塔。
  3. $ f[n]=min_{1\leq i < n}{2*f[i]+g[n-i]} $

$ code: $

#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>#define ll long long
#define db double
#define rg register intusing namespace std;int n=12;
int g[13],f[13];inline int qr(){register char ch; register bool sign=0; rg res=0;while(!isdigit(ch=getchar()))if(ch=='-')sign=1;while(isdigit(ch))res=res*10+(ch^48),ch=getchar();if(sign)return -res; else return res;
}int main(){//freopen(".in","r",stdin);//freopen(".out","w",stdout);for(rg i=1;i<=n;++i) g[i]=2*g[i-1]+1;for(rg i=1;i<=n;++i){f[i]=1<<30;for(rg j=0;j<i;++j)f[i]=min(f[i],f[j]*2+g[i-j]);}for(rg i=1;i<=n;++i)printf("%d\n",f[i]);return 0;
}


$ BZOJ ~1218 ~ $ 激光炸弹(二维前缀和)

$ solotion: $

  1. 比较明显的二维前缀和问题
  2. 就是这一题有点卡常,如果暴力转一维前缀和会超时
  3. 我们需要自己寻找每个点前缀和的关系:
  4. $ s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j] $

$ code: $

#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<queue>
#include<vector>
#include<map>
#include<set>#define ll long long
#define db double
#define inf 0x7fffffff
#define rg register intusing namespace std;int n,m,ans,a,b,c;
int f[5003][5003];inline int qr(){char ch; //int sign=1;while((ch=getchar())<'0'||ch>'9');//    if(ch=='-')sign=-1;int res=ch^48;while((ch=getchar())>='0'&&ch<='9')res=res*10+(ch^48);return res;
}int main(){//freopen(".in","r",stdin);//freopen(".out","w",stdout);n=qr(),m=qr();for(rg i=1;i<=n;++i){a=qr()+1,b=qr()+1,c=qr();f[a][b]=c;}for(rg i=1;i<=5001;++i)for(rg j=1;j<=5001;++j)f[i][j]+=f[i-1][j]+f[i][j-1]-f[i-1][j-1];for(rg i=m;i<=5001;++i){for(rg j=m;j<=5001;++j){ans=max(ans,f[i][j]-f[i-m][j]-f[i][j-m]+f[i-m][j-m]);}}printf("%d\n",ans);return 0;
}


$ POJ~3263~Tallest~Cow $(前缀和,贪心)

$ solotion: $

  1. 很久以前就做过,一道比较有意思的前缀和做法
  2. 我们首先可以贪心想到牛的身高每次只减1,然后求出最少的减少次数
  3. 每头牛的身高减少次数是确定的,我们对于每一对可以互相看见的牛,他们中间的牛的身高都要减少一次
  4. 所以我们在 $ A_i $ 处加一,在 $ B_i+1 $ 处减一然后求前缀和就可以知道每一头牛的减少次数
  5. 然后这题不用担心每头牛都要比两端点的牛矮,所有区间一定是包含关系,而不会相交

$ code: $

#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>#define ll long long
#define db double
#define inf 0x7fffffff
#define rg register intusing namespace std;int n,m,h,q,a,b;
int s[10001];
bool use[10001][10001];inline int qr(){char ch;while((ch=getchar())<'0'||ch>'9');int res=ch^48;while((ch=getchar())>='0'&&ch<='9')res=res*10+(ch^48);return res;
}int main(){//freopen(".in","r",stdin);//freopen(".out","w",stdout);n=qr(),m=qr(),h=qr(),q=qr();while(q--){a=qr(),b=qr();if(a>b)swap(a,b);if(use[a][b])continue;use[a][b]=1;--s[a+1];++s[b];}for(rg i=1;i<=n;++i){s[i]=s[i]+s[i-1];printf("%d\n",h+s[i]);}return 0;
}


$ POJ~1845~Sumdiv $(约数和定理)(分治)

题目大意:

求 $ A^B $ 的所有约数之和

$ solotion: $

  1. 首先要知道约数和定理: $ (1+p_1+p_1^2+...+p_1^{c_1})(1+p_2+p_2^2+...+p_2^{c_2})...*(1+p_k+p_k^2+...+p_k^{c_k}) $
  2. 然后本题就比较好做了, $ A^B $ 的所有约数之和就是让上式中所有 $ c_i $ 乘上 $ B $ 即可
  3. 然后括号里面的东西直接用分治求即可

$ code: $

#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>#define ll long long
#define db double
#define rg register intusing namespace std;const int mod=9901;int n,m,ans;inline int qr(){register char ch; register bool sign=0; rg res=0;while(!isdigit(ch=getchar()))if(ch=='-')sign=1;while(isdigit(ch))res=res*10+(ch^48),ch=getchar();if(sign)return -res; else return res;
}inline int ksm(ll x,int y){ll res=1;while(y){if(y&1)res=res*x%mod;x=x*x%mod; y>>=1;}return res;
}inline int ask(int x,int y){if(y==1)return x;if(y&1) return ((ll)ask(x,y>>1)*(ksm(x,y>>1)+1)%mod+ksm(x,y)%mod)%mod;else return (ll)ask(x,y>>1)*(ksm(x,y>>1)+1)%mod;
}int main(){//freopen(".in","r",stdin);//freopen(".out","w",stdout);while(~scanf("%d%d",&n,&m)){if(m==0){puts("1");continue;}ans=1;for(rg i=2;i*i<=n;++i){if(n%i)continue;rg x=0; while(!(n%i))++x,n/=i;ans=(ll)ans*(ask(i%mod,x*m)+1)%mod;}if(n!=1)ans=(ll)ans*(ask(n%mod,m)+1)%mod;printf("%d\n",ans);}return 0;
}


$ POJ~2018~Best~Cow~Fences $(二分答案构造新权值)

单独的一篇题解



$ POJ~3889~Fractal~Streets $(模拟)

单独的一篇题解



$ Codeforces~670C~Cinema $(离散化)

$ solotion: $

  1. 很傻的一道题目,直接离散化求出每种语言对应的人
  2. 然后枚举电影,求出其权值,最大的那个就是答案

$ code: $

#include<stdio.h>
#include<map>
using namespace std;
int main()
{int n;while(scanf("%d",&n)!=EOF){int m,ple=0,sat=0,fi=1,sci[200005],bn[200005],cn;map<int,int> mp;for(int i=0;i<n;i++){scanf("%d",&sci[i]);mp[sci[i]]++;}scanf("%d",&m);for(int i=1;i<=m;i++){scanf("%d",&bn[i]);}for(int i=1;i<=m;i++){scanf("%d",&cn);if(mp[bn[i]]>ple){ple=mp[bn[i]];sat=mp[cn];fi=i;}else if(mp[bn[i]]==ple&&mp[cn]>sat){sat=mp[cn];fi=i;}}  printf("%d\n",fi);}return 0;
}


$ POJ~3784~Running~Media $(动态中位数)

题目大意:

依次读入数列,求每一个数加入时的中位数。

$ solotion: $

  1. 直接用小根堆加大根堆维护一下就行
  2. 每次记录两边总数,判断加到哪边即可

$ code: $

#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
#include<iostream>
using namespace std;int n,t,x,a,b,cnt;inline void read(int &x){char ch=getchar();char c=ch;x=0;while(ch<'0' || ch>'9') {c=ch;ch=getchar();}while(ch>='0' && ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}if(c== '-') x=-x;
}std::priority_queue <int> lq,sq;int main(){read(t);while(t--){read(cnt);read(n);while(!lq.empty())  lq.pop();while(!sq.empty())  sq.pop();cout<<cnt<<' '<<((n+1)/2)<<endl;for(int i = 1;i <= n;++ i){read(x);lq.push(x);sq.push(-x);if(i%2==0) continue;while(lq.top()!=-sq.top()){a=lq.top();lq.pop();b=-sq.top();sq.pop();sq.push(-a);lq.push(b);}cout<<lq.top()<<' ';if(((i+1)/2)%10==0) puts("");else if((n%2==1 && i==n) || (n%2==0 && i==n-1)) puts("");}    }return 0;
}


$ POJ~2299~Ultra-QuickSort $(逆序对)

题目大意:

求一个序列里的逆序对。

$ solotion: $

  1. 没想会在基本算法里碰见这个,挺怀念的。
  2. 我们用树状数组维护一下(需要离散化),和最长上升子序列里一个板子


$ POJ~3614~Sunscreen $(贪心,优先队列)

$ solotion: $

  1. 这个题目比较容易想到贪心
  2. 我们将奶牛和防晒霜分开,都以阳光强度(最小值)排序
  3. 然后我们可以想到枚举防晒霜
  4. 用一个优先队列依次存下当前防晒霜能保护的牛
  5. 然后我们用优先队列求出右端点(最大阳光强度)最小的牛用这个防晒霜
  6. 这样肯定比用最大阳光强度的好,因为我们将最大阳光强度大的留给了后面的防晒霜。
  7. 而最小阳光强度在枚举时得到了保障(我们是依次加入防晒霜能保护的牛的)。

$ code: $

#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>#define ll long long
#define db double
#define rg register intusing namespace std;int n,m,ans;struct su{int x,y;inline bool operator <(const su &z)const{return x<z.x;} 
}a[2505],b[2505];struct pi{int x,y;inline bool operator <(const pi &z)const{return y>z.y;}
};priority_queue<pi> q;inline int qr(){register char ch; register bool sign=0; rg res=0;while(!isdigit(ch=getchar()))if(ch=='-')sign=1;while(isdigit(ch))res=res*10+(ch^48),ch=getchar();if(sign)return -res; else return res;
}int main(){//freopen(".in","r",stdin);//freopen(".out","w",stdout);n=qr(); m=qr();for(rg i=1;i<=n;++i)a[i].x=qr(),a[i].y=qr();sort(a+1,a+n+1);for(rg i=1;i<=m;++i)b[i].x=qr(),b[i].y=qr();sort(b+1,b+m+1);for(rg i=1,l=1;i<=m;++i){while(l<=n&&a[l].x<=b[i].x){pi x; x.x=l; x.y=a[l].y; q.push(x); ++l;}while(!q.empty()&&q.top().y<b[i].x)q.pop();while(!q.empty()&&b[i].y){++ans; --b[i].y; q.pop();}}printf("%d\n",ans);return 0;
}


$ POJ~3190~Stall~Reservation $(前缀和,优先队列)

$ solotion: $

  1. 这道题的最小畜栏数是确定的
  2. 我们直接用差分约束前缀和的方法即可得出答案
  3. 但是这道还需要我们输出畜栏序号,这就需要我们动态维护那几个畜栏没有用过
  4. 我们用优先队列优化,按左端点枚举每一头牛,然后用优先队列记录它的右端点以及它用的哪一个畜栏,(畜栏的使用状态也需要用一个优先队列维护(因为我们要最小化畜栏数目))
  5. 然后在枚举过程中还要对优先队列进行取出操作,将用完的畜栏记录下来,病房会优先队列里去

$ code: $

#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>#define ll long long
#define db double
#define rg register intusing namespace std;int n,tt,ans;
int as[50005];struct su{int l,r,id;inline bool operator <(const su &x)const{return l<x.l;}
}a[50005];struct pi{int x,y;inline bool operator <(const pi &z)const{return x>z.x;}
};priority_queue<pi> q;
priority_queue<int, vector<int>, greater<int> >p;inline int qr(){register char ch; register bool sign=0; rg res=0;while(!isdigit(ch=getchar()))if(ch=='-')sign=1;while(isdigit(ch))res=res*10+(ch^48),ch=getchar();if(sign)return -res; else return res;
}int main(){//freopen(".in","r",stdin);//freopen(".out","w",stdout);n=qr();for(rg i=1;i<=n;++i)a[i].l=qr(),a[i].r=qr(),a[i].id=i,p.push(i);sort(a+1,a+n+1);for(rg i=1;i<=n;++i){while(!q.empty()&&q.top().x<a[i].l){p.push(q.top().y); q.pop();}as[a[i].id]=p.top(); p.pop();pi x; x.x=a[i].r; x.y=as[a[i].id]; q.push(x);ans=max(ans,as[a[i].id]);}printf("%d\n",ans);for(rg i=1;i<=n;++i)printf("%d\n",as[i]);return 0;
}

$ POJ~1328~Radar~Installation $ (贪心,单调队列)

$ Solution: $

  1. 很早之前就做过了,好像之前叫稻草人来着
  2. 就是算出每一个点在x轴上可以允许的最左端和最右端
  3. 然后按最左然后按最左端排序,挨个在优先队列里加入最右端信息
  4. 一旦到达一个最右端,将它覆盖的所有点删去(包括优先队列的某些信息也会失效,用一个bool数组记录每个是否已被覆盖即可)

$ code: $

#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>#define ll long long
#define db double
#define rg register intusing namespace std;int t,n,d,ans;struct su{db x,y,l,r;inline void find(){db k=sqrt((db)d*d-y*y);l=x-k; r=x+k;}inline bool operator <(su z){return l<z.l;}
}a[1005];inline int qr(){register char ch; register bool sign=0; rg res=0;while(!isdigit(ch=getchar()))if(ch=='-')sign=1;while(isdigit(ch))res=res*10+(ch^48),ch=getchar();if(sign)return -res; else return res;
}int main(){//freopen(".in","r",stdin);//freopen(".out","w",stdout);while(++t){ ans=0;n=qr(); d=qr();if(!n&&!d)break;for(rg i=1;i<=n;++i){a[i].x=qr(); a[i].y=qr();a[i].find(); if(a[i].y>d)ans=-1;} sort(a+1,a+n+1);if(ans!=-1){ db s=-1e9;for(rg i=1;i<=n;++i){//cout<<a[i].l<<" "<<a[i].r<<endl;if(a[i].l<=s)s=min(a[i].r,s);else ++ans, s=a[i].r;}} printf("Case %d: %d\n",t,ans);}return 0;
}


$ POJ~2054~Color~a~Tree $ (复杂的贪心)

单独的一篇题解



$ POJ~2965~The~Pilots~Brother'~Refrigerator $ (状态压缩,结论)

$ Solution: $

  1. 数据范围很小,可以直接状态压缩,然后暴力枚举
  2. 但是这一题还有一个结论可以更快:
  3. 对于一个处于闭合的开关将它所在行列上每一个元素异或1(初始为0)
  4. 最后还为1的格子需要改变状态。
  5. 这个结论博主也不知道怎么证,所以还是第一种方案保险

$ Code: $

#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>#define ll long long
#define db double
#define rg register intusing namespace std;int a,b,n,ans;inline int qr(){register char ch; register bool sign=0; rg res=0;while(!isdigit(ch=getchar()))if(ch=='-')sign=1;while(isdigit(ch))res=res*10+(ch^48),ch=getchar();if(sign)return -res; else return res;
}int main(){//freopen(".in","r",stdin);//freopen(".out","w",stdout);char ch; a=15; b=4369;for(rg i=1;i<=4;++i,a<<=4,b=4369){for(rg j=1;j<=4;++j,b<<=1){while((ch=getchar())!='+'&&ch!='-')continue;if(ch=='+') n^=a,n^=b,n^=a&b;}} rg x=n;while(x)ans+=(x&1),x>>=1;printf("%d\n",ans);for(rg i=1;i<=4;++i)for(rg j=1;j<=4;++j,n>>=1)if(n&1)printf("%d %d\n",i,j);return 0;
}


$ POJ~2083~Fractal $ (模拟)

$ Solution: $

  1. 最近总是碰到这种模拟题,直接 $ bitset $ 模拟就行了。
  2. 置于转移,我们直接用二进制的或运算和左右移模拟复制粘贴就好
  3. 然后判断输出

$ Code: $

#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<vector>
#include<bitset>
#include<queue>
#include<map>
#include<set>#define ll long long
#define db double
#define rg register intusing namespace std;int t,f,n,m=1;
bitset<805> s[805];inline int qr(){register char ch; register bool sign=0; rg res=0;while(!isdigit(ch=getchar()))if(ch=='-')sign=1;while(isdigit(ch))res=res*10+(ch^48),ch=getchar();if(sign)return -res; else return res;
}int main(){//freopen(".in","r",stdin);//freopen(".out","w",stdout);s[1][1]=1; n=7;for(rg i=2;i<=n;++i,m*=3){ //扩大for(rg j=m+1;j<=m*2;++j)s[j]=s[j-m]<<m;//中间的那一部分for(rg j=1;j<=m;++j){s[j]|=s[j]<<(m*2);//右上那部分s[j+m*2]=s[j]; //第三行复制第一行即可}}while((n=qr())!=-1){rg x=1;for(rg i=1;i<n;++i)x*=3;for(rg i=1;i<=x;++i){for(rg j=1;j<=x;++j){if(s[i][j])putchar(88);else putchar(32);}puts("");//快速输出}puts("-");}return 0;
}


$ POJ~3741~Raid $ (平面最近点对)

单独的一篇题解



$ CH~0805~ $ 防线 (二分,前缀和,特殊性质)

单独的一篇题解



$ POJ~3197~Corral~the~Cows $ (二分,最大子矩阵)

单独的一篇题解



$ BZOJ~1045~ $ 糖果传递 (中位数,环形均分纸牌)

$ Solution: $

  1. 对于一个环形,我们总要去想有没有断环的方法
  2. 而这道题目有一个性质:最优答案一定可以存在两个相邻的人之间没有联系,相当于一条链
  3. 于是我们用前缀和来计算每个人需要操作的次数: $ f[i]=|s[i]-s[k]| $ , $ s[k] $ 为 链的左端
  4. 我们发现只要 $ s[k] $ 为 $ s[i] $ 的中位数时,总和最小,于是我们找到最小的那个中位数计算答案。

$ Code: $

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e6+5;
ll n,a[N],sum,s[N];
int main()
{cin>>n;for(int i=1;i<=n;i++)cin>>a[i],sum+=a[i];sum/=n;for(int i=1;i<=n;i++)a[i]-=sum,s[i]=s[i-1]+a[i];sort(s+1,s+n+1);sum=0;for(int i=1;i<=n;i++)sum+=abs(s[n/2+1]-s[i]);cout<<sum;return 0;
}


$ POJ~1723~Soldiers $ (中位数)

单独的一篇题解



$ POJ~1220~Number~Base~Conversion $ (进制转换)

$ Solution: $

  1. 这个就是高精度的进制转换,我们模拟一下就好

$ Code: $

#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>#define ll long long
#define db double
#define rg register intusing namespace std;int t,a,b,n,tt;
int s[100005];
int as[100005];
string c;inline int qr(){register char ch; register bool sign=0; rg res=0;while(!isdigit(ch=getchar()))if(ch=='-')sign=1;while(isdigit(ch))res=res*10+(ch^48),ch=getchar();if(sign)return -res; else return res;
}int main(){//freopen(".in","r",stdin);//freopen(".out","w",stdout);t=qr();while(t--){ tt=0;a=qr(); b=qr();cin>>c; n=c.size();for(rg i=0;i<n;++i){if(c[i]>='0'&&c[i]<='9')s[i+1]=c[i]-'0';if(c[i]>='A'&&c[i]<='Z')s[i+1]=c[i]-'A'+10;if(c[i]>='a'&&c[i]<='z')s[i+1]=c[i]-'a'+36;} rg f=n,k=0;while(f){k=0; f=0;for(rg i=f;i<=n;++i){k=s[i]+k*a;s[i]=k/b;k%=b;if(!f&&s[i])f=i;}as[++tt]=k;}cout<<a<<" "<<c<<endl<<b<<" ";for(rg i=tt;i>=1;--i){if(as[i]>=0&&as[i]<=9)putchar(as[i]+'0');if(as[i]>=10&&as[i]<=35)putchar(as[i]+'A'-10);if(as[i]>=36&&as[i]<=61)putchar(as[i]+'a'-36);}puts(""); puts("");}return 0;
}


$ POJ~1050~To~the~Max $ (最大子矩阵和)

单独的一篇题解



$ HDOJ~4864~Task $ (贪心)

$ Solution: $

  1. 很套路的一道贪心
  2. 首先我们的价值算法和复杂度挖了一个坑:最小的时间价值比最大的难度价值要高
  3. 所以我们贪心可以直接按时间来,所以我们先按难度排序
  4. 然后用优先队列维护每一个机器能完成的最长时间的任务
  5. 然后暴力算答案即可(我们可以发现难度一维并不会产生后效性)

$ Code: $

#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>#define ll long long
#define db double
#define rg register intusing namespace std;ll ans;
int n,m,t;struct su{int x,y;inline bool operator <(const su &z)const{if(x==z.x)return y>z.y;return x>z.x;}
}a[100005],b[100005];
multiset<su> s,k;inline bool cmp(const su &x,const su &y){return x.y<y.y;
}inline int qr(){register char ch; register bool sign=0; rg res=0;while(!isdigit(ch=getchar()))if(ch=='-')sign=1;while(isdigit(ch))res=res*10+(ch^48),ch=getchar();if(sign)return -res; else return res;
}int main(){//freopen(".in","r",stdin);//freopen(".out","w",stdout);while(~scanf("%d%d",&n,&m)){t=0; ans=0; s=k;for(rg i=1;i<=n;++i)a[i].x=qr(),a[i].y=qr();for(rg i=1;i<=m;++i)b[i].x=qr(),b[i].y=qr();sort(a+1,a+n+1,cmp);sort(b+1,b+m+1,cmp);for(rg i=1,j=1;i<=n;++i){while(j<=m&&b[j].y<=a[i].y)s.insert(b[j]), ++j;multiset<su>::iterator it;it=s.lower_bound(a[i]);if(it==s.end())continue;ans+=500*((*it).x)+2*((*it).y);s.erase(it); ++t;}printf("%d %lld\n",t,ans);}return 0;
}

转载于:https://www.cnblogs.com/812-xiao-wen/p/11249256.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/263171.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我,只关心接口

我们去饭店吃饭&#xff0c;坐下。然后叫&#xff1a;服务员&#xff01;好&#xff0c;服务员来了。你会说&#xff1a;倒茶。或说&#xff1a;点菜。是吧。你不会说&#xff1a;来&#xff0c;我们讨论一下什么是面向对象吧。这是为什么呢&#xff1f;很简单&#xff0c;对你…

POJ 2054 Color a Tree (贪心)

$ POJ~2054~Color~a~Tree $ $ solution: $ 我们先从题中抽取信息&#xff0c;因为每个点的费用和染色的次数有关&#xff0c;所以我们可以很自然的想到先给权值大的节点染色。但是题目还说每个节点染色前它的父亲节点也必须被染色&#xff0c;这就有了很多的后效性。 暂时没有办…

使用Null Object设计模式[转]

在ESFramework的设计实现中&#xff0c;很多地方都用到了Null Object设计模式。Null Object模式的含义在于&#xff0c;提供一个对象给指定的类型&#xff0c;用以代替这个对象为空的情况。 Null Object提供了“什么也不做”的行为,隐藏来自它的合作者的细节。对于如何理解和应…

angular input使用输入框filter格式化日期

最近使用angular日期选取器。只需要把所选的输出迄今input输入框&#xff0c;根据默认的假设&#xff0c;显示是在时间的形式的时间戳。不符合规定。需要格成一个特定的公式格公式。但input上ng-model不能直接对用于filter。因此内容需要一种方法来在这里显示格式化。 网上寻找…

CH0805 防线 (二分值域,前缀和,特殊性质)

$ CH~0805~ $ 防线 (二分值域&#xff0c;前缀和&#xff0c;特殊性质) $ solution: $ 注意博主所给题面的输出和原题有些不同 这道题当时想了很久很久&#xff0c;就是想不到怎么写。果然还是太 $ vegetable $ 了。首先我们可以肯定的是&#xff0c;我们不能暴力枚举&#xff…

基于Layui实现的树形菜单页面

基于Layui实现的树形菜单页面具体方法实现方法一&#xff1a;针对Layui模板的前后端统一更新1. 删除2. 添加3. 后端方法二&#xff1a;基于Dtree实现的纯前端树形增删改文中的组件地址具体方法实现 实现树形菜单&#xff0c;本文将给出两种实现方式。 针对Layui前端模板EasyW…

POJ 1723 Soldiers (中位数)

$ POJ~1723~Soldiers $ (中位数) $ solution: $ 这道题说难也不算太难&#xff0c;但是当时自己想的很矛盾。所以还是列一篇题解。 这道题首先比较容易看出来的就是&#xff1a;行和列是两个分开的问题&#xff0c;而且行的移动就是一个仓库选址的板子&#xff0c;直接求中位数…

(一)Windows环境下汇编编程读书笔记

看了一节关于80x86系列处理器简史&#xff0c;不知道云里和雾里&#xff0c;什么晶体管啊&#xff0c;什么什么之类的不知道云里和雾里&#xff0c;看了讲什么都不知道啊&#xff01; 转载于:https://www.cnblogs.com/Nuxgod/articles/692990.html

Docker知识点总结及其命令的使用

DockerDocker简介Docker与Tomcat有什么区别&#xff1f;Docker与虚拟机有什么区别&#xff1f;Docker的基本组成Docker的联合文件系统Docker基本命令Docker中的几个重要组件一、容器数据卷二、Dockerfile三、Docker网络虚拟机共享网络的三种方式Docker共享网络的四种方式Docker…

主题:Spring注解入门(转载)

原文链接&#xff1a;http://www.iteye.com/topic/295348 1. 使用Spring注解来注入属性 1.1. 使用注解以前我们是怎样注入属性的 类的实现&#xff1a; Java代码 public class UserManagerImpl implements UserManager { private UserDao userDao; public void …

XDJM的情意比山高,比海深!!

又是兄弟姐妹们帮我提前过的生日&#xff0c;我们这帮人从SC出来后还没好好聚过&#xff0c;乘这个机会把大家约了出来。星期五整整一天都很快乐&#xff0c;特别是我&#xff0c;NANA&#xff0c;小乔期待着晚上的聚餐&#xff0c;期待着金贸的蛋糕&#xff0c;嘿嘿。。他们好…

最大子矩阵和

最大子矩阵和 $ n^3 $ 算法 $ solution: $ 首先我们不难想到枚举上下左右边界&#xff0c;然后两层循环统计权值和&#xff0c;复杂度 $ O(n^6) $ 。这个我们用前缀和可以省去后面的循环&#xff0c;将复杂度降成 $ O(n^4) $ 。然后我们考虑不枚举上下左右四个边界&#xff0c;…

Springfox-swagger使用详解

Springfox-swagger使用详解什么是Swagger&#xff1f;Swagger的具体使用一、导入依赖二、建立Swagger配置类三、通过Swagger测试接口引用什么是Swagger&#xff1f; 是一个开源的API Doc的框架可以将我们的Controller中的API方法以文档的形式展现&#xff0c;并支持为其添加注…

Android中调用系统已安装的播放器来播放网络流媒体视频

2019独角兽企业重金招聘Python工程师标准>>> 实现思路比较简单几行代码就可以搞定&#xff0c;在界面放一个Button或者带有播放图标的imageview&#xff0c;点击事件中调用本地播放器来播放。 Uri uri Uri.parse("http://218.200.69.66:8302/upload/Media/20…

WireShark详解

WireShark详解Wireshark介绍Wireshark使用一、基础数据说明二、指定数据包过滤Wireshark安装Wireshark介绍 Wireshark是一款可以运行在多平台的网络抓包工具&#xff0c;可以嗅探通过本机网卡的各类网络包&#xff0c;并对它们的协议&#xff0c;源、目标地址等多种数据进行解…

多图上传 - Web Uploader

http://fex.baidu.com/webuploader/ 官方DEMO&#xff0c;我都不想说了&#xff0c;各种问题。参考ShuaiBi文章 http://www.cnblogs.com/ismars/p/4176912.html 用了bootstrap 代码百度网盘地址&#xff1a;http://pan.baidu.com/s/1pJkj9wf 自己参照改改就好了。 //所有文件上…

[开发手记] 使用.NET实现你的IP切换器

发布日期&#xff1a;2007.4.17 作者&#xff1a;Anytao ©2007 Anytao.com 转贴请注明出处&#xff0c;留此信息。 下载&#xff1a;[Anytao.IPHelper][代码下载&#xff0c;近期上传] 本文将介绍以下内容&#xff1a; • 批处理文件应用 • 调用外部应用 • 文件处理…

Linux文件读写改权限详解

Linux文件读写改权限详解文件的rwx权限 [ r ][ w ][ x ]该文件可读(read)该文件可修改(write)该文件可执行(execute) 注意&#xff1a;只有当该文件所在目录有写权限&#xff0c;并且该文件有[w]权限&#xff0c;才可以进行删除操作 目录的rwx权限 [ r ][ w ][ x ]可查看目录…

EF 从sqlserver2008 迁移到 2005出现的BUG

在VS10Server08中使用EF4.4&#xff0c;发布数据库为SQL05&#xff0c;发生错误的问题 问题描述环境描述&#xff1a;工具为VS2010SQL08 R2&#xff0c;EntityFramework版本为4.4&#xff08;在Framework4.5中为5.0&#xff09;&#xff0c;在本机完全测试完成后&#xff0c;发…

转盘不转动的问题

2019独角兽企业重金招聘Python工程师标准>>> Stack Overflow is a question and answer site for professional and enthusiast programmers. Its 100% free, no registration required. jQuery Rotate - IE7 & IE8 Issues up vote 11 down vote favorite 3 I a…