2023 NOIP 游寄

· · 个人记录

我看看有多少人吊打我

Day -1:

复习了ST表,线段树,KMP,LCA,结果,一个都没考!!

Day 0:

再次复习,好像都会了,又好像都不会,思考了考场策略,然后就躺倒床上了。

Day 1:

六点半才起来,再复习了一下。

吃完早餐直奔yh。

【T1】

【T2】

#include <bits/stdc++.h>
using namespace std;
int c,t;
int n,m;
const int N = 1e5+5;
struct node{
    char op;
    int x,y;
}a[N];
int z[15],b[15];
int ans=1e9;
void dfs(int x){
    if(x==n+1){
        for(int i = 1;i <= n;i++)b[i]=z[i];
        for(int i = 1;i <= m;i++){
            if(a[i].op=='T'){
                b[a[i].x]=1;
            }else if(a[i].op=='F'){
                b[a[i].x]=2;
            }else if(a[i].op=='U'){
                b[a[i].x]=3;
            }else if(a[i].op=='-'){
                if(b[a[i].y]==3){
                    b[a[i].x]=3;
                }else if(b[a[i].y]==2){
                    b[a[i].x]=1;
                }else if(b[a[i].y]==1){
                    b[a[i].x]=2;
                }
            }else if(a[i].op=='+'){
                if(b[a[i].y]==3){
                    b[a[i].x]=3;
                }else if(b[a[i].y]==2){
                    b[a[i].x]=2;
                }else if(b[a[i].y]==1){
                    b[a[i].x]=1;
                }
            }
        }
        int flag=1;
        for(int i = 1;i <= n;i++){
            if(b[i] != z[i]){
                flag=0;
                break;
            }
        }
        int res=0;
        for(int i = 1;i <= n;i++){
            if(b[i]==3){
                res++;
            }
        }
        if(flag){
//          cout<<res<<endl;
            ans=min(ans,res);
        }

        return ;
    }
    for(int i = 1;i <= 3;i++){
        z[x]=i;
        dfs(x+1);
    }
}
char sub2[N];
int sub3[N];
int main(){
    freopen("tribool.in","r",stdin);
    freopen("tribool.out","w",stdout);
    scanf("%d%d",&c,&t);
    while(t--){
        ans=1e9;
        scanf("%d%d",&n,&m);    
        for(int i = 1;i <= m;i++) {
            cin>>a[i].op;
            scanf("%d",&a[i].x);
            if(a[i].op=='-'||a[i].op=='+'){
                scanf("%d",&a[i].y);
            }else{
                a[i].y=-1;      
            }
        }
        if(c<=2){
            dfs(1);
            printf("%d\n",ans);
        }else if(c >= 3 && c <= 4){
            int res2=0;
            for(int i = 1;i <= n;i++)sub2[i] = ' ';
            for(int i = 1;i <= m;i++){
                sub2[a[i].x] = a[i].op;
            }for(int i=1;i<=n;i++){
                if(sub2[i]=='U'){
                    res2++;
                }
            }printf("%d\n",res2);
        }
//      else if(c >= 5 && c <= 6){
//          memset(sub3,0,sizeof sub3);
//          for(int i = 1;i <= n;i++){
//              for(int j = m;j >= 1;j--){
//                  if(a[i].x == i){
//                      if(a[i].op=='U'){
//                          sub3[a[i].x]=1;
//                      }else break;
//                  }
//              }
//          }
//          for(int  i = 1;i <= n;i++){
//              int x = 
//          }
//      }
        else dfs(1);

    }
    return 0;
} 
/*

*/

【T3】

#include <bits/stdc++.h>
using namespace std;
int c,n,m,q,x,y;
int main(){
    freopen("expand.in","r",stdin);
    freopen("expand.out","w",stdout);
    scanf("%d%d%d%d",&c,&n,&m,&q);
    if(n==1&&m==1){
        scanf("%d%d",&x,&y);
        while(q--){
            int kx,ky;
            scanf("%d%d",&kx,&ky);
            for(int i = 1;i <= kx;i++){
                int a,b;
                scanf("%d%d",&a,&b);
                if(a==1) x=b;
            }for(int i = 1;i <= ky;i++){
                int a,b;
                scanf("%d%d",&a,&b);
                if(a==1) y=b;
            }if(x!=y)cout<<'1';
            else cout<<'0';
        } 
    } 
    return 0;
}

【T4】

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int M = 1E5+5;
int c,t;
int n,m,k,d;
struct node{
    int x,y,z;
}a[M];
int vis[30];
int q[30];
int main(){
    freopen("run.in","r",stdin);
    freopen("run.out","w",stdout);
    scanf("%d%d",&c,&t);
    while(t--){
        scanf("%d%d%d%d",&n,&m,&k,&d);
        for(int i = 1;i <= m;i++){
            scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
            int x=a[i].x-a[i].y+1,y=a[i].x;
            a[i].x=x,a[i].y=y;
        } 
        if(c <= 2){
            ll ans=0;
            for(int z=0;z <= (1 << (n+1));z++){
                memset(vis,0,sizeof vis);
                memset(q,0,sizeof q);
                for(int i = 1;i <= n;i++){
                    if((1<<i) & z) vis[i]=1;
                }
                int cnt=0;
                int maxx=0;
                for(int i =1;i <= n;i++){
                    if(!vis[i]){
                        maxx = max(maxx,cnt);
                        cnt=0;
                    }else{
                        cnt++;
                    }
                }maxx = max(maxx,cnt);
                if(maxx > k) continue;
                for(int i = 1;i <= n;i++) {
                    q[i] = q[i-1] + vis[i];
                }
                ll res=-1 * q[n] * d;
                for(int i = 1;i <= m;i++){
                    if(q[a[i].y] - q[a[i].x - 1] == a[i].y - a[i].x + 1) res+=a[i].z;
                }ans = max(ans,res);
            }printf("%lld\n",ans);
        }
    }
    return 0;
} 

总结:

不够细心,时间分配不好,下次要审题仔细,然后抓紧时间。

【估分】

【预估分数】:100+40+0+0 ~ 100+40+5+8 之间。

【小图灵】:90+40+0+0 = 130

【洛谷】:90+40+0+0 = 130

【云斗】:90+40+0+0 = 130

【信友队】:90+40+0+0 = 130

好好好,都是130是吧!!

我瞬间傻了,T1我的做法是要取最大和次大,我也不知道我写一个sort干啥用的!!!!成功将 O(2\times nm) 的算法提高到 O(nm\log n),你看我多厉害!!!!赛时还在卡常的我!!!!!!!!!!!!

啊啊啊 啊啊啊 啊啊啊 啊啊啊 啊啊啊 啊啊啊 啊啊啊 啊啊啊 啊啊啊 啊啊啊 啊啊啊 啊啊啊 啊啊啊

顺便给个关注呗

点个赞呗