XJOI NOI2015训练题7 题解

该博客介绍了XJOI NOI2015训练赛中的一道计算几何题目,强调了题目不进行模1e9+7的操作导致需要处理高精度。博主分享了状态转移方程和优化技巧,指出在不超时的前提下,使用long long代替更高精度的数据类型能够解决问题。同时,博主提到了原题来源和解决思路,包括利用凸包和旋转卡壳的方法,并提及预处理关键点的上下凸壳来合并求解。文章还提及了寻找矩形内最高、最低、最左、最右点的二分查找优化方法以及避免错误的数据结构选择导致的性能问题。
摘要由CSDN通过智能技术生成

T1、

原本以为是水题的,但是题目里有这么一句话”模1e9+7“。。。。

可以注意到上下左右都要求单调增,那么状态就很好确定了

f[i][j]表示第一行放了前i个格子,第二行放了前j个格子,并且这些数都是小于等于i+j的

转义很好写:f[i][j]可以推给f[i+1][j]和f[i][j+1]。需要时时保证i>j

另外注意此处格子是否可放。

由于不取模,需要用高精。但是实现只有0.2s

——卡常!

最后还是被卡了20分——本机测试不超时的委屈

订正的时候发现用long long压18位居然就能过了,而9位int死活不过。。。。

还有有些人用这个不算开挂吗? __attribute__((optimize("O2")))

#include <cstdio>
#include <cstring>
#include <algorithm>
 
using namespace std;
const long long Mod = (1e18);
int a[2][1005];
int n,i,j;
struct BITINT{
  int h;
  long long a[40];
  BITINT operator +(const BITINT &x) const
  {
    if (h==0) return x;
    BITINT ret;
    memset(ret.a,0,sizeof(ret.a));
    ret.h = max(h, x.h);
    for (int i=0;i<ret.h||ret.a[i+1]>0;i++)
    {
      ret.a[i] += a[i]+x.a[i];
      while (ret.a[i]>=Mod)
        ret.a[i+1]++, ret.a[i]-=Mod;
    }
    while (ret.a[ret.h]>0) ret.h++;
    //for (int i=ret.h;i<70;i++) ret.a[i]=0;
    return ret;
  }
  void print(){
    if (h==0) {printf("0\n");return;}
    printf("%lld",a[h-1]);
    for (int i=h-2;i>=0;i--){
      long long x = Mod/10;
      if (a[i]==0) {printf("000000000000000000");continue;}
      while (a[i]<x) {printf("0");x/=10;}
      printf("%lld",a[i]);
    }
    printf("\n");
  }
} f[1005][1005];
 
int main(){
  scanf("%d",&n);
  for (i=1;i<=n;i++)
    scanf("%d",&a[0][i]);
  for (i=1;i<=n;i++)
    scanf("%d",&a[1][i]);
  f[0][0].h = f[0][0].a[0] = 1;
 
  for (i=0;i<=n;i++)
    for (j=0;j<=i;j++)
    if (f[i][j].h>0){
      if (i<n && (a[0][i+1]==0 || a[0][i+1]==i+j+1))
        f[i+1][j] = f[i+1][j] + f[i][j];
      if (j<i && (a[1][j+1]==0 || a[1][j+1]==i+j+1))
        f[i][j+1] = f[i][j+1] + f[i][j];
    }
 
  f[n][n].print();
  return 0;
}

T2、

shtsc2011的原题。

凸包+旋转卡壳,脑补脑补就知道了。。。。

#include <cmath>
#include <cstdio>
#include <cstring>
#include <algori
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值