2022.09.16 模拟赛小结(互测)

2022.09.16 模拟赛小结(互测)

题面

PDF链接

(这个链接只是为了自己方便找,页面设置权限了,不要尝试访问)

更好的阅读体验戳此进入

(建议您从上方链接进入我的个人网站查看此 Blog,在 Luogu 中图片会被墙掉,部分 Markdown 也会失效)

赛时思路

T1

赛时写了个暴力 + 卡时 + 随机化 + 贪心的纯纯乱搞,Luogu 能过一大半的点,不过数据被 zpair 加强之后直接除了暴力分全部寄掉了。

Code

#define _USE_MATH_DEFINES
#include <bits/stdc++.h>

namespace input{
    int seed,lst=1;
    const int prime1=163337,prime2=998244353;
    void init(){
        scanf("%d",&seed);
    }
    int read(){
        //return lst=((lst*prime1+seed)%prime2+prime2)%prime2;
    }
}

#define PI M_PI
#define E M_E
#define npt nullptr
#define SON i->to

/******************************
abbr

******************************/

using namespace std;

mt19937 rnd(random_device{}());
int rndd(int l, int r){return rnd() % (r - l + 1) + l;}
bool rnddd(int x){return rndd(1, 100) < x;}

typedef unsigned int uint;
typedef unsigned long long unll;
typedef long long ll;



template<typename T = int>
inline T read(void);

int a[6100000];
int N, D;
ll P;
namespace BL{
    int ans(0);
    int len(0);
    ll sum(0);
    deque < int > deq;
    int Make(void){
        for(int i = 1; i <= N - D + 1; ++i){
            len = 0;
            sum = 0;
            deq.clear();
            for(int j = 1; j <= N; ++j){
                ll val = (j >= i && j <= i + D - 1) ? 0 : a[j];
                while(!deq.empty() && sum + val > P)--len, sum -= deq.front(), deq.pop_front();
                if(sum + val <= P)deq.push_back(val), sum += val, ++len, ans = max(ans, len);
                // printf("%d ", len);
            }
            // printf("%d\n", ans);
        }
        return ans;
    }
}


int main(){
    // freopen("T1.in", "r", stdin);
    // freopen("T1.out", "w", stdout);
    N = read(); P = read<ll>(); D = read(); //input::init();
    for(int i = 1; i <= N; ++i)a[i] = read();
    if(N <= 1000){printf("%d\n", BL::Make()); return 0;}
    // printf("%d\n", BL::Make());
    int ans(0);
    ll cur(0);
    for(int i = 1; i <= D - 1; ++i)cur += a[i];
    ll maxx(-1), maxp;
    for(int i = 1; i <= N - D + 1; ++i){
        cur -= a[i - 1], cur += a[i + D - 1];
        if(cur > maxx){
            maxx = cur;
            maxp = i;
        }
    }
    // printf("%d\n", maxp);
    // for(int i = maxp; i <= maxp + D - 1; ++i)
    deque < int > deq;
    int len = 0;
    int sum = 0;
    deq.clear();
    for(int j = 1; j <= N; ++j){
        // printf("Caling p = %d\n", maxp);
        ll val = (j >= maxp && j <= maxp + D - 1) ? 0 : a[j];
        while(!deq.empty() && sum + val > P)--len, sum -= deq.front(), deq.pop_front();
        if(sum + val <= P)deq.push_back(val), sum += val, ++len, ans = max(ans, len);
        // printf("%d ", len);
    }
        int pos(0);
    while((double)clock() / CLOCKS_PER_SEC < 0.3){
        pos = 0;
        while(pos < 1 || pos > N - D + 1)pos = maxp - rndd(1, D - 1);
        // printf("Caling p = %d\n", pos);
        len = 0;
        sum = 0;
        deq.clear();
        for(int j = 1; j <= N; ++j){
            ll val = (j >= pos && j <= pos + D - 1) ? 0 : a[j];
            while(!deq.empty() && sum + val > P)--len, sum -= deq.front(), deq.pop_front();
            if(sum + val <= P)deq.push_back(val), sum += val, ++len, ans = max(ans, len);
            // printf("%d ", len);
        }
    }
    while((double)clock() / CLOCKS_PER_SEC < 0.5){
        pos = 0;
        while(pos < 1 || pos > N - D + 1)pos = int((double)maxp * ((double)rndd(1, 100) / 100) * (rnddd(50) ? 1 : -1));
        // printf("Caling p = %d\n", pos);
        len = 0;
        sum = 0;
        deq.clear();
        for(int j = 1; j <= N; ++j){
            ll val = (j >= pos && j <= pos + D - 1) ? 0 : a[j];
            while(!deq.empty() && sum + val > P)--len, sum -= deq.front(), deq.pop_front();
            if(sum + val <= P)deq.push_back(val), sum += val, ++len, ans = max(ans, len);
        }
    }
    while((double)clock() / CLOCKS_PER_SEC < 0.7){
        pos = rndd(1, N - D + 1);
        // printf("Caling p = %d\n", pos);
        len = 0;
        sum = 0;
        deq.clear();
        for(int j = 1; j <= N; ++j){
            ll val = (j >= pos && j <= pos + D - 1) ? 0 : a[j];
            while(!deq.empty() && sum + val > P)--len, sum -= deq.front(), deq.pop_front();
            if(sum + val <= P)deq.push_back(val), sum += val, ++len, ans = max(ans, len);
            // printf("%d ", len);
        }
    }
    printf("%d\n", ans);

    fprintf(stderr, "Time: %.6lf\n", (double)clock() / CLOCKS_PER_SEC);
    return 0;
}



