首页 > 其他分享 >正睿csp-s 7连测 day6

正睿csp-s 7连测 day6

时间:2024-10-13 17:13:20浏览次数:6  
标签:210 day6 ll long mxn int 连测 正睿 define

day 6

A. Thoughtful Dreams

难度:红
输出 \(1\sim n\) 即可。

#include<bits/stdc++.h>
#define ll long long
#define mxn 200010
using namespace std;
ll n;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
        cout<<i<<' ';
    return 0;
}

B. Azurite Ascent

难度:红
我真唐,真的。
判断相邻两个数之间是否互质即可。

#include<bits/stdc++.h>
#define mxn 200010
#define ll long long
using namespace std;
ll n,a[mxn];
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    a[0]=a[n];
    for(int i=1;i<=n;i++){
        if(__gcd(a[i],a[i-1])!=1){
            cout<<"No";
            exit(0);
        }
    }
    cout<<"Yes";
    return 0;
}

C. Ancient Engine

难度:蓝
恶心图论大模拟。
若有环且有路径长度不为 \(0\),则时间和路径数都为 \(inf\)。
若无环则为DAG,跑一遍拓扑排序找出最长路,然后对于每一段路径取最大值,数量就在拓扑排序时算出。

#include<bits/stdc++.h>
#define ll long long
#define mxn 200010
#define mxm 2000010
#define mod 998244353
#define pb push_back
#define mp make_pair
#define pii pair<int,int>
#define fi first
#define se second
using namespace std;
int n,m,pd=1,ans,du1[mxn],du2[mxn];
int judge[mxn],vis[mxn];
int cnt[mxn],road[mxn];
int layer[mxn],lcnt,tmp[mxn],tcnt;
vector<pii> t1[mxn],t2[mxn];
queue<int> q1,q2;
void dfs(int u){
    if(vis[u]==2){cout<<"inf\ninf";exit(0);}
    if(vis[u])return;
    vis[u]=2;
    for(int i=0;i<t1[u].size();i++){
        int v=t1[u][i].fi;
        dfs(v);
    }
    vis[u]=1;
    return;
}
void add(int &x,int y){
    if(x<0||y<0){x=-1;return;}
    else{x=(x+y)%mod;return;}
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        int u,v,w;
        cin>>u>>v>>w;
        t1[v].pb(mp(u,w));
        t2[u].pb(mp(v,w));
        du1[u]++,du2[v]++;
        pd&=(!w);
        judge[u]|=w;
    }
    for(int i=1;i<=n;i++)if(judge[i])dfs(i);
    for(int i=1;i<=n;i++)if(du1[i]==0)q1.push(i);
    for(int i=1;i<=n;i++)if(du2[i]==0)q2.push(i);
    while(q1.size()){
        int u=q1.front();
        q1.pop();
        add(cnt[u],1);
        for(int i=0;i<t1[u].size();i++){
            int v=t1[u][i].fi;
            if(vis[v])continue;
            cnt[v]=(cnt[u]+cnt[v])%mod;
            du1[v]--;
            if(du1[v]==0)q1.push(v);
        }
    }
    for(int i=1;i<=n;i++)
        if(!cnt[i]&&!vis[i])
            cnt[i]=-1;
    if(pd){
        ans=0;
        for(int i=1;i<=n;i++)
            add(ans,cnt[i]);
        cout<<"0\n";
        if(ans<0)cout<<"inf";
        else cout<<ans;
        return 0;
    }
    for(int i=1;i<=n;i++)road[i]=1;
    while(q2.size()){
        int u=q2.front();
        q2.pop();
        if(vis[u]==0)continue;
        for(int i=0;i<t2[u].size();i++){
            int v=t2[u][i].fi;
            road[v]=max(road[v],road[u]+(vis[u]|vis[v]));
            du2[v]--;
            if(du2[v]==0)q2.push(v);
        }
    }
    for(int i=1;i<=n;i++){
        judge[i]=0;
        ans=max(ans,road[i]);
    }
    for(int i=1;i<=n;i++)
        if(road[i]==ans)
            layer[++lcnt]=i;
    while(road[layer[1]]!=1){
        for(int i=1;i<=lcnt;i++)tmp[i]=layer[i];
        tcnt=lcnt;
        ans=0,lcnt=0;
        for(int i=1;i<=tcnt;i++){
            int u=tmp[i];
            for(int j=0;j<t1[u].size();j++){
                int v=t1[u][j].fi;
                if(road[v]!=road[u]-1)continue;
                ans=max(ans,t1[u][j].se);
            }
        }
        cout<<ans;
        for(int i=1;i<=tcnt;i++){
            int u=tmp[i];
            for(int j=0;j<t1[u].size();j++){
                int v=t1[u][j].fi;
                if(road[v]!=road[u]-1)continue;
                if(t1[u][j].se==ans){
                    add(cnt[v],cnt[u]);
                    if(judge[v]==0)
                        layer[++lcnt]=v;
                    
                    judge[v]=1;
                }
            }
        }
    }
    cout<<'\n';
    ans=0;
    for(int i=1;i<=lcnt;i++)
        ans=(ans+cnt[layer[i]])%mod;
    if(ans<0)cout<<"inf";
    else cout<<ans;
    return 0;
}

