BZOJ1293: [SCOI2009]生日礼物

本文展示了一个使用C++解决特定问题的编程示例。通过读取输入并处理数据,程序实现了对一系列颜色进行排序,并寻找满足特定条件的最短距离。此代码涉及到了结构体、位运算和排序算法的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SB题。。。。不解释


#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using  namespace std;
 
long long FULL,now;
long long line[1000001];
char c;
inline void read(long long &a)
{
    a=0;do c=getchar();while(c<'0'||c>'9');
    while(c<='9'&&c>='0')a=(a<<3)+(a<<1)+c-'0',c=getchar();
}
struct Node
{
    long long color,place;
    inline friend bool operator <(Node a,Node b)
    {return a.place<b.place;}
}me[1000001];
long long P_color[80];
int main()
{
  long long n,k,i,j,l;
  long long con=0;
  read(n),read(k);  
  for(i=1;i<=k;i++)
    {
        read(j);
        for(l=1;l<=j;l++)
          {
          read(me[++con].place);
          me[con].color=i-1; 
          if(me[con].place==1282)
              con++,con--;
         }
    }
  FULL=1ll<<k;
  FULL--;
  sort(me+1,me+1+n);
  long long now=0;
  long long r=0;
  l=0;
  bool pr[100001];
  long long ans=1ll<<60;
  for(i=1;i<=n;i++)  
    {
        line[++r]=i;
        now|=1ll<<me[i].color;
        P_color[me[i].color]=me[i].place;
        while((P_color[me[line[l]].color]!=me[line[l]].place))l++;
        if(now!=FULL)
         continue;
        if(ans>me[line[r]].place-me[line[l]].place)
        {
         ans=min(ans,me[line[r]].place-me[line[l]].place);
        /*puts("");puts("");puts("");puts("");
        for(j=r;j>=l;j--)
           if(!pr[me[line[j]].color])
            pr[me[line[j]].color]=true,printf("Pla:%I64d Clo:%I64d\n",me[line[j]].place,me[line[j]].color);
       memset(pr,false,sizeof(pr));
   */
    }
    }
    printf("%lld\n",ans);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值