template<typename T>
inline T read(void){
    T ret(0);
    short flag(1);
    char c = getchar();
    while(c != '-' && !isdigit(c))c = getchar();
    if(c == '-')flag = -1, c = getchar();
    while(isdigit(c)){
        ret *= 10;
        ret += int(c - '0');
        c = getchar();
    }
    ret *= flag;
    return ret;
}

T2

写了个奇怪的暴力,写挂了,爆零。

Code

#define _USE_MATH_DEFINES
#include <bits/stdc++.h>

#define PI M_PI
#define E M_E
#define npt nullptr
#define SON i->to

/******************************
abbr

******************************/

using namespace std;

mt19937 rnd(random_device{}());
int rndd(int l, int r){return rnd() % (r - l + 1) + l;}

typedef unsigned int uint;
typedef unsigned long long unll;
typedef long long ll;


#define getchar()(p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin),p1==p2)?EOF:*p1++)
char buf[1<<20],*p1=buf,*p2=buf;
inline void read(int &r){
    r=0;bool w=0;char ch=getchar();
    while(ch<'0'||ch>'9')w=ch=='-'?1:0,ch=getchar();
    while(ch>='0'&&ch<='9')r=r*10+(ch^48),ch=getchar();
    r=w?-r:r;
}
int N, Q;
int a[51000];
namespace BL{
    int lbuc[51000], rbuc[51000];
    int sum[51000];
    void Init(void){
        memset(sum, 0, sizeof(sum));
        for(int i = 1; i <= N; ++i)sum[i] = sum[i - 1] + a[i];
        for(int i = 1; i <= N; ++i){
            for(int j = i; j <= N; ++j){
                int val = sum[j] - sum[i - 1];
                lbuc[val] = i, rbuc[val] = j;
            }
        }
    }
    void Make(void){
        for(int i = 1; i <= Q; ++i){
            int q;
            read(q);
            // scanf("%d", &q);
            printf("%d %d\n", lbuc[q] ? lbuc[q] : -1, rbuc[q] ? rbuc[q] : -1);
        }
    }
}

int main(){
    freopen("T2.in", "r", stdin);
    freopen("T2.out", "w", stdout);
    read(N), read(Q);
    // scanf("%d%d", &N, &Q);
    for(int i = 1; i <= N; ++i)read(a[i]), --a[i];
    if(N <= 20000){BL::Init(); BL::Make(); return 0;}
    

    fprintf(stderr, "Time: %.6lf\n", (double)clock() / CLOCKS_PER_SEC);
    return 0;
}


T3

很乱搞的一个暴力,我以为能过不少点,结果全被卡掉了,拿了暴力分跑路。

Code

#define _USE_MATH_DEFINES
#include <bits/stdc++.h>
#include <unordered_map>
#define PI M_PI
#define E M_E
#define npt nullptr
#define SON i->to

#define MOD (1000000007ll)

/******************************
abbr

******************************/

