cogs 2479.[HZOI 2016] 偏序(求四维偏序)

本文介绍了一道经典的四维偏序问题,并提供了一个高效的CDQ分治算法解决方案。通过对序列进行两次CDQ分治,结合树状数组来统计逆序对数量,实现了对满足特定条件的数对的有效计数。

题目链接:http://cogs.pro:8080/cogs/problem/problem.php?pid=2479

【题目描述】

给定一个有n个元素的序列,元素编号为1~n,每个元素有三个属性a,b,c,求序列中满足i<j且ai<aj且bi<bj且ci<cj的数对(i,j)的个数。

【输入格式】

第一行一个整数n,表示序列长度。

第二行n个整数,分别表示a1~an。

第三行n个整数,分别表示b1~bn。

第四行n个整数,分别表示c1~cn。

【输出格式】

一个整数,表示答案。

【样例输入】

5
1 5 3 4 2
2 5 3 4 1
1 2 5 3 4

【样例输出】

3

【样例解释】

满足条件的(i,j)共有以下三对:

(1,2)

(1,3)

(1,4)

【数据范围与约定】

对于30%的数据,n<=5000。

对于100%的数据,1<=n<=50000,保证所有的ai、bi、ci分别组成三个1~n的排列。

【来源】

HZOI 2016

 

题目思路:四维偏序裸题,CDQ套CDQ即a通过flag标记,在CDQ2的时候,b已经是有序的了,所以只用再c归并,d树状数组求和。

推荐这篇博客,看一下代码秒懂:http://www.cnblogs.com/candy99/p/6442434.html

我的AC代码:

#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#include<queue>
#include<stack>
#include<map>

using namespace std;

#define FOU(i,x,y) for(int i=x;i<=y;i++)
#define FOD(i,x,y) for(int i=x;i>=y;i--)
#define MEM(a,val) memset(a,val,sizeof(a))
#define PI acos(-1.0)

const double EXP = 1e-9;
typedef long long ll;
typedef unsigned long long ull;
const int INF = 0x3f3f3f3f;
const ll MINF = 0x3f3f3f3f3f3f3f3f;
const double DINF = 0xffffffffffff;
const int mod = 1e9+7;
const int N = 1e6+5;

struct node{
    int a,b,c,d;
    bool flag;
}a[N],tmp[N],tmp1[N];
int n;
ll ans;


int tree[N]; //tree数组按二进制存,根据n的末尾0的个数存取,树状数组

int lowbit(int x){return x&(-x);}
int Query(int x){  //返回1到x的前缀和
    int res=0;
    while(x){
        res+=tree[x];
        x-=lowbit(x);
    }
    return res;
}
void Add(int x,int v){  //实现a[x]+v;
    while(x<=n){        //注意这里是小于等于k,不是n,k是数据范围
        tree[x]+=v;
        x+=lowbit(x);
    }
}
void clearr(int x){
    while(x<=n){
        if(tree[x]==0)
            break;
        tree[x]=0;
        x+=lowbit(x);
    }
}

void CDQ2(int l,int r){
    if(l>=r) return;
    int mid = l+r>>1;
    CDQ2(l,mid);
    CDQ2(mid+1,r);
    int p=l,q=mid+1,k=l;
    //这里的tmp数组已经是对b有序的一个数组,flag用于判断下标,flag=1代表在(l,mid),flag=0代表在(mid+1,r)区间
    while(p<=mid&&q<=r){
        if(tmp[p].c<tmp[q].c){
            if(tmp[p].flag) Add(tmp[p].d,1);
            tmp1[k++]=tmp[p++];
        }
        else{
            if(!tmp[q].flag)
                ans+=Query(tmp[q].d);
            tmp1[k++] = tmp[q++];
        }
    }
    while(p<=mid){
        tmp1[k++] = tmp[p++];
    }
    while(q<=r){
        if(!tmp[q].flag)
            ans+=Query(tmp[q].d);
        tmp1[k++] = tmp[q++];
    }
    for(int i=l;i<=r;i++) clearr(tmp[i].d),tmp[i] = tmp1[i];
}

void CDQ(int l,int r){
    if(l>=r) return;
    int mid = l+r>>1;
    CDQ(l,mid);
    CDQ(mid+1,r);
    int p=l,q=mid+1,k=l;
    while(p<=mid&&q<=r){
        if(a[p].b<a[q].b){
            tmp[k++] = a[p++];
            tmp[k-1].flag=1;
        }
        else{
            tmp[k++] = a[q++];
            tmp[k-1].flag=0;
        }
    }
    while(p<=mid){
        tmp[k++] = a[p++];
        tmp[k-1].flag = 1;
    }
    while(q<=r){
        tmp[k++] = a[q++];
        tmp[k-1].flag=0;
    }
    for(int i=l;i<=r;i++) a[i] = tmp[i];
    CDQ2(l,r);
}

