首页 > 其他分享 >暑假集训csp提高模拟2

暑假集训csp提高模拟2

时间:2024-07-21 18:08:19浏览次数:4  
标签:暑假 int freopen long 集训 FILE using csp define

赛时rank11,T1 30,T2 0,T3 20,T4 20

T1 活动投票

摩尔投票模板题

点此查看代码
#include<bits/stdc++.h>
#include<bits/extc++.h>
// using namespace __gnu_pbds;
// using namespace __gnu_cxx;
using namespace std;
#define infile(x) freopen(x,"r",stdin)
#define outfile(x) freopen(x,"w",stdout)
#define errfile(x) freopen(x,"w",stderr)
using ll=long long;using ull=unsigned long long;
#ifdef LOCAL
    FILE *InFile = infile("in.in"),*OutFile = outfile("out.out");
    // FILE *ErrFile=errfile("err.err");
#else
    FILE *Infile = stdin,*OutFile = stdout;
    //FILE *ErrFile = stderr;
#endif
signed main(){
    cin.tie(nullptr)->sync_with_stdio(false);
    cout.tie(nullptr)->sync_with_stdio(false);
    int n;
    cin>>n;
    int cnt = 0,ans = 0;
    for(int i = 1,x;i <= n; ++i){
        cin>>x;
        if(!cnt) cnt = 1,ans = x;
        else{
            if(ans == x) ++cnt;
            else --cnt;
        }
    }
    cout<<ans<<'\n';
}

T2 序列

二分做法 主要是线段树狂WA不止
暴力就是枚举子序列,可以做到\(O(n^2)\)
正解:
先用两个数组\(l_i\)表示\(a_i\)上一次出现的位置,\(r_i\)表示\(a_i\)下一次出现的位置,初值\(l\)为0,\(r\)为inf。
这样做有一个好处,只要满足\(l_i<L \&\& R < r_i\),那么该序列就合法。那么就递归解决\([L,i-1]\)和\([i+1,R]\)
枚举i时从两边找时间最少。
单次时间复杂度\(O(n\log n)\)

点此查看代码
#include<bits/stdc++.h>
#include<bits/extc++.h>
// using namespace __gnu_pbds;
// using namespace __gnu_cxx;
using namespace std;
#define infile(x) freopen(x,"r",stdin)
#define outfile(x) freopen(x,"w",stdout)
#define errfile(x) freopen(x,"w",stderr)
using ll=long long;using ull=unsigned long long;
#ifdef LOCAL
    FILE *InFile = infile("in.in"),*OutFile = outfile("out.out");
    // FILE *ErrFile=errfile("err.err");
#else
    FILE *Infile = stdin,*OutFile = stdout;
    //FILE *ErrFile = stderr;
#endif
const int N = 2e5 + 10;
int n,T,a[N],l[N],r[N];
bool solve(int L,int R){
    if(L >= R) return true;
    int xl = L,xr = R;
    while(xl < xr){
        xl++;
        if(l[xl] < L && R < r[xl]) return solve(L,xl-1)&&solve(xl+1,R);
        xr--;
        if(l[xr] < L && R < r[xr]) return solve(L,xr-1)&&solve(xr+1,R);
    }
    return false;
}
unordered_map<int,int> mp;
signed main(){
    cin.tie(nullptr)->sync_with_stdio(false);
    cout.tie(nullptr)->sync_with_stdio(false);
    cin>>T;
    while(T--){
        unordered_map<int,int>().swap(mp);
        cin>>n;
        for(int i = 1;i <= n; ++i) cin>>a[i];
        for(int i = 1;i <= n; ++i) l[i] = 0,r[i] = 0x3f3f3f3f;
        for(int i = 1;i <= n; ++i){
            if(mp[a[i]]){
                l[i] = mp[a[i]];
                r[mp[a[i]]] = i;
            }
            mp[a[i]] = i;
        }
        cout<<(solve(1,n)?"non-boring\n":"boring\n");
    }
}

T3 Legacy

线段树优化建图裸题。

点此查看代码
#include<bits/stdc++.h>
#include<bits/extc++.h>
// using namespace __gnu_pbds;
// using namespace __gnu_cxx;
using namespace std;
#define infile(x) freopen(x,"r",stdin)
#define outfile(x) freopen(x,"w",stdout)
#define errfile(x) freopen(x,"w",stderr)
using ll=long long;using ull=unsigned long long;
#ifdef LOCAL
    FILE *InFile = infile("in.in"),*OutFile = outfile("out.out");
    // FILE *ErrFile=errfile("err.err");
#else
    FILE *Infile = stdin,*OutFile = stdout;
    //FILE *ErrFile = stderr;
