首页 > 其他分享 >关于有很多好题写了但是不知道放哪所以就放在同一个博客里了md这标题怎么这么长这件事

关于有很多好题写了但是不知道放哪所以就放在同一个博客里了md这标题怎么这么长这件事

时间:2023-10-31 19:34:53浏览次数:32  
标签:md int 个数 博客 题写 len 区间 逆序 define

不分难度.我只是想把一些好玩或者有思维含量的题塞进来.


Inversion Counting

我是不会告诉你其实我是因为这题标签有平衡树才做的.

这题标签有平衡树.但是并不需要平衡树.

这题操作时在反转区间嘛,然后求逆序对.

容易发现,实际上有变化的逆序对只有完全在这个区间内的.换句话说,反转操作对该区间外的答案无影响.

那么这个区间内的逆序对个数是怎么变得捏?

显然,原来的逆序对都会变为正序的;原来的正序对都会变为逆序的.

但是顺着这条路想的话好像最终还是会跑到求区间逆序对上.那这题就没意思了.

所以换种思路.答案只要求输出奇偶,所以从奇偶性方面考虑.

那容易发现区间原正序对个数奇偶性等于现在逆序对个数的奇偶性.

设区间长度为\(len\),则区间内数对总数为\(\frac{len*(len-1)}{2}\).

再设反转后区间逆序对个数为\(num\),则现区间内正序对数量为\(num\).则现区间内逆序对数量为\(\frac{len*(len-1)}{2}-num\).

然后捏,大的来了:

反转前逆序对数量 减去 反转前后逆序对数量差 就是 反转后逆序对数量.所以捏,想判断 反转后逆序对数量的奇偶性 只需判断 反转前后逆序对数量差 的奇偶性.

那这个数量差很显然是\(\frac{len*(len-1)}{2}-num*2\).

\(num*2\)是偶数(显然),那么我们现在只需要判断\(\frac{len*(len-1)}{2}\)的了.

Code
#include<bits/stdc++.h>

namespace Lemuen_Daily
{
    #define endl '\n'
	#define il inline
    #define ll long long
    #define ldb long double
    #define Croll(i,l,r) for(int i=l;i<=r;++i)
    #define Troll(i,l,r) for(int i=l;i>=r;--i)
    #define cerr_time std::cerr<<(double)clock()/CLOCKS_PER_SEC
    
    const int maxn=101700;
    const ll inf=0x7f7f7f7f7f;
    
    il int read()
    {
        int f=1,x=0;char w=getchar();
        while(w<'0'||w>'9')
        {if(w=='-')f=-1;w=getchar();}
        while(w>='0'&&w<='9')
        {x=(x<<3)+(x<<1)+(w^48);w=getchar();}
        return f*x;
    }
}using namespace Lemuen_Daily;

int n,m;
int w[maxn];

bool flag;
int num;

namespace Lemuen_BIT
{
    int tr[maxn];

    int lowbit(int x)
    {return x&(-x);}
    void add(int x)
    {
        while(x<=n)
        {
            tr[x]++;
            x+=lowbit(x);
        }
    }
    int query(int x)
    {
        int ans=0;
        while(x)
        {
            ans+=tr[x];
            x-=lowbit(x);
        }
        return ans;
    }

    void Get()
    {
        Troll(i,n,1)
        {
            num+=query(w[i]);
            add(w[i]);
        }
    }
}

int main()
{
    n=read();
    Croll(i,1,n)
        w[i]=read();

    Lemuen_BIT::Get();

    flag=!(num%2);

    m=read();
    while(m--)
    {
        int l=read(),r=read();

        int p=r-l+1;
        if((p*(p-1)/2)%2)
            flag=!flag;
        
        if(flag)
            std::cout<<"even"<<endl;
        else
            std::cout<<"odd"<<endl;
    }

    return 0;
}

P9708 [KMOI R1] 集合 First

《关于我最后一个小时才想起来有场比赛没打,最后二十分钟想这道题但是没想出来,然后比赛结束不到十分钟想出来了这回事》

乐子题.


数据范围到 \(1 \times 10^{16}\),\(O(n)\) 都不用想.

试着想想能否单独计算每个数的贡献.

首先我们容易得出一个结论:
因为从大到小排序,所以一个数的排名只与"大于他的数的个数"有关.


因为最后一个数没有大于他的数,所以先考虑前 \(n-1\) 个数.

那么对于每个 \(x\),大于它的数会有 \(n-x\) 个.(后文用 \(m\) 替代 \(n-x\))

这 \(m\) 个数,能组成的集合个数为 \(2^{m}\) 个.

因为要求x的排名,所以考虑这 \(m\) 个数组成的集合的大小.

易得,有 \(2^{m-1}\) 个集合大小为奇数,剩下 \(2^{m-1}\) 个的大小为偶数.

所以我们就能得到一个很抽象但是正确的结论:

这 \(n-1\) 个数,贡献均为 \(0\).

逆天吧?我也觉得逆天.


然后再来单独考虑最后一个数.

我们容易发现,无论怎么组合,他都始终排在第一位,也就是说,他只会产生正贡献.

那么它会产生多少次贡献呢?
因为前 \(n-1\) 个数能组成 \(2^{n-1}\) 个集合,所以为 \(2^{n-1}\) 次.