using namespace std;

mt19937 rnd(random_device{}());
int rndd(int l, int r){return rnd() % (r - l + 1) + l;}

typedef unsigned int uint;
typedef unsigned long long unll;
typedef long long ll;



template<typename T = ll>
inline T read(void);

map < pair < int, int >, ll > add;

int N, M;
ll a[210000];
ll sum[210000];
int main(){
    freopen("T3.in", "r", stdin);
    freopen("T3.out", "w", stdout);
    N = read(), M = read();
    for(int i = 1; i <= N; ++i)a[i] = read() % MOD, sum[i] = (sum[i - 1] + a[i]) % MOD;

    while(M--){
        int opt = read();
        if(opt == 1){
            int x = read(), y = read(), val = read() % MOD;
            auto tmp = add.find(make_pair(x, y));
            if(tmp == add.end())add.insert(make_pair(make_pair(x, y), val));
            else tmp->second = (tmp->second + val) % MOD;
        }else{
            int l = read(), r = read();
            ll ans = (sum[r] - sum[l - 1] + MOD) % MOD;
            for(auto i : add){
                int tl = l - i.first.second, tr = r - i.first.second;
                if(tr < 0)continue;
                int by = max(tl / i.first.first, 0);
                tl -= by * i.first.first;
                tr -= by * i.first.first;
                if(tl <= 0)ans = (ans + i.second) % MOD;
                ans = (ans + int(tr / i.first.first) * i.second % MOD) % MOD;
            }
            printf("%lld\n", ans % MOD);
        }
    }

    fprintf(stderr, "Time: %.6lf\n", (double)clock() / CLOCKS_PER_SEC);
    return 0;
}



template<typename T>
inline T read(void){
    T ret(0);
    short flag(1);
    char c = getchar();
    while(c != '-' && !isdigit(c))c = getchar();
    if(c == '-')flag = -1, c = getchar();
    while(isdigit(c)){
        ret *= 10;
        ret += int(c - '0');
        c = getchar();
    }
    ret *= flag;
    return ret;
}

T4

暴力跑路。

Code

#define _USE_MATH_DEFINES
#include <bits/stdc++.h>

#define PI M_PI
#define E M_E
#define npt nullptr
#define SON i->to

/******************************
abbr

******************************/

using namespace std;

mt19937 rnd(random_device{}());
int rndd(int l, int r){return rnd() % (r - l + 1) + l;}

typedef unsigned int uint;
typedef unsigned long long unll;
typedef long long ll;



template<typename T = int>
inline T read(void);

int N;
//x < y => -1, x > y => 1
vector < tuple < int, int, int > > relations;
int ans(0);
int a[110];
int main(){
    freopen("T4.in", "r", stdin);
    freopen("T4.out", "w", stdout);
    N = read();
    for(int i = 1; i <= N - 1; ++i){
        int x = read(), y = read(), op = read();
        relations.push_back(make_tuple(x, y, op));
    }
    int frac(1);
    for(int i = 1; i <= N; ++i)frac *= i, a[i] = i;
    --frac;
    for(int i = 1; i <= frac; ++i){
        bool flag(true);
        for(auto j : relations){
            int x, y, op; tie(x, y, op) = j;
            if((op && a[x] <= a[y]) || (!op && a[x] >= a[y])){
                flag = false;
                break;
            }
        }
        if(flag)++ans;
        next_permutation(a + 1, a + N + 1);
    }
    printf("%d\n", ans);

    fprintf(stderr, "Time: %.6lf\n", (double)clock() / CLOCKS_PER_SEC);
    return 0;
}



template<typename T>
inline T read(void){
    T ret(0);
    short flag(1);
    char c = getchar();
    while(c != '-' && !isdigit(c))c = getchar();
    if(c == '-')flag = -1, c = getchar();
    while(isdigit(c)){
        ret *= 10;
        ret += int(c - '0');
        c = getchar();
    }
    ret *= flag;
    return ret;
}

是的四道乱搞且挂分,好像是 T3 还是哪道来着想了半天感觉很接近正解,不过依然寄

正解

T1

LG-P3594 [POI2015] WIL

咕咕咕

UPD

update-2022_09_16 初稿

posted @ 2022-09-20 10:54  Tsawke  阅读(32)  评论(0编辑  收藏  举报