#endif
const int N = 1e6 + 10;
struct EDGE{int to,next,w;}edge[N<<1];
int head[N],cnt;
auto add = [](int u,int v,int w) -> void {edge[++cnt] = {v,head[u],w};head[u] = cnt;};
int t1[N<<2],t2[N<<2],tot;
void build(int k,int l,int r){
    if(l == r){t1[k] = t2[k] = l;return;}
    int mid = (l+r)>>1;
    build(k<<1,l,mid);build(k<<1|1,mid+1,r);
    t2[k] = ++tot;t1[k] = ++tot;
    add(t2[k<<1],t2[k],0);
    add(t2[k<<1|1],t2[k],0);
    add(t1[k],t1[k<<1],0);
    add(t1[k],t1[k<<1|1],0);
}
void updateIn(int k,int l,int r,int L,int R,int u,int w){
    if(L <= l && r <= R)return add(u,t1[k],w);
    int mid = (l+r)>>1;
    if(L <= mid) updateIn(k<<1,l,mid,L,R,u,w);
    if(R > mid) updateIn(k<<1|1,mid+1,r,L,R,u,w);
}
void updateOut(int k,int l,int r,int L,int R,int u,int w){
    if(L <= l && r <= R) return add(t2[k],u,w);
    int mid = (l+r)>>1;
    if(L <= mid) updateOut(k<<1,l,mid,L,R,u,w);
    if(R > mid) updateOut(k<<1|1,mid+1,r,L,R,u,w);
}
#define pli pair<ll,int>
#define mk make_pair
ll dist[N];
bitset<N> vis;
void dijkstra(int s){
    memset(dist,0x3f,sizeof dist);
    vis.reset();
    dist[s] = 0;
    priority_queue<pli,vector<pli>,greater<pli> > q;
    q.push(mk(0,s));
    while(q.size()){
        int x = q.top().second;q.pop();
        if(vis[x]) continue;
        vis[x] = true;
        for(int i = head[x]; i;i = edge[i].next){
            int y = edge[i].to;
            if(dist[y] > dist[x] + edge[i].w){
                dist[y] = dist[x] + edge[i].w;
                q.push(mk(dist[y],y));
            }
        }
    }
}
int n,q,s;
signed main(){
    cin.tie(nullptr)->sync_with_stdio(false);
    cout.tie(nullptr)->sync_with_stdio(false);
    cin>>n>>q>>s;
    tot = n;
    build(1,1,n);
    for(int i = 1;i <= q; ++i){
        int op;cin>>op;
        if(op == 1){
            int u,v,w;
            cin>>u>>v>>w;
            add(u,v,w);
        }
        if(op == 2){
            int u,l,r,w;
            cin>>u>>l>>r>>w;
            updateIn(1,1,n,l,r,u,w);
        }
        if(op == 3){
            int v,l,r,w;
            cin>>v>>l>>r>>w;
            updateOut(1,1,n,l,r,v,w);
        }
    }
    dijkstra(s);
    for(int i = 1;i <= n; ++i){
        cout<<(dist[i] == dist[0]?-1:dist[i])<<' ';
    }
}

T4 DP搬运工1

暴力就是直接枚举。
状压可以多拿一点。
正解是预设性dp

\(f_{i,j,k}\)表示填到位置\(i\),还有\(j\)个位置可以填,当前和为\(k\)的方案数。

点此查看代码
#include<bits/stdc++.h>
#include<bits/extc++.h>
// using namespace __gnu_pbds;
// using namespace __gnu_cxx;
using namespace std;
#define infile(x) freopen(x,"r",stdin)
#define outfile(x) freopen(x,"w",stdout)
#define errfile(x) freopen(x,"w",stderr)
using ll=long long;using ull=unsigned long long;
#ifdef LOCAL
    FILE *InFile = infile("in.in"),*OutFile = outfile("out.out");
    // FILE *ErrFile=errfile("err.err");
#else
    FILE *Infile = stdin,*OutFile = stdout;
    //FILE *ErrFile = stderr;
#endif
const int N = 60,mod = 998244353;
ll f[N][N][N*N],n,k;
signed main(){
    cin.tie(nullptr)->sync_with_stdio(false);
    cout.tie(nullptr)->sync_with_stdio(false);
    cin>>n>>k;
    f[1][0][0] = 1;
    for(int i = 2;i <= n; ++i){
        for(int j = 0;j <= n - i + 1; ++j){
            for(int t = 0;t <= k; ++t){
                if(f[i-1][j][t]){
                    f[i][j+1][t] = (f[i][j+1][t] + f[i-1][j][t]*2)%mod;
                    f[i][j][t + i] = (f[i][j][t+i] + f[i-1][j][t]*2)%mod;
                    if(j){
                        f[i][j+1][t] = (f[i][j+1][t] + f[i-1][j][t] * j) % mod;
                        f[i][j][t + i] = (f[i][j][t+i] + f[i-1][j][t]*2*j) % mod;
                        f[i][j-1][t+i+i] = (f[i][j-1][t+i+i] + f[i-1][j][t] * j) % mod;
                    }
                }
            }
        }
    }
    ll ans = 0;
    for(int i = 0;i <= k; ++i) ans = (ans + f[n][0][i])%mod;
    cout<<ans;
}