int main()
{
    freopen("partial_order.in","r",stdin);
    freopen("partial_order.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&a[i].b);
    for(int i=1;i<=n;i++) scanf("%d",&a[i].c);
    for(int i=1;i<=n;i++) scanf("%d",&a[i].d), a[i].a=i;
    ans=0;
    CDQ(1,n);
    printf("%lld\n",ans);
    return 0;
}

 

### SAP F.01 COGS 配置 使用指南 SAP 系统中的财务模块(FICO)提供了一种灵活的机制来配置和管理销售成本(COGS)。在 SAP 的标准配置中,F.01一个COGS 相关的重要字段,用于定义销售订单或交货单中 COGS 的计算方式。以下是关于如何在 SAP 中配置和使用 F.01 来处理 COGS 的详细信息: #### 1. COGS 的基本概念 销售成本(COGS)是指企业在生产和销售商品过程中发生的直接成本。在 SAP 系统中,COGS 的计算通常基于物料的成本核算方法[^1]。SAP 提供了多种存货计价方法,例如移动平均价(MAP)、标准价格(STD)、先进先出(FIFO)和后进先出(FILO),这些方法直接影响 COGS 的计算结果。 #### 2. F.01 字段的作用 F.01 是 SAP 系统中用于标识 COGS 的字段之一。它主要用于以下场景: - 在销售订单或交货单中触发 COGS 的过账。 - 定义 COGS 的来源,例如从物料主数据、成本中心或其他来源获取成本信息。 - 控制 COGS 的分配逻辑,确保成本能够正确地分配到相应的利润中心或成本对象[^2]。 #### 3. F.01 的配置步骤 以下是配置 F.01 字段以支持 COGS 计算的主要步骤: ##### (1)定义成本核算变式 在 SAP 中,需要通过事务码 `OB52` 配置成本核算变式(Costing Variant)。此变式决定了物料成本的计算方式。例如,可以选择基于标准价格的变式或基于实际成本的变式。 ```python # 示例代码:通过事务码 OB52 配置成本核算变式 def configure_costing_variant(variant_name): """ 配置成本核算变式 :param variant_name: 变式名称 """ print(f"正在配置成本核算变式: {variant_name}") ``` ##### (2)设置物料主数据 通过事务码 `MM01` 或 `MM02` 创建或修改物料主数据时,需要指定物料的成本核算变式。此外,还需要维护物料的价格控制字段(如 S 标准价格或 V 移动平均价)。 ##### (3)配置 COGS 过账规则 通过事务码 `OBYC` 配置 COGS 的过账规则。此步骤定义了 COGS 如何从库存账户转移到销售成本账户。具体配置包括: - 指定 COGS 的会计科目。 - 定义 COGS 的分配逻辑,例如是否按利润中心或成本中心分配。 ```python # 示例代码:通过事务码 OBYC 配置 COGS 过账规则 def configure_cogs_posting(account_code, distribution_logic): """ 配置 COGS 过账规则 :param account_code: 会计科目代码 :param distribution_logic: 分配逻辑 """ print(f"正在配置 COGS 过账规则: 科目={account_code}, 分配逻辑={distribution_logic}") ``` ##### (4)测试 COGS 的计算 完成配置后,可以通过事务码 `MB1B` 或 `VF01` 测试 COGS 的计算结果。验证 COGS 是否正确地从库存账户转移到销售成本账户。 #### 4. 注意事项 - 如果企业采用计划成本法,则需要定期结转成本差异,将计划成本调整为实际成本[^3]。 - 在期末处理时,确保所有未处理的差异已正确分摊到 COGS 中。 - 对于多账套环境(如法定账套和管理账套),需要确保 COGS 的计算逻辑在不同账套中保持一致。 #### 5. 示例代码 以下是一个简单的 Python 示例,展示如何通过 API 调用 SAP 系统以获取 COGS 数据: ```python # 示例代码:通过 SAP API 获取 COGS 数据 def fetch_cogs_data(material_number, plant_code): """ 获取指定物料的 COGS 数据 :param material_number: 物料编号 :param plant_code: 工厂代码 :return: COGS 数据 """ cogs_data = f"Material={material_number}, Plant={plant_code}, COGS=100.00" return cogs_data print(fetch_cogs_data("MAT123", "1000")) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值