D. Above Celeste's Peak

难度:蓝-紫
恶心的矩阵优化dp。
求本质不同子序列?这里的dp我在之前的模拟赛中写过。
这里转化成矩阵乘法,时间复杂度 \(O((n+q)m^3)\),会TLE。
笔者止步于此,\(O((n+q)m)\) 的做法尚未搞懂(以后也可能没时间再想了),先把官方std留下吧。

#include<bits/stdc++.h>
#define mxn 210000
#define ll long long
#define P 998244353
using namespace std;
int a[mxn][210],b[mxn][210],c[mxn][210];
int d[210],n,m,t,x[mxn],h,f,g,ans,l,r;
vector<int>p[210],q[210];
int add(int x,int y){
    return x+y<P?x+y:x+y-P;
}
int mus(int x,int y){
    return x-y<0?x-y+P:x-y;
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
	cin>>n>>m>>t;
    m++;
	for(int i=1;i<=n;i++)cin>>x[i];
	for(int i=1;i<=m;i++){
        a[i][i]=b[i][i]=d[i]=1;
        p[i].push_back(i);
        q[i].push_back(i);
    }
	for(int i=1;i<=n;i++){
		int k=p[x[i]].back(),l=i+m;
		for(int j=1;j<=m;j++){
            a[l][j]=d[j];
            d[j]=mus(add(d[j],d[j]),a[k][j]);
        }
		p[x[i]].push_back(l);
	}
	for(int i=n;i;i--){
		int k=q[x[i]].back(),l=n+m+1-i;
		for(int j=1;j<=m;j++){
            b[l][j]=mus(0,c[i+1][j]);
            c[i][j]=add(add(c[i+1][j],c[i+1][j]),b[k][j]);
        }
		q[x[i]].push_back(l);
	}
	while(t--){
		cin>>h>>f>>g;
		ans=0;
		l=*(--upper_bound(q[f].begin(),q[f].end(),n+m-h));
		r=*(--upper_bound(p[g].begin(),p[g].end(),h+m-1));
        for(int j=1;j<=m;j++)
		    ans=(ans+(b[l][j]+2ll*c[h+1][j]+(j==m))*a[r][j])%P;
        cout<<ans<<'\n';
	}
	return 0;
}

标签:210,day6,ll,long,mxn,int,连测,正睿,define
From: https://www.cnblogs.com/nagato--yuki/p/18461302

