8 0 分 最 后 两 点 R E

P1001 A+B Problem

Perry0301 @ 2024-10-24 15:20:53

简单的代码:

#include<bits/stdc++.h>
using namespace std;
long long a,b,i,ii;
int jia(int x,int y)
{
    int aa=x/y*y+x%y;
    int bb=y/x*x+y%x;
    return aa+bb;
}
int main()
{
    cin>>a>>b;
    for(i=-10000;;i++)
    {
        if(i==a)
        {
            break;
        }
    }
    for(ii=-10000;;ii++)
    {
        if(ii==b)
        {
            break;
        }
    }
    cout<<jia(i,ii);
    return 0;
 } 

by tbdsh @ 2024-10-24 15:24:03

@Perry0301 a,b 可以为0


by yzm0325 @ 2024-10-24 15:36:16

@Perry0301 你这写的啥啊,我这个可以AC,你看看

#include <bits/stdc++.h>
using namespace std;

const int maxn = 1000010;
int w[maxn], tot, a, b, ans;

int top() {
    return w[1]; // 返回根节点
}

void modify(int x) { // 插入时自底向上修复 x 号节点
    if(x == 1 || w[x] > w[x / 2]) return; // x 已经是根或符合小根堆性质
    swap(w[x], w[x / 2]);
    modify(x / 2); // 递归继续修复
}
void push(int x) { // 插入元素 x
    w[++tot] = x; // 直接插到尾部
    modify(tot); // 修复
}

void repair(int x) { // 删除时自上而下修复 x 号节点
    if(x * 2 > tot) return; // 已经是叶子节点
    int tar = x * 2; // 右节点一定存在
    if(x * 2 + 1 <= tot) tar = w[x * 2] < w[x * 2 + 1] ? x * 2 : x * 2 + 1;
    // 如果有左节点,tar 取两节点的最小值
    if(w[x] < w[tar]) return; // 不违反小根堆性质说明修复成功,返回
    swap(w[x], w[tar]); // 否则和小的交换
    repair(tar); // 继续修复
}
void pop() { // 弹掉最小值
    swap(w[1], w[tot--]); // 压行技巧,交换尾部节点并将尾节点设为无效
    repair(1); // 从根节点修复
}

int main() {
    cin >> a >> b;
    push(a);
    push(b); // 输入的数加入堆
    while(tot) {
        ans += top();
        pop(); // 每次加上堆中的第一个数并弹掉
    }
    cout << ans; // 输出
    return 0;
}

by Phantom_Landler @ 2024-10-24 15:59:10

@yzm0325 你这也不行,看我这个

#include <bits/stdc++.h>

#define endl '\n'
#define mid ((l + r) >> 1)
using namespace std;
using ll = long long;
const int N = 100;
struct tree {
    int l, r;
    ll sum, tag;
};
int a[N];
tree tr[N * 4];

void pushup(int p) {
    tr[p].sum = tr[tr[p].l].sum + tr[tr[p].r].sum;
}

void change(int p,int k,int l,int r) {
    tr[p].sum += (r - l + 1) * k;
    tr[p].tag += k;
}

void pushdown(int p,int l,int r) {
    change(tr[p].l,tr[p].tag,l,mid);
    change(tr[p].r,tr[p].tag,mid + 1,r);
    tr[p].tag = 0;
}

void build(int p, int l, int r) {
    if (l == r) {
        tr[p].sum = a[l];
        return;
    }
    tr[p].l = p << 1, tr[p].r = p << 1 | 1;
    build(tr[p].l,1,mid), build(tr[p].r,mid + 1,r);
    pushup(p);
}

void modify(int p,int k,int ql,int qr,int l,int r) {
    if(ql <= l && r <= qr) {
        tr[p].tag += k;
        return;
    }
    pushdown(p,l,r);
    if(ql <= mid) modify(tr[p].l,k,ql,qr,l,mid);
    if(qr > mid) modify(tr[p].r,k,ql,qr,mid + 1,r);
    pushup(p);
}

ll query(int p,int ql,int qr,int l,int r) {
    if(ql <= l && r <= qr) {
        return tr[p].sum;
    }
    pushdown(p,l,r);
    ll res = 0;
    if(ql <= mid) res += query(p,ql,qr,l,mid);
    if(qr > mid) res += query(p,ql,qr,mid + 1,r);
    return res;
}

int main() {
    int n = 2;
    for(int i = 1;i <= n;i++) {
        cin >> a[i];
    }
    build(1,1,n);
    for(int i = 1;i <= n;i++) {
        modify(1,a[i],i,i,1,n);
    }
    cout << query(1,1,n,1,n) << endl;
    return 0;
}

by crz_qwq @ 2024-10-25 14:24:22

