首页 > 其他分享 >卡常

卡常

时间:2023-02-05 18:46:31浏览次数:49  
标签:typedef ch int long while 卡常 getchar

事情起因

2023.2.4模拟赛, T3

该题当时考场上真的想不出来什么正解,于是就开始打暴力

第一次提交

结果如下图

NMtJk.png

代码:


#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;

inline int read()
{
    int x = 0, f = 1;
    char ch = getchar();
    while(ch < '0' || ch > '9')
    {
        if(ch == '-') f = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9')
    {
        x = x * 10 + ch - '0';
        ch = getchar();
    }
    return x * f;
}

const int N = 5e5 + 10;
int a[N];
int n, m, t;

int find(int len)
{
    int l, cnt = 0;
    for(int i = 1; i <= n; i ++ )
    {
        if(a[i] == 1) cnt = 0;
        if(!cnt && a[i] == 0) l = i;
        if(a[i] == 0) cnt ++;
        if(cnt == len) return l;
    }
    return 0;
}

int main()
{
    #ifdef LOCAL
        freopen("in.in", "r", stdin);
        freopen("out.out", "w", stdout);
    #endif

    n = read(), m = read();

    while(m -- )
    {
        int op = read(), x = read(), y;
        if(op == 1)
        {
            int l = find(x);
            if(l != 0)
                for(int i = l; i <= l + x - 1; i ++ )
                    a[i] = 1;
                    
            cout << l << endl;
        }
        else
        {
            y = read();
            for(int i = x; i < x + y; i ++ )
                a[i] = 0;
        }
    }
    
    return 0;
}

PS: 本人有加快读的习惯

只拿了一半分(说实话我也没想到能拿一半分)

改代码

拿了一半分可不行(确信)

然后我就开始着力改一些细节

首先把所有的for循环中加入register, 函数前加上inline

于是代码变成了

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;

inline int read()
{
    int x = 0, f = 1;
    char ch = getchar();
    while(ch < '0' || ch > '9')
    {
        if(ch == '-') f = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9')
    {
        x = x * 10 + ch - '0';
        ch = getchar();
    }
    return x * f;
}

const int N = 5e5 + 10;
int a[N];
int n, m, t;

inline int find(int len)
{
    int l, cnt = 0;
    for(register int i = 1; i <= n; i ++ )
    {
        if(a[i] == 1) cnt = 0;
        if(!cnt && a[i] == 0) l = i;
        if(a[i] == 0) cnt ++;
        if(cnt == len) return l;
    }
    return 0;
}

int main()
{
    #ifdef LOCAL
        freopen("in.in", "r", stdin);
        freopen("out.out", "w", stdout);
    #endif

    n = read(), m = read();

    while(m -- )
    {
        int op = read(), x = read(), y;
        if(op == 1)
        {
            int l = find(x);
            if(l != 0)
                for(register int i = l; i <= l + x - 1; i ++ )
                    a[i] = 1;
                    
            cout << l << endl;
        }
        else
        {
            y = read();
            for(register int i = x; i < x + y; i ++ )
                a[i] = 0;
        }
    }
    
    return 0;
}

NM3rQ.png

分数+8

我狂喜直接(bushi)

但还是没拿更高的分(真贪啊)

接着改

改了一些小地方, 比如什么

int a = read()变成了int a(read())

i ++变为++ i

改cout为printf

但是还是过不了别的点

然后进行了一些位运算优化

比如把x == y改为!(x ^ y)这种异或

最终

NMBzX.png

又2个点!

直接干到82分

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;

inline int read()
{
    int x = 0, f = 1;
    char ch = getchar();
    while(ch < '0' || ch > '9')
    {
        if(ch == '-') f = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9')
    {
        x = x * 10 + ch - '0';
        ch = getchar();
    }
    return x * f;
}

inline void write(int x)
{
    if(x<0){
    	putchar('-');
		x=-x;
	}
    if(x>9) write(x/10);
    putchar(x%10+'0');
}

const int N = 5e4 + 9;
int a[N];
int n, m, t;

inline int find(int len)
{
    int l, cnt = 0;
    for(register int i(1); i <= n; ++ i )
    {
        if(a[i]) cnt = 0;
        if(!cnt && !a[i]) l = i;
        if(!a[i]) cnt ++;
        if(!(cnt ^ len)) return l;
    }
    return 0;
}

int main()
{
    #ifdef LOCAL
        freopen("in.in", "r", stdin);
        freopen("out.out", "w", stdout);
    #endif

    n = read(), m = read();

    while(m -- )
    {
        int op(read()), x(read()), y;
        if(!(op ^ 1))
        {
            int l(find(x));
            if(l)
                for(register int i(l); i <= l + x - 1; ++ i )
                    a[i] = 1;
                    
            printf("%d\n", l);
        }
        else
        {
            y = read();
            int t(x + y);
            for(register int i(x); i < t; ++ i )
                a[i] = 0;
        }
    }
    
    return 0;
}

还没完

在写这篇的时候, 我突然想到LYT昨晚说的:

O2跑的飞快

然后我就去测试了下

NMhbb.png

????????????

直接起飞了就

(怪不得考试不加O2)

标签:typedef,ch,int,long,while,卡常,getchar
From: https://www.cnblogs.com/crimsonawa/p/17093535.html

相关文章

  • 卡常技巧整理
    set/map/pbds::gp_hash_table通常情况下:set<map<gp_hash_table。PNR#4A,就是改用了gp_hash_table才过了。gp_hash_table的使用,见pb_ds库构造函数的时间复杂......
  • 究极卡常
    1.register&static&inline在定义局部非char类型的变量时在前面加入register在局部char类型变量前加入static在非主函数和非递归函数前加入inline2.火车头传......
  • 从 Ynoi2011 初始化 看卡常
    一般情况下,程序运行消耗时间主要与时间复杂度有关,超时与否取决于算法是否正确。但对于某些题目,时间复杂度正确的程序也无法通过,这时我们就需要卡常数,即通过优化一些操作的......
  • 如何在 XJOI 订正卡常题(详细揭秘)
    在XJOI订正卡常题是怎么回事呢?那么卡常题为什么会被在XJOI订正,相信大家都很好奇。大家可能会感到很惊讶,卡常题为什么会被在XJOI订正呢?但事实就是这样,小编也感到非常......
  • 卡常小技巧
    那些也许有用的卡常小技巧作者卡Ynoi卡吐了一,代码优化1.inline其实还是有点用的。不带inline:带inline:2.register注意有些不能加,但优化程度还是很大的。不带re......