D. Nested Segments

本文介绍了一种利用线段树或树状数组解决特定类型问题的方法。通过对输入数据进行排序和离散化处理,实现了高效查询与更新操作。文章通过一个具体的示例程序展示了如何使用这些数据结构来解决区间查询问题。

线段树或者树状数组的裸题
按一个端点排序之后,离散化一下,没什么坑

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <map>

#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define ROF(i,a,b) for(int i=a;i>=b;i--)
#define mem(i,a) memset(i,a,sizeof(i))
#define rson mid+1,r,rt<<1|1
#define lson l,mid,rt<<1

#define ll long long
#define LL long long
using namespace std;
const double eps = 0.0000001;
const int maxn = 2e5+7;
const int mod = 1e9+7;
template <typename T>inline void read(T &_x_){
    _x_=0;bool f=false;char ch=getchar();
    while (ch<'0'||ch>'9') {if (ch=='-') f=!f;ch=getchar();}
    while ('0'<=ch&&ch<='9') {_x_=_x_*10+ch-'0';ch=getchar();}
    if(f) _x_=-_x_;
}

struct node{
    int x,y;
    int pos;
}p[maxn];
bool cmp(node a,node b){
    return a.x<b.x;
}
int ans[maxn],sum[maxn*2],pos,n,a[maxn*2],cnt=0;

void update(int x){
    while(x<=pos){
        sum[x]++;
        x+=x&(-x);
    }
}

int query(int x){
    int  cut = 0;
    while(x > 0){
        cut += sum[x];
        x -= x & (-x);
    }
    return cut;
}

int main(){
    read(n);
    FOR(i,1,n){
        read(p[i].x),read(p[i].y),p[i].pos=i;
        a[cnt++] = p[i].x;
        a[cnt++] = p[i].y;
    }
    sort(p+1,p+1+n,cmp);
    sort(a,a+cnt);
    pos = unique(a,a+cnt)-a;
    ROF(i,n,1){
        int my = lower_bound(a,a+pos,p[i].y)-a;
        ans[p[i].pos] = query(my);
        update(my);
    }
    FOR(i,1,n) printf("%d\n",ans[i]);
    return 0;
}
### Propagation.NESTED in Transaction Management Meaning and Usage In the context of Spring framework’s transaction management, `Propagation.NESTED` specifies that a method should run within a nested transaction if one exists; otherwise, it behaves like `Propagation.REQUIRED`. A nested transaction can roll back independently without affecting the outer transaction. This feature is particularly useful when certain operations need finer-grained control over their commit or rollback behavior while still being part of an overarching transactional process[^1]. When using `Propagation.NESTED`, developers often employ savepoints to manage this inner transaction scope more effectively. Savepoints allow parts of transactions to be rolled back selectively without impacting other changes made during the same parent transaction. #### Example Code Demonstrating Nested Transactions with Savepoint ```java @Transactional(propagation = Propagation.NESTED) public void performNestedTransaction() { // Perform some database operations here try (Connection conn = dataSource.getConnection()) { boolean autoCommitMode = conn.getAutoCommit(); // Set connection into manual commit mode. conn.setAutoCommit(false); // Create a save point before performing critical operation. Savepoint sp = conn.setSavepoint("SAVE_POINT_0"); // Critical section where we might want independent failure handling. executeCriticalOperation(conn); // If everything goes well, release the savepoint. conn.releaseSavepoint(sp); // Commit all changes including those from both main & nested txns. conn.commit(); } catch (SQLException e) { logger.error(e.getMessage()); throw new RuntimeException(e); } } ``` This example demonstrates how to handle exceptions locally by rolling back only up to the last defined savepoint rather than aborting the entire enclosing transaction chain entirely.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值