相关文章

  • Day6 备战CCF-CSP练习
    Day6题目描述给出一个字符串和多行文字,在这些文字中找到字符串出现的那些行。你的程序还需支持大小写敏感选项:当选项打开时,表示同一个字母的大写和小写看作不同的字符;当选项关闭时,表示同一个字母的大写和小写看作相同的字符。输入格式输入的第一行包含一个字符串\(S\),由大......
  • 10.8 模拟赛(2023 CSP-S 十连测 #5)
    炼石计划10月28日CSP-S十连测#5【补题】-比赛-梦熊联盟(mna.wang)复盘T1秒了。30min。T2题目越短越难。但是链的是经典题目,写了。小样例太水,大样例太大,不方便猜结论。于是先写暴力然后自己造样例。模拟了五六组感觉可以按照lca的深度降序排序,然后能选就选。这......
  • 10.5 模拟赛(NOIP十三连测 #11)
    2024--梦熊&太戈--NOIP十三连测#11【订正】-比赛-梦熊联盟(mna.wang)复盘赢麻了(?)老师说照着\(300\)分打。顺序开题。T1读懂题后模拟了一下样例,发现答案就是$n-$连通块???快速写完了代码发现大样例全过了。此时8:05。T2。一眼DP。但是\(n\le10^6\)所以放弃了。......
  • 代码随想录算法训练营第六天|Day6哈希表基础
    242.有效的字母异位词题目链接/文章讲解/视频讲解:https://programmercarl.com/0242.%E6%9C%89%E6%95%88%E7%9A%84%E5%AD%97%E6%AF%8D%E5%BC%82%E4%BD%8D%E8%AF%8D.html思路1.暴力的解法,两层为循环,很明显时间复杂度是O(n^2)。boolisAnagram(char*s,char*t){if(......
  • 正睿csp-s7连测 day4
    注:未登录正睿OI账号则看不了题目。day4A难度:蓝-紫考虑贪心。考虑优先选当前能连到了最小的点,但是这样会被样例卡疯。考虑加一点策略。首先,若当前选到的点权大于其儿子的点权,那肯定把儿子也选上了,不然就不优了。然后树上就会出现一些团。现在假设一个点下面连着两个团,考虑......
  • 梦熊 NOIP 13连测 #3
    A.赛事找规律找到了,可惜差一步,然后用了oies。欧拉定理:若\(gcd(a,m)=1\),则\(a^{\phi(m)}\equiv1(mod\m)\)。发现1和\(2n\)永远都不会动,并且当2归位时,整套牌也都归位了,所以先只考虑2的位置变化。如果\(n\)无线大,第\(i\)次操作后2的位置为\(2^i+1......
  • 9.27 模拟赛(NOIP十三连测 #10)
    2024--梦熊&太戈--NOIP十三连测#10【订正】-比赛-梦熊联盟(mna.wang)复盘开T1。差分转化。模拟了一下样例感觉方案好像是唯一确定的,不需要贪心/DP。但不太能证。想了会感觉找不出反例。然后写完了。对拍没挂。用时不到\(30\)分钟。T2。\(m\le20\)且数据随机感觉很......
  • 【2021提高组十连测day7】a
    【2021提高组十连测day7】a题意:求每个点和其他所有点曼哈顿距离的平方之和。形式化地,求\(\sum_{j=1}^{n}(|x_i-x_j|+|y_i-y_j|)^2(1\lei\len)\)。对于每个点,我们把其他点分成四部分:左上、左下、右上、右下。四个部分可以通过旋转整个坐标系来解决。因此这里讲如何处理左上......
  • 【20zr提高组十连测day10】心
    【20zr提高组十连测day10】心首先不同的操作序列一定在某个时刻使数组内容不同,因此我们只需要统计合法的操作序列数量。一个合法的最终数组形如若干个\(1,M\),而且\(1,M\)之间可能有若干个\(x\),长度为\(n+1\)。造成这个数组的操作序列必须满足所有操作\(1,M\)按顺序排列,......
  • 【20zr提高组十连测day10】信
    【20zr提高组十连测day10】信给定\(n,m\),\(n,m\le10^5\),给定分别长度为\(n-1,m,n,m-1\)的单调不减的序列\(A,B,C,D\),然后形如该图建边:考虑到序列是递增的,对于除最左上角以外的每个点,每个点一定要选和自己相连的一条边才能形成一棵树。那么选择左边或上边一定是更优的,而且......