分治与二分
分治/二分
●分治/二分算法本质上都是采用了“分而治之”的思想,因此放在一起来讲。
●所谓分而治之,即把一个大的问题转化成一个、两个或多个小的问题之和。
P1908 逆序对
#include <iostream> #include <cstdio> #include <queue> using namespace std; int num[500010]; int res[500010]; long long ans = 0; int n; void d_sort(int x, int y) { //cout << n << "**" << endl; if(x+1>=y) return; int m = x+(y-x)/2; int p = x, q = m, i = x; d_sort( p, m); d_sort( m, y); while(p < m || q < y) { if(q >= y || (p<m && num[p]<=num[q])) { res[i++] = num[p++]; } else res[i++]=num[q++], ans += (m-p); } for (int j = x; j < y; j++) num[j]=res[j]; } int main() { // freopen("P1908_11.in","r", stdin); // freopen("P19_11.txt", "w", stdout); cin >> n; //cout << n << " 11" << endl; for (int i = 1; i <= n; i++) { cin >> num[i]; } d_sort(1, n+1); // for (int i = 1; i <= n; i ++) { // cout << num[i] <<" "; // }cout << endl; cout << ans <<endl; //fclose(stdin); //fclose(stdout); }
P1083借教室
#include <iostream> #include <string> #include <vector> #include <algorithm> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <iomanip> using namespace std; namespace FastIO { #define gc() readchar() #define pc(a) putchar(a) #define SIZ (int)(1e6+15) char buf1[SIZ],*p1,*p2; char readchar() { if(p1==p2)p1=buf1,p2=buf1+fread(buf1,1,SIZ,stdin); return p1==p2?EOF:*p1++; } template<typename T>void read(T &k) { char ch=gc();T x=0,f=1; while(!isdigit(ch)){if(ch=='-')f=-1;ch=gc();} while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=gc();} k=x*f; } template<typename T>void write(T k) { if(k<0){k=-k;pc('-');} static T stk[66];T top=0; do{stk[top++]=k%10,k/=10;}while(k); while(top){pc(stk[--top]+'0');} } }using namespace FastIO; #define int long long #define INF 0x3f3f3f3f3f3f3f3f #define N (int)(1e6+15) int n,m,a[N],b[N],c[N],l[N],r[N]; signed main() { read(n);read(m); for(int i=1; i<=n; i++) read(a[i]); for(int i=1; i<=m; i++) { read(c[i]);read(l[i]);read(r[i]); b[l[i]]+=c[i];b[r[i]+1]-=c[i]; } int j=m,res=m,sum=0; for(int i=1; i<=n; i++) { sum+=b[i]; if(sum>a[i]) { while(sum>a[i]) { b[l[j]]-=c[j]; b[r[j]+1]+=c[j]; if(l[j]<=i&&i<=r[j]) sum-=c[j]; j--; } res=j; } } if(res<m)printf("-1\n%lld",res+1); else puts("0"); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】