日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/10 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 $2019$ 暑期刷题记录 $2$(基本算法专题) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

$ 2019 $ 暑期刷題記錄 $ 2 $ (基本算法專題)

$ by~~wch $



$ BZOJ~1958~Strange~Towers~of~Hanoi $ (動態規劃,遞推)

題目大意:

求有 $ n $ 個盤子和 $ 4 $ 座塔的漢諾塔問題。

$ solotion: $

  • 首先需要參考一下三座塔的漢諾塔問題: $ g[i]=2*g[i-1]+1 $
  • 然后我們將四座塔轉換為三座塔問題:將前 $ i $ 個盤子一道2號塔,剩下的 $ n-i $ 個為三漢諾問題移到4號塔,再將前 $ i $ 個用四漢諾塔問題移到4號塔。
  • $ 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: $

  • 比較明顯的二維前綴和問題
  • 就是這一題有點卡常,如果暴力轉一維前綴和會超時
  • 我們需要自己尋找每個點前綴和的關系:
  • $ 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,然后求出最少的減少次數
  • 每頭牛的身高減少次數是確定的,我們對于每一對可以互相看見的牛,他們中間的牛的身高都要減少一次
  • 所以我們在 $ A_i $ 處加一,在 $ B_i+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 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+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}) $
  • 然后本題就比較好做了, $ A^B $ 的所有約數之和就是讓上式中所有 $ c_i $ 乘上 $ B $ 即可
  • 然后括號里面的東西直接用分治求即可
  • $ 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: $

  • 很早之前就做過了,好像之前叫稻草人來著
  • 就是算出每一個點在x軸上可以允許的最左端和最右端
  • 然后按最左然后按最左端排序,挨個在優先隊列里加入最右端信息
  • 一旦到達一個最右端,將它覆蓋的所有點刪去(包括優先隊列的某些信息也會失效,用一個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(初始為0)
  • 最后還為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 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: $

  • 最近總是碰到這種模擬題,直接 $ bitset $ 模擬就行了。
  • 置于轉移,我們直接用二進制的或運算和左右移模擬復制粘貼就好
  • 然后判斷輸出
  • $ 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: $

  • 對于一個環形,我們總要去想有沒有斷環的方法
  • 而這道題目有一個性質:最優答案一定可以存在兩個相鄰的人之間沒有聯系,相當于一條鏈
  • 于是我們用前綴和來計算每個人需要操作的次數: $ f[i]=|s[i]-s[k]| $ , $ s[k] $ 為 鏈的左端
  • 我們發現只要 $ 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: $

  • 這個就是高精度的進制轉換,我們模擬一下就好
  • $ 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$(基本算法专题)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。