$2019$ 暑期刷题记录 $2$(基本算法专题)
生活随笔
收集整理的這篇文章主要介紹了
$2019$ 暑期刷题记录 $2$(基本算法专题)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
$ 2019 $ 暑期刷題記錄 $ 2 $ (基本算法專題)
$ by~~wch $
$ BZOJ~1958~Strange~Towers~of~Hanoi $ (動態規劃,遞推)
題目大意:
求有 $ n $ 個盤子和 $ 4 $ 座塔的漢諾塔問題。
$ solotion: $
$ 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: $
$ 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: $
$ 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: $
$ 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: $
$ 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: $
$ 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: $
$ POJ~3614~Sunscreen $(貪心,優先隊列)
$ solotion: $
$ 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: $
$ 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: $
$ 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: $
$ 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: $
$ 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: $
$ 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: $
$ 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: $
$ 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
總結
以上是生活随笔為你收集整理的$2019$ 暑期刷题记录 $2$(基本算法专题)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: POJ 3889 Fractal Str
- 下一篇: POJ 2054 Color a Tre