2024 ICPC ShaanXi Provincial Contest

A. chmod

模拟

F. Try a try, AC is OK

gi&gj<=gi gi&gj<=gj
可以都交最大的,任意gi&gj<=gi<=gmax

M. Window Decoration

观察菱形周围从近到远的点,发现只有以四个点为中心的会相交,
加进来稳定增加2,相交就减少
先要去掉重复

#include<iostream>
using namespace std;
int n;
bool vis[100][100];
int dx[4]={1,0,-1,0};int dy[4]={0,1,0,-1};
int main(){
    std::ios::sync_with_stdio(false);
    double ans=0;
   cin>>n;
   while(n--){
        int x,y;cin>>x>>y;
        if(vis[x][y])continue;
        
        vis[x][y]=1;ans+=2.0;
        for(int k=0;k<4;k++){
            int tx=x+dx[k];int ty=y+dy[k];
            if(tx>=1&&tx<=99&&ty>=1&&ty<=99){
                if(vis[tx][ty])ans-=0.5;
            }
        }
   }
   cout<<ans;
}

G. Disappearing Number

我直接数位dp板子,也可以模拟做,
以2为例,一位的有1个
两位的有12 22 32 42 共81+10个
三位的有8
18+100个
依次类推

C. Seats

#include<iostream>
using namespace std;
#include<vector>
#include<queue>
const int N=200010;
int n;
int a[N];int ind[N];
int vis[N];int pre[N];int f[N];
vector<int> G[N];
int ans=0;
bool flag=0;
void dfs(int u){
    vis[u]=1;
    for(auto v:G[u]){
        if(vis[v]==1){
            int t=u;int cnt=1;flag=1;
            while(t!=v){
                t=pre[t];cnt++;
            }
            //cout<<"get"<<cnt<<endl;
            ans+=cnt;
        }else if(vis[v]==0){
            pre[v]=u;
            dfs(v);
        }
    }
    vis[u]=2;
}


int main(){
    std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];ind[a[i]]++;
    G[i].push_back(a[i]);
    }
    queue<int> q;
    for(int i=1;i<=2*n;i++){if(!ind[i])q.push(i);
    }for(int i=1;i<=2*n;i++)f[i]=1;
    while(!q.empty()){
        int u=q.front();q.pop();
        vis[u]=1;
        for(auto v:G[u]){
            --ind[v];
            f[v]=max(f[u]+1,f[v]);
            if(ind[v]==0)q.push(v);
        }
    }
    for(int i=n+1;i<=n+n;i++)ans+=f[i]-1;
    for(int i=1;i<=n;i++)if(!vis[i])ans++;
    cout<<ans;

}
posted @ 2025-07-30 19:02  arin876  阅读(17)  评论(0)    收藏  举报