CF 361 E. Mike and Geometry Problem 排列组合

本文介绍了一个涉及几何问题的算法挑战,旨在求解多个线段区间交集中的整数点数量之和,当这些交集中的点数目超过特定阈值时。通过使用离散数学和组合数学的方法,该算法能够高效地解决这一复杂问题。
部署运行你感兴趣的模型镜像

E. Mike and Geometry Problem

time limit per test

 3 seconds

memory limit per test

 256 megabytes

input

 standard input

output

 standard output

Mike wants to prepare for IMO but he doesn't know geometry, so his teacher gave him an interesting geometry problem. Let's define f([l, r]) = r - l + 1 to be the number of integer points in the segment [l, r] with l ≤ r (say that ). You are given two integers n and k and nclosed intervals [li, ri] on OX axis and you have to find:

In other words, you should find the sum of the number of integer points in the intersection of any kof the segments.

As the answer may be very large, output it modulo 1000000007 (109 + 7).

Mike can't solve this problem so he needs your help. You will help him, won't you?

Input

The first line contains two integers n and k (1 ≤ k ≤ n ≤ 200 000) — the number of segments and the number of segments in intersection groups respectively.

Then n lines follow, the i-th line contains two integers li, ri ( - 109 ≤ li ≤ ri ≤ 109), describing i-th segment bounds.

Output

Print one integer number — the answer to Mike's problem modulo 1000000007 (109 + 7) in the only line.

Examples

input

3 2
1 2
1 3
2 3

output

5

input

3 3
1 3
1 3
1 3

output

3

input

3 1
1 2
2 3
3 4

output

6

Note

In the first example:

;

;

.

So the answer is 2 + 1 + 2 = 5.

 

 

题目求线段点重合大于K次的组合次数,求和即可。

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

using namespace std;

int n,k;

struct node
{
    long long x;
    int f;


}pt[500005];

long long fac[200005];
long long powdd[200005];

bool cmp(node a,node b)
{
    return a.x<b.x;
}

long long mod=1e9+7;

long long powd(long long a,long long b)
{
    long long ans=1;
    while(b>0)
    {
        if(b%2==1)
        {
           ans=ans*a%mod;
        }
        a=a*a%mod;
        b/=2;
    }

    return ans;
}

long long C(long long b,long long a)
{
    long long ans=1;
    if(a>b)
        return 0;

    ans=(fac[b]*powdd[a]%mod)*powdd[b-a]%mod;
    return ans;
}

int main()
{
    fac[0]=1;
    for(long long i=1;i<=200000;i++)
        fac[i]=fac[i-1]*i%mod;
    for(int i=0;i<=200000;i++)
        powdd[i]=powd(fac[i],mod-2)%mod;

    while(~scanf("%d%d",&n,&k))
    {
        for(int i=0;i<n;i++)
        {
            scanf("%lld%lld",&pt[i*2].x,&pt[i*2+1].x);
            pt[i*2].f=1;pt[2*i+1].f=-1;
            pt[i*2+1].x++;
        }

        sort(pt,pt+(2*n),cmp);
        int ct=0;
        int pre=-(1e9+7);

        long long ans=0;
        for(int i=0;i<2*n;i++)
        {
            if(i!=0)
            {
                if(pt[i].x!=pt[i-1].x)
                {
                    //printf("%lld:%d  ct:%d plus:%lld\n",pt[i].x,pre,ct,(C(ct,k)*(pt[i].x-pre)%mod)%mod);
                    ans=(ans+C(ct,k)*(pt[i].x-pre)%mod)%mod;
                }
            }

            ct+=pt[i].f;
            pre=pt[i].x;
        }

        printf("%lld\n",ans);
    }


}

 

您可能感兴趣的与本文相关的镜像

Llama Factory

Llama Factory

模型微调
LLama-Factory

LLaMA Factory 是一个简单易用且高效的大型语言模型(Large Language Model)训练与微调平台。通过 LLaMA Factory,可以在无需编写任何代码的前提下,在本地完成上百种预训练模型的微调