所以,我们得出总结论:

答案为 \(n \times 2^{n-1}\).


Code
#include<bits/stdc++.h>
using namespace std;
#define il inline
#define endl '\n'
#define int long long
const int mod=911451407;
#define Croll(i,l,r) for(int i=l;i<=r;++i)
#define Troll(i,l,r) for(int i=l;i>=r;--i)
//////////
int n;

int qp(int,int);
//////////
il int read();
//////////
signed main()
{
    n=read();

    int ans=n%mod*qp(2,n-1)%mod;

    cout<<ans<<endl;

    return 0;
}
//////////
int qp(int x,int k)
{
    int res=1;
    while(k)
    {
        if(k & 1)res=res*x%mod;
        x=x*x%mod;k>>=1;
    }
    return res;
}
//////////
il int read()
{
    int f=1,x=0;char w=getchar();
    while(w<'0'||w>'9')
    {if(w=='-')f=-1;w=getchar();}
    while(w>='0'&&w<='9')
    {x=(x<<3)+(x<<1)+(w^48);w=getchar();}
    return f*x;
}

标签:md,int,个数,博客,题写,len,区间,逆序,define
From: https://www.cnblogs.com/Cayde-6/p/17800205.html

相关文章

  • lamdba表达式
    lamdba表达式是为了避免匿名内部类定义过多为什么要使用lambda表达式避免匿名内部类定义过多可以让你的代码看起来很简洁去掉了一堆没有意义的代码,只留下核心的逻辑。packagecom.xh.Thread;/***lamdba表达式事实上是内部接口**/publicclassLamdbaTest{ //3,定义一......
  • [BJDCTF2020]Easy MD5
    打开题目,发现是一个输入框,抓响应包后发现存在如下提示:Hint:select*from'admin'wherepassword=md5($pass,true)。当PHP的md5()函数的第二个参数为True时,会将string转换为16字符的二进制格式,如使用一些特殊的$pass,则可以绕过以上SQL查询,如:ffifdyop,ffifdyop计算......
  • systemd中的slice服务单元
    使用场景对一组服务进行管理,比如限制资源使用、调整启动顺序和依赖关系。比如,好几个服务都需要限制内存使用,可以每个服务都加个MemoryLimit=373741824,也可以将这些服务加入到同一个slice,然后,只需要在slice中配置MemoryLimit=373741824。介绍systemd的slice是一种服务单元,用......
  • 每日博客
    软件企业文化分析 华为企业的“狼群”战争文化,结成利益共同体。公平竞争,合理分配。增强员工的生存意识和生存能力,华为不停灌输各种概念:"活下去是硬道理"、"为了市场销售增长所做的一切都不是可耻的"、"企业就是要发展一批狼。狼有三大特性:一是敏锐的嗅觉,二是不屈不挠、奋不......
  • 每日博客——使用Maven对Java独立应用程序进行编译打包
    使用Maven对Java独立应用程序进行编译打包1.安装Maven网盘下载 apache-maven-3.9.2-bin.zip链接为:https://pan.baidu.com/s/181shkgg-i0WEytQMqeeqxA(提取码:9ekc)sudounzip/export/server/apache-maven-3.9.2-bin.zip-d/export/server/cd/export/server/sudomvapac......
  • K8s:Pod 中 command、args 与 Dockerfile 中 CMD、 ENTRYPOINT 的对应关系
    写在前面前几天被问到,这里整理笔记之前也没怎么注意这个问题理解不足小伙伴帮忙指正曾以为老去是很遥远的事,突然发现年轻是很久以前的事了。时光好不经用,抬眼已是半生,所谓的中年危机,真正让人焦虑的不是孤单、不是贫穷、更不是衰老,而是人到中年你才发现,你从来没有按照自己喜欢的方......
  • 每日博客
    今天写了软件构造 尝试将生成的算式及习题长期保存下来,建议采用CSV形式存储。提交实现效果及相关代码。 ......
  • python爬虫知识体系80页md笔记,0基础到scrapy项目高手,第(2)篇:http协议复习精讲
    本文主要学习一下关于爬虫的相关前置知识和一些理论性的知识,通过本文我们能够知道什么是爬虫,都有那些分类,爬虫能干什么等,同时还会站在爬虫的角度复习一下http协议。完整体系笔记直接地址:请移步这里共8章,37子模块,总计5.6w+字今天这一篇主讲:爬虫基础本阶段本文主要学......
  • EF Core 6.0.0.7无法将add-migration项识别为 cmdlet
    EFCore6.0.0.7无法将add-migration项识别为cmdlet解决方案:重新安装Microsoft.EntityFrameworkCore.Tools程序包管理器控制台主机版本6.2.1.2键入"get-helpNuGet"可查看所有可用的NuGet命令。PM>install-packageMicrosoft.EntityFrameworkCore.Tools......
  • C++23:多维视图(std::mdspan)
    C++23:多维视图(std::mdspan)介绍在C++23中,std::mdspan是一个非拥有的多维视图,用于表示连续对象序列。这个连续对象序列可以是一个简单的C数组、带有大小的指针、std::array、std::vector或std::string。这种多维视图通常被称为多维数组。多维数组的形状由其维数(也称为秩)和每个......