标签:暑假,int,freopen,long,集训,FILE,using,csp,define
From: https://www.cnblogs.com/hzoi-Cu/p/18312908

相关文章

  • 暑假集训CSP提高模拟4
    暑假集训CSP提高模拟4\(T1\)P134.WhiteandBlack\(0pts\)原题:[ARC148C]LightsOutonTree翻转方式:从根节点进行\(DFS\),若遇到黑点就进行翻转。最后一定能使全树均为白点,即不存在无解的情况。进而有每个点仅会被主动翻转一次,且翻转顺序与最终结果无关。观察到......
  • 暑假训练第二周周报
    总体学习情况这周时间大多花在写上周的堆栈的题单了,然后比赛又碰到了一些新的知识点,比如无权二分图的最大匹配,01背包的相似例题,但是感觉数据结构的基础还是得练,遇到一些题还是没办法写对。知识点模块1.无权二分图最大匹配用通俗的话来讲,假如有几个男的和几个女的存在暧昧关系,......
  • 暑假集训CSP提高模拟4
    A.WhiteandBlack暴力的\(O(nq)\)做法比较显然,因为对于根节点来说,只有它自己可以改变自己的颜色,因此如果它是黑色则一定需要更改自己,同时把更改传下去(应该没有那种每次真的更改所有节点然后写\(O(nqn^{n})\)的吧),同理,假如根节点更改结束,次级节点就同理了,这是一个连锁的反应,因......
  • 「模拟赛」暑期集训CSP提高模拟3(7.20)
    仍在施工...$165pts,Rank18$B题挂了45分,不然可以AC两道题的,呜题目列表:A.abc猜想B.简单的排列最优化题C.简单的线性做法题D.简单的线段树题A.abc猜想题意:给定三个正整数\(a,b,c\),你需要求出\(a^b\)除以\(c\)并向下取整得到的值对\(c\)取模的结果......
  • 暑假集训CSP提高模拟2 & 暑假集训CSP提高模拟3
    暑假集训CSP提高模拟2&暑假集训CSP提高模拟3暑假集训CSP提高模拟2纯纯科普场,打的还行。T1活动投票:摩尔投票板子。T2序列:考虑枚举端点没什么前途,考虑一个点能对多少区间产生贡献。考虑一个点的\(nxt\)和\(pre\)(表示下、上一个和他相同的点),当左端点在\(pre\simi......
  • 24-暑假软件工程周报(3)
    本周,我继续深入学习Hadoop和HBase。在上次报告的基础上,我主要集中在HBase的配置和使用方面,并遇到了一些问题,通过查阅资料和调试成功解决了这些问题。1.我学习了HBase的基本概念和架构。HBase是一个基于HadoopHDFS的分布式数据库,专门用于处理大规模数据的随机读写。它通过Zookeep......
  • 2024 暑假友谊赛 2
    2024暑假友谊赛2A-......
  • 暑假集训csp提高模拟3
    赛时rank20,T10,T245,T320,T495T1粘了两遍(因为OJ卡第一次没有显示出来)CE了,挂了100,T4没卡常挂了5汤碗了!!!!!!!!!!!!!!!T1abc猜想对于任意整数\(c\)都有\[\left\lfloor\frac{a}{b}\right\rfloor+c=\left\lfloor\frac{a}{b}+c\right\rfloor=\left\lfloor\frac{a+bc}{b}\right\rf......
  • 暑假集训记录
    这里记一些从7.15开始做的NOI篇或者让人眼前一亮的题目/trick。(哦,前面的题可能忘了某些细节了。)P3452求补图连通块个数。P4555首先看到回文串,先上马拉车。然后发现马拉车双回文不好做,考虑拆成两部分。大概就是维护一个以\(i\)为左端点/右端点的最长回文串。然后......
  • 暑假学习Java第三周
    通过本周的学习我认识到了自己有很多的不足与优点,优点是我能够把问题细化逐步分析,缺点是我的意志力不够坚定。我还了解了Java的三大特性包括:面向对象:Java是一种面向对象的编程语言,它允许程序员定义一系列关于对象和类的概念,并将这些概念作为编程的基本单位。在实际内容中,面向对象......