<think>好的,我现在需要解决如何将org.wololo.geojson.Geometry类型转换为net.postgis.jdbc.geometry.Geometry类型的问题。首先,我应该理解这两个类的作用和它们之间的区别。 org.wololo.geojson.Geometry应该是来自GeoJSON库的类,用于表示GeoJSON格式的几何对象。而net.postgis.jdbc.geometry.Geometry是PostGIS的JDBC驱动提供的类,用于在Java中处理PostGIS的几何数据类型。因此,转换的关键在于将GeoJSON格式的几何数据转换为PostGIS能够识别的格式。 根据用户提供的引用[1]和[2],他们提到了使用GeoTools进行转换。GeoTools是一个开源的Java库,专门用于处理地理空间数据,支持多种格式的转换,包括GeoJSON和WKT/WKB。PostGIS的ST_GeomFromGeoJSON函数可以将GeoJSON转换为几何对象,这可能对应到Java代码中的转换方法。 接下来,我需要确定具体的转换步骤。可能的步骤包括: 1. 将org.wololo.geojson.Geometry对象转换为GeoJSON字符串。 2. 使用GeoTools的库将GeoJSON字符串解析为Geometry对象,或者直接转换为PostGIS的Geometry。 但用户提到他们使用的是GeoTools的依赖包,所以可能需要通过GeoTools的API来完成转换。同时,引用[1]中提到可以通过ST_AsText和ST_AsGeoJSON在PostGIS中进行转换,但这里需要在Java代码中处理,因此可能需要使用GeoTools的解析器。 可能的解决方案是先将org.wololo.geojson.Geometry序列化为GeoJSON字符串,然后使用PostGIS的ST_GeomFromGeoJSON函数(在Java中可能对应某个方法)来生成net.postgis.jdbc.geometry.Geometry实例。或者,使用GeoTools读取GeoJSON字符串,再转换为PostGIS的Geometry。 另外,用户提供的SQL示例中使用了ST_GeomFromGeoJSON,这可能在Java中对应一个方法,需要查看PostGIS JDBC驱动的文档是否有类似的方法,或者是否有工具类可以直接转换。 可能的代码步骤: - 将org.wololo.geojson.Geometry对象转换为GeoJSON字符串。 - 使用PostGIS的ST_GeomFromGeoJSON函数对应的Java方法,例如net.postgis.jdbc.geometry.Geometry的静态方法,将字符串转换为Geometry对象。 或者,使用GeoTools的GeoJSONReader读取GeoJSON字符串,生成GeoTools的Geometry对象,再转换为PostGIS的Geometry。 需要检查GeoTools是否支持直接转换到PostGIS的Geometry类型,或者是否需要通过WKB/WKT作为中间格式。 例如,步骤可能是: 1. 使用org.wololo.geojson.Geometry的toString()方法得到GeoJSON字符串。 2. 使用GeoTools的GeoJSONReader解析该字符串,得到GeoTools的org.geotools.geometry.jts.JTSFactoryFinder创建的Geometry对象。 3. 将GeoTools的Geometry对象转换为WKT或WKB格式。 4. 使用PostGIS的Geometry类的静态方法,如Geometry.fromText(String wkt)来生成对应的实例。 或者,是否有更直接的方法?例如,直接使用PostGIS的Geometry类的某个构造方法,接受GeoJSON字符串? 查阅PostGIS JDBC驱动的文档,发现net.postgis.jdbc.geometry.Geometry类有一个静态方法valueOf(String value),可以解析WKT、EWKT、HexWKB或者GeoJSON字符串。因此,可能可以直接将GeoJSON字符串传递给该方法来生成对应的Geometry实例。 因此,转换步骤可能是: 1. 将org.wololo.geojson.Geometry实例转换为GeoJSON字符串。 2. 使用net.postgis.jdbc.geometry.Geometry.valueOf(geoJsonString)来创建PostGIS的Geometry对象。 这样的话,代码可能类似于: String geoJson = geojsonGeometry.toString(); net.postgis.jdbc.geometry.Geometry postgisGeom = net.postgis.jdbc.geometry.Geometry.valueOf(geoJson); 但需要确认PostGIS的JDBC驱动是否支持从GeoJSON字符串解析。根据引用[1]中的例子,PostGIS的ST_GeomFromGeoJSON函数可以处理GeoJSON,所以对应的Java驱动可能也支持类似的方法。假设Geometry.valueOf能够处理GeoJSON格式的字符串,那么这种方法是可行的。 另外,用户提到项目中使用的是Spring Boot和MyBatis Plus,可能需要在SQL查询中使用转换,但用户的问题是在Java代码中进行类型转换,所以需要确保在Java层面的转换正确。 可能需要注意org.wololo.geojson.Geometry的toString()是否生成标准的GeoJSON字符串。例如,org.wololo.geojson.Geometry可能使用自己的序列化方式,可能需要手动构造GeoJSON字符串,或者使用其内置的方法生成正确的字符串。 总结解决方案步骤: 1. 将org.wololo.geojson.Geometry对象转换为GeoJSON字符串。 2. 使用PostGIS JDBC的Geometry.valueOf()方法将字符串转换为目标类型。 代码示例可能如下: import org.wololo.geojson.Geometry; import net.postgis.jdbc.geometry.Geometry as PostgisGeometry; // 假设geojsonGeometry是org.wololo.geojson.Geometry的实例 String geoJsonString = geojsonGeometry.toString(); PostgisGeometry postgisGeometry = PostgisGeometry.valueOf(geoJsonString); 如果上述方法有效,即可完成转换。否则,可能需要通过中间格式,如WKT,或者使用GeoTools进行解析。 如果遇到问题,比如PostgisGeometry.valueOf不支持GeoJSON,则需要使用GeoTools将GeoJSON转换为WKT,再使用PostgisGeometry的fromText方法。 例如: 使用GeoTools的GeoJSONReader读取GeoJSON字符串,生成JTS Geometry对象,然后将其转换为WKT,再通过PostgisGeometry.fromText(wkt)来创建实例。 这种情况下,需要添加GeoTools的依赖,并编写相应的转换代码。 但根据用户的引用[1],他们提到使用GeoTools的依赖包进行转换,因此可能需要采用这种方法。 具体步骤: 1. 将org.wololo.geojson.Geometry转换为GeoJSON字符串。 2. 使用GeoTools的GeoJSONReader读取该字符串,生成JTS Geometry3. 将JTS Geometry转换为WKT字符串。 4. 使用PostgisGeometry.fromText(wkt)生成目标对象。 代码示例: import org.geotools.geojson.geom.GeometryJSON; import com.vividsolutions.jts.geom.Geometry; import java.io.StringReader; // 转换步骤 String geoJson = geojsonGeometry.toString(); GeometryJSON geoJsonReader = new GeometryJSON(); Geometry jtsGeometry = geoJsonReader.read(new StringReader(geoJson)); String wkt = jtsGeometry.toText(); PostgisGeometry postgisGeom = PostgisGeometry.fromText(wkt); 但需要注意版本兼容性,尤其是GeoTools和JTS的版本。例如,新版的GeoTools可能使用org.locationtech.jts而不是com.vividsolutions.jts。 另外,用户的项目中可能已经引入了GeoTools的相关依赖,所以需要确保相关类正确导入。 如果PostgisGeometry的valueOf方法可以直接处理GeoJSON字符串,那么步骤会更简单,但需要确认这一点。例如,查阅PostGIS JDBC驱动的文档,或者测试该方法是否能够正确解析GeoJSON。 总结,可能的解决方案有两种: 方法一:直接使用PostGIS JDBC驱动的方法转换GeoJSON字符串。 方法二:通过GeoTools将GeoJSON转换为WKT,再转为PostGIS的Geometry。 需要根据实际情况选择,但根据用户的引用,他们提到GeoTools的依赖包转换,所以可能方法二更符合他们的需求。 因此,最终的转换代码可能如下: 首先,添加GeoTools的依赖,例如: <dependency> <groupId>org.geotools</groupId> <artifactId>gt-geojson</artifactId> <version>${geotools.version}</version> </dependency> 然后,在代码中进行转换: import org.wololo.geojson.Geometry; import org.geotools.geojson.geom.GeometryJSON; import com.vividsolutions.jts.geom.Geometry as JTSGeometry; import net.postgis.jdbc.geometry.Geometry as PostgisGeometry; public PostgisGeometry convert(org.wololo.geojson.Geometry geojson) throws IOException { String geoJsonString = geojson.toString(); GeometryJSON geoJsonReader = new GeometryJSON(); JTSGeometry jtsGeometry = geoJsonReader.read(new StringReader(geoJsonString)); String wkt = jtsGeometry.toText(); return PostgisGeometry.fromText(wkt); } 但需要注意可能的异常处理,如IOException,以及JTS Geometry的包是否正确。 另外,如果PostGIS的Geometry类有直接接受JTS Geometry的构造方法,或者可以通过其他方式转换,可能更高效,但需要进一步查阅相关文档。 综上所述,最终的解决方案是使用GeoTools将GeoJSON转换为WKT,再通过PostGIS的fromText方法生成目标对象。或者,如果PostGIS的驱动支持直接解析GeoJSON,直接使用其valueOf方法。</think>要将$org.wololo.geojson.Geometry$转换为$net.postgis.jdbc.geometry.Geometry$,可以通过以下步骤实现: ### 方法一:通过WKT格式转换(推荐) 1. **将GeoJSON对象序列化为字符串** 使用$org.wololo.geojson.Geometry$的$toString()$方法生成标准的GeoJSON字符串。 ```java String geoJson = geojsonGeometry.toString(); ``` 2. **使用GeoTools解析GeoJSON字符串为JTS Geometry** 通过GeoTools的$GeometryJSON$类将字符串转换为JTS几何对象[^1]。 ```java GeometryJSON geoJsonReader = new GeometryJSON(); JTSGeometry jtsGeometry = geoJsonReader.read(new StringReader(geoJson)); ``` 3. **将JTS Geometry转换为WKT字符串** JTS几何对象可直接生成WKT格式的字符串。 ```java String wkt = jtsGeometry.toText(); ``` 4. **生成PostGIS Geometry对象** 使用PostGIS JDBC的$fromText()$方法将WKT字符串转换为目标类型[^2]。 ```java PostgisGeometry postgisGeom = PostgisGeometry.fromText(wkt); ``` ### 方法二:直接使用PostGIS内置解析(需驱动支持) 若PostGIS JDBC驱动支持直接解析GeoJSON字符串,可直接调用$valueOf()$方法: ```java PostgisGeometry postgisGeom = PostgisGeometry.valueOf(geoJson); ``` ### 完整代码示例 ```java import org.wololo.geojson.Geometry; import org.geotools.geojson.geom.GeometryJSON; import com.vividsolutions.jts.geom.Geometry as JTSGeometry; import net.postgis.jdbc.geometry.Geometry as PostgisGeometry; import java.io.StringReader; import java.io.IOException; public PostgisGeometry convertGeoJsonToPostgis(Geometry geojsonGeometry) throws IOException { String geoJson = geojsonGeometry.toString(); GeometryJSON geoJsonReader = new GeometryJSON(); JTSGeometry jtsGeometry = geoJsonReader.read(new StringReader(geoJson)); String wkt = jtsGeometry.toText(); return PostgisGeometry.fromText(wkt); } ``` ### 依赖配置 确保项目中包含以下依赖: ```xml <!-- GeoTools for GeoJSON parsing --> <dependency> <groupId>org.geotools</groupId> <artifactId>gt-geojson</artifactId> <version>25.0</version> </dependency> <!-- PostGIS JDBC --> <dependency> <groupId>net.postgis</groupId> <artifactId>postgis-jdbc</artifactId> <version>2.5.0</version> </dependency> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值