@Phantom_Landler 你这也不行,看我这个

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
mt19937 rng(time(0));
int root,tot;
struct node{
    int val,pri,ls,rs,sz;
    int sum,maxn;
    int rev,add;
}tr[N];
int New(int x)
{
    ++tot;
    tr[tot].sum=tr[tot].maxn=tr[tot].val=x;
    tr[tot].pri=rng();
    tr[tot].rev=tr[tot].add=tr[tot].ls=tr[tot].rs=0;
    tr[tot].sz=1;
    return tot;
}
void pushup(int p)
{
    tr[p].sum=tr[tr[p].ls].sum+tr[tr[p].rs].sum+tr[p].val;
    tr[p].maxn=tr[p].val;
    if(tr[p].ls)tr[p].maxn=max(tr[p].maxn,tr[tr[p].ls].maxn);
    if(tr[p].rs)tr[p].maxn=max(tr[p].maxn,tr[tr[p].rs].maxn);
    tr[p].sz=tr[tr[p].ls].sz+tr[tr[p].rs].sz+1;
}
void addtag(int p,int d)
{
    tr[p].val+=d;
    tr[p].add+=d;
    tr[p].sum+=tr[p].sz*d;
    tr[p].maxn+=d;
}
void pushdown(int p)
{
    if(tr[p].rev)
    {
        swap(tr[p].ls,tr[p].rs);
        if(tr[p].ls)tr[tr[p].ls].rev^=1;
        if(tr[p].rs)tr[tr[p].rs].rev^=1;
        tr[p].rev=0;
    }
    if(tr[p].add)
    {
        if(tr[p].ls)addtag(tr[p].ls,tr[p].add);
        if(tr[p].rs)addtag(tr[p].rs,tr[p].add);
        tr[p].add=0;
    }   
}
void split(int p,int k,int &L,int &R)
{
    if(!p)
    {
        L=R=0;
        return ;
    }
    pushdown(p);
    if(tr[tr[p].ls].sz<k)
    {
        L=p;
        split(tr[p].rs,k-tr[tr[p].ls].sz-1,tr[p].rs,R);
    }
    else
    {
        R=p;
        split(tr[p].ls,k,L,tr[p].ls);
    }
    pushup(p);
}
int merge(int L,int R)
{
    if(!L||!R)
        return L|R;
    if(tr[L].pri<=tr[R].pri)
    {
        pushdown(L);
        tr[L].rs=merge(tr[L].rs,R);
        pushup(L);
        return L;
    }
    pushdown(R);
    tr[R].ls=merge(L,tr[R].ls);
    pushup(R);
    return R;
}
void REVERSE(int l,int r)
{
    int L,R,p; 
    split(root,l-1,L,R);
    split(R,r-l+1,R,p);
    tr[R].rev^=1;
    root=merge(L,merge(R,p)); 
}
void ADD(int l,int r,int d)
{
    int L,R,p;
    split(root,l-1,L,R);
    split(R,r-l+1,R,p);
    addtag(R,d);
    root=merge(L,merge(R,p));
}
int GETSUM(int l,int r)
{
    int L,R,p;
    split(root,l-1,L,R);
    split(R,r-l+1,R,p);
    int res=tr[R].sum;
    root=merge(L,merge(R,p));
    return res;
} 
int GETMAX(int l,int r)
{
    int L,R,p;
    split(root,l-1,L,R);
    split(R,r-l+1,R,p);
    int res=tr[R].maxn;
    root=merge(L,merge(R,p));
    return res;
}
signed main()
{
    int x,y;
    cin>>x>>y;
    for(int i=1;i<=4;++i)
        root=merge(root,New(0));
    ADD(1,2,x);
    ADD(3,4,y);
    REVERSE(1,2);
    REVERSE(3,4);
    cout<<GETSUM(1,2)-GETMAX(1,2)+GETSUM(3,4)-GETMAX(3,4);
}

by Binah_OVO @ 2024-10-27 08:46:59

看看我的?☝️

#include <bits/stdc++.h>
using namespace std;
const int L = 5005;
int a[L],b[L],c[L];
void in(int a[])
{
    string d;
    cin>>d;
    int len = d.size();
    for(int i=0;i<len;i++) 
        a[len-i]=d[i]-'0';
    a[0]=len;
    return;
}
void out(int a[])
{
    for(int i=a[0];i>=1;i--)
        cout << a[i];
    cout<<endl;
    return;
}
void add(int a[],int b[],int c[])
{
    int len = max(a[0],b[0]),r=0;
    for(int i=1;i<=len;i++)
    {
        c[i]=a[i]+b[i]+r;
        r=c[i]/10;
        c[i]=c[i]%10;
    }
    if(!r) c[0]=len;
    else c[c[0]=len+1]=r;
    return;
}
int main()
{
    in(a);
    in(b);
    add(a,b,c);
    out(c);
    return 0;
}

by Yorg @ 2024-11-11 20:50:44

看我的


#include <bits/stdc++.h>
    using namespace std;
struct Node
{
    int l, r, val, tag;
};
Node tree[1000010];
int a[1000010];
int build(int l, int r, int index_)
{
    tree[index_].l = l;
    tree[index_].r = r;
    if (l == r)
    {
        tree[index_].val = a[l];
        return a[l];
    }
    tree[index_].val = build(l, l + (r - l) / 2, index_ * 2)+build(l+(r-l)/2+1,r,index_*2+1);return tree[index_].val;
}
int Fd(int l,int r,int index_){
    if(l>r)return 0;
  if(l==tree[index_].l&&r==tree[index_].r){
  return tree[index_].val;
  }
  return Fd(l,min(r,tree[index_*2].r),index_*2)+Fd(max(l,tree[index_*2+1].l),r,index_*2+1)+(r-l+1)*tree[index_].tag;
}
int main()
{
  cin>>a[1]>>a[2];
  build(1,2,1);
  cout<<Fd(1,2,1);

}

by crz_qwq @ 2024-11-12 18:52:02

@Binah_OVO 区区高精度,怎么能和"序列终结者"相比呢XD

@Yorg 区区线段树,怎么能和"序列终结者"相比呢XD


|