#include<bits/stdc++.h>usingnamespace std;int cnt1, cnt2, x, y;boolcheck(int num){if(num - num /(x * y)<cnt1 + cnt2)return0;if(num -num / x < cnt1)return0;if(num - num / y < cnt2)return0;return1;}intmain(){
cin >> cnt1 >>cnt2 >>x>>y;int l =1, r=2e9;int ans;int cnt =0;while(l <=r){int mid =l+(r-l)/2;if(check(mid))
r=mid -1, ans = mid;else
l=mid +1;}printf("%d", ans);return0;}
区间按位与
#include<bits/stdc++.h>usingnamespace std;constint N =2e5+10;int n, m;int mn[N][50], Lg[N], a[N], ans;voidpre(){
Lg[1]=0;for(int i =2; i <= n; i++){
Lg[i]= Lg[i >>1]+1;}}voidST_create(){// 创建ST表for(int i =1; i <= n; i++){
mn[i][0]= a[i];}for(int j =1; j <= Lg[n]; j++){for(int i =1; i <= n -(1<< j)+1; i++){
mn[i][j]= mn[i][j -1]& mn[i +(1<<(j -1))][j -1];// 改成或运算}}}intST_q(int l,int r){// ST表求区间或int k = Lg[r - l +1];return mn[l][k]& mn[r -(1<< k)+1][k];// 改成或运算}intmain(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin >> n >> m;for(int i =1; i <= n; i++){
cin >> a[i];}pre();ST_create();while(m--){int a1,a2;
cin>>a1>>a2;
cout<<ST_q(a1,a2)<<'\n';}return0;}
区间按位或
#include<bits/stdc++.h>usingnamespace std;constint N =2e5+7;int m, n, a[N], mn[N][50], Lg[N], ans;voidpre(){
Lg[1]=0;for(int i=2; i<=n; i++)
Lg[i]= Lg[i >>1]+1;}voidST_create(){for(int i=1; i <=n; i++)
mn[i][0]=a[i];for(int j =1;j<= Lg[n];j++)for(int i =1;i<=n-(1<<j)+1;i++)
mn[i][j]=mn[i][j-1]| mn[i +(1<<(j-1))][j-1];}intST_query(int l,int r){int k = Lg[r -l+1];return mn[l][k]| mn[r -(1<< k)+1][k];}intmain(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>n>>m;for(int i =1;i <=n; i++)
cin >>a[i];pre();ST_create();while(m--){int a1, a2;
cin >> a1>>a2;
cout <<ST_query(a1, a2)<<'\n';}return0;}
松鼠接松果
#include<bits/stdc++.h>usingnamespace std;constint N =1e5+7;int n,D,ans =0x3f3f3f3f;structPOS{int x,y;booloperator<(const POS &t)const{return x < t.x;}} p[N];
deque<int> maxn,minn;intmain(){
cin >> n >> D;for(int i=1;i<=n;i++)
cin>>p[i].x>>p[i].y;sort(p+1,p+1+n);int L =1;for(int i=1;i<=n;i++){while(!maxn.empty()&& p[maxn.back()].y<p[i].y)
maxn.pop_back();
maxn.push_back(i);while(!minn.empty()&& p[minn.back()].y > p[i].y)
minn.pop_back();
minn.push_back(i);while(L < i && p[maxn.front()].y - p[minn.front()].y >= D){
ans =min(ans,p[i].x-p[L].x);
L++;while(!maxn.empty()&& maxn.front()< L)
maxn.pop_front();while(!minn.empty()&& minn.front()< L)
minn.pop_front();}}if(ans ==0x3f3f3f3f)
cout<<"-1";else
cout << ans << endl;return0;}
排序
#include<bits/stdc++.h>usingnamespace std;#defineintlonglongconstint N =2e5+7;int n, m, a[N], b[N], top;structNODE{int k, x;}st[N];signedmain(){
cin >>n>>m;for(int i=1; i<=n; i++){
cin >>a[i];
b[i]=a[i];}while(m--){int k, x;
cin >>k>>x;while(top && st[top].x <= x)
top--;
st[++top]={k,x};}int nn = st[1].x;sort(b +1,b+1+nn);int l=1,r=nn;
st[top +1].x =0;for(int i=1; i <= top; i++){int t = st[i].x - st[i +1].x;if(st[i].k ==1)while(t--)
a[nn--]=b[r--];elsewhile(t--)
a[nn--]=b[l++];}for(int i=1;i<=n; i++)
cout << a[i]<<" ";return0;}
区间最小值
#include<bits/stdc++.h>usingnamespace std;constint N =1e6+10;int n, m, a[N], mn[N][20], Lg[N], l, r;voidpre(){
Lg[1]=0;for(int i =2; i <= n; i++){
Lg[i]= Lg[i >>1]+1;}}voidST_create(){// 创建ST表for(int i =1; i <= n; i++){
mn[i][0]= a[i];}for(int j =1; j <= Lg[n]; j++){for(int i =1; i <= n -(1<< j)+1; i++){
mn[i][j]=min(mn[i][j -1], mn[i +(1<<(j -1))][j -1]);}}}intST_qmin(int l,int r){// ST表求minint k = Lg[r - l +1];returnmin(mn[l][k], mn[r -(1<< k)+1][k]);}intmain(){
cin >> n >> m;for(int i =1; i <= n; i++)
cin >> a[i];pre();ST_create();while(m--){
cin >> l >> r;
cout <<ST_qmin(l, r)<< endl;}return0;}
区间gcd
#include<bits/stdc++.h>usingnamespace std;constint N =1e6+10;int n, m, a[N], mn[N][20], Lg[N], l, r, ans;voidpre(){
Lg[1]=0;for(int i =2; i <= n; i++){
Lg[i]= Lg[i >>1]+1;}}voidST_create(){// 创建ST表for(int i =1; i <= n; i++){
mn[i][0]= a[i];}for(int j =1; j <= Lg[n]; j++){for(int i =1; i <= n -(1<< j)+1; i++){
mn[i][j]=gcd(mn[i][j -1], mn[i +(1<<(j -1))][j -1]);}}}intST_qgcd(int l,int r){// ST表求gcdint k = Lg[r - l +1];returngcd(mn[l][k], mn[r -(1<< k)+1][k]);}// 快读快写:intread(){int ret =0;char ch =getchar();while(ch <'0'|| ch >'9')
ch =getchar();while(ch >='0'&& ch <='9'){
ret = ret *10+ ch -'0';
ch =getchar();}return ret;}voidwrite(int x){if(x >=10)write(x /10);putchar(x %10+'0');}intmain(){
n =read(), m =read();for(int i =1; i <= n; i++)
a[i]=read();pre();ST_create();while(m--){
l =read(), r =read();
ans =ST_qgcd(l, r);write(ans);putchar('\n');}return0;}
史莱姆融合
#include<bits/stdc++.h>usingnamespace std;constint N =1e6+10;int n, fa[N], so[N], nxt[N];// fa:集合最左元素 so:集合最右元素voidinit(int n){for(int i =1; i <= n; i++){
fa[i]= i;
so[i]= i;}}intfind(int x){if(fa[x]!= x)
fa[x]=find(fa[x]);return fa[x];}voidmerge(int i,int j){int x =find(i), y =find(j);if(x == y)return;
nxt[so[x]]= y;// x集合的最右元素指向y集合的最左元素
fa[y]= x;// y集合的最左元素更新为x集合的最左元素
so[x]= so[y];// x集合的最右元素更新为y集合的最右元素}intmain(){
cin >> n;init(n);for(int i =1; i <= n -1; i++){int x, y;
cin >> x >> y;merge(x, y);}for(int i =find(1); i; i = nxt[i]){// 这里int i=find几也行,因为最后find()总是返回链表最左边的元素
cout << i <<' ';}return0;}
检测敌人
#include<bits/stdc++.h>usingnamespace std;constint N =1e3+10;structenemy{double x, y, r, l;bool v;} e[N];boolcmp(enemy a, enemy b){return a.r < b.r;}intmain(){int n;double r;while(cin >> n >> r &&!(n ==0&& r ==0)){bool flag =false;memset(e,0,sizeof e);for(int i =1; i <= n; i++){
cin >> e[i].x >> e[i].y;if(r * r < e[i].y * e[i].y)// 不可覆盖{
flag =true;}else{// 求在x轴上的投影
e[i].l = e[i].x -sqrt(r * r - e[i].y * e[i].y);
e[i].r =sqrt(r * r - e[i].y * e[i].y)+ e[i].x;
e[i].v =false;}}if(flag){// 以敌人为中心,r为半径的圆与x无交点:不可覆盖
cout <<-1<< endl;continue;}sort(e +1, e +1+ n, cmp);int ans =0;for(int i =1; i <= n; i++){// 从小到大检测每一条线段if(e[i].v ==false){// 此敌人还未被检测for(int j = i; j <= n; j++){if(e[j].v ==false&& e[j].l <= e[i].r)// 未被检测的敌人线段与当前线段有交集{
e[j].v =true;}}
e[i].v =true;
ans++;}}
cout << ans << endl;}return0;}
小码哥的福利
#include<bits/stdc++.h>usingnamespace std;#definelllonglongconstint N =55;
ll n, m, a[N], sum[N];structtianpin{
ll b, c;} t[N];intcmp(tianpin x, tianpin y){// 甜品甜度由小到大排序return x.b < y.b;}
ll add(int l,int r){// 计算sum[l]到sum[r]的和
ll ans =0;for(int i = l; i <= r; i++){
ans += sum[i];}return ans;}intmain(){
cin >> n;
ll maxn =0;// 最高耐受度for(int i =1; i <= n; i++){
cin >> a[i];
maxn =max(maxn, a[i]);}sort(a +1, a + n +1);
cin >> m;for(int i =1; i <= m; i++){
cin >> t[i].b;if(t[i].b > maxn)// 此甜品没有能容忍的人{
cout <<-1<< endl;return0;}}for(int i =1; i <= m; i++){
cin >> t[i].c;}sort(t +1, t + n +1, cmp);for(int i =1; i <= m; i++){// sum数组赋初值,每个甜品找第一个能吃的人for(int j =1; j <= n; j++){if(a[j]>= t[i].b){
sum[j]+= t[i].c;break;}}}for(int i =1; i <= n; i++){// 平均化
ll tmp =(add(i, n))/(n - i +1);if(tmp <= sum[i]){// 此人分配的甜品过多->分给右边的人
sum[i +1]+= sum[i]- tmp;
sum[i]= tmp;}}
ll ans =0;for(int i =1; i <= n; i++){
ans =max(ans, sum[i]);}
cout << ans << endl;return0;}
屠龙勇者
#include<bits/stdc++.h>usingnamespace std;#definelllonglongconstint N =1e5+10;int n, m;int d[N];int w[N];int v[N];// 勇士是否被使用intmain(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n >> m;for(int i =1; i <= n; i++){
cin >> d[i];}sort(d +1, d +1+ n);for(int i =1; i <= m; i++){
cin >> w[i];}sort(w +1, w +1+ m);int j =1;for(int i =1; i <= n; i++){// dint flag =0;for(; j <= m; j++){// w// 找第一个>=d的wif(v[j]==0&& w[j]>= d[i]){
v[j]=1;
flag =1;break;}}if(flag ==0){// 有头没有勇士能消灭
cout <<"NO"<< endl;return0;}}
cout <<"YES"<< endl;return0;}