复健存档

怎么会有人图都不会存了

 

8.6

字符串(基础)√

埃氏筛/线性筛 √

void work(){
    for(int i=2;i<=MX;i++){
        if(!vis[i]){
            pri[++cnt]=i;
        }
        for(int j=1;j<=cnt&&i*pri[j]<=MX;j++){
            vis[i*pri[j]]=1;
            if(i%pri[j]==0)break;
        }
    }
}
线筛

单向链表 √

 

8.7

指针

存图 √(vector咕)

最短路 √

高精 √

#include<bits/stdc++.h>
using namespace std;
const long long M=6227020800;
char a[1000010],b[1000010];
int aa[1000010],bb[1000010];
long long mid,ans,c[1000010],d[1000010];
int lena,lenb,tag,lend;
int check(long long x){
    for(int i=1;i<=lenb;i++){
        d[i]=(bb[i]*x+c[i-1])%10;
        c[i]=(bb[i]*x+c[i-1])/10;
    }
    lend=lenb;
    while(c[lend]){
        lend++;
        d[lend]=c[lend-1]%10;
        c[lend]=c[lend-1]/10;
    }
    if(lend<lena)return 0;
    else if(lend>lena)return 1;
    else{
        for(int i=lend;i>=1;i--){
            if(aa[i]>d[i])return 0;
            else if(aa[i]<d[i])return 1;
        }
        return 2;
    }
}
void work(long long l,long long r){
    if(l>r)return;
    if(l==r){
        tag=check(l);
        if(tag==2||tag==0){
            ans=r;
        }
        return;
    }
    mid=(l+r)/2;
    tag=check(mid);
    if(tag==2){
        ans=mid;
        return;
    }
    else if(tag)work(l,mid-1);
    else ans=mid,work(mid+1,r);
}
int main()
{
    scanf("%s%s",a+1,b+1);
    lena=strlen(a+1);
    lenb=strlen(b+1);
//    printf("%s\n%s",a+1,b+1);
    for(int i=1;i<=lena;i++)aa[i]=a[lena-i+1]-'0';
    for(int i=1;i<=lenb;i++)bb[i]=b[lenb-i+1]-'0';
    work(1,M);
    printf("%lld\n",ans);
    return 0;
}
存个丑陋的高精代码(P2005)

并查集(一时间居然想不起它的名字)√

 

8.8

贪心(这玩意不可能打勾的,永远不可能)

 

8.9

线段树(哼哼啊啊啊啊连线段树都忘了!)

#include<bits/stdc++.h>
using namespace std;
const int N=200010;
int n,m;
char s[N];
struct tree{
    int l,r;
    int sum,tag;
}a[N<<3];
void spread(int p){
    a[p<<1].tag^=a[p].tag;
    a[p<<1|1].tag^=a[p].tag;
    if(a[p].tag)a[p<<1].sum=a[p<<1].r-a[p<<1].l+1-a[p<<1].sum;
    if(a[p].tag)a[p<<1|1].sum=a[p<<1|1].r-a[p<<1|1].l+1-a[p<<1|1].sum;
    a[p].tag=0;
}
void build(int p,int l,int r){
    a[p].l=l,a[p].r=r;
    if(l==r){
        a[p].sum=s[l]-'0';
        return;
    }
    int mid=(l+r)>>1;
    build(p<<1,l,mid);
    build(p<<1|1,mid+1,r);
    a[p].sum=a[p<<1].sum+a[p<<1|1].sum;
}
void change(int p,int l,int r){
    if(a[p].l>=l&&a[p].r<=r){
        a[p].tag^=1;
        a[p].sum=a[p].r-a[p].l+1-a[p].sum;
        return;
    }
    spread(p);
    int mid=(a[p].l+a[p].r)>>1;
    if(r<=mid)change(p<<1,l,r);
    else if(l>mid)change(p<<1|1,l,r);
    else change(p<<1,l,r),change(p<<1|1,l,r);
    a[p].sum=a[p<<1].sum+a[p<<1|1].sum;
}
int ask(int p,int l,int r){
    if(a[p].l>=l&&a[p].r<=r)return a[p].sum;
    spread(p);
    int mid=(a[p].l+a[p].r)>>1,ans;
    if(r<=mid)ans=ask(p<<1,l,r);
    else if(l>mid)ans=ask(p<<1|1,l,r);
    else ans=ask(p<<1,l,r)+ask(p<<1|1,l,r);
    a[p].sum=a[p<<1].sum+a[p<<1|1].sum;
    return ans;
}
int main()
{
    scanf("%d%d",&n,&m);
    scanf("%s",s+1);
    build(1,1,n);
    for(int i=1,t,l,r;i<=m;i++){
        scanf("%d%d%d",&t,&l,&r);
        if(!t){
            change(1,l,r);
        }
        else{
            printf("%d\n",ask(1,l,r));
        }
    }
    return 0;
}
再存个奇怪(并不)的线段树(P2574)

 背包

#include<bits/stdc++.h>
using namespace std;
int n,m,ans,ii,jj;
int a[25][25];
struct node{
    int sum,i,j,k;
}d[15][20];
void work(int x,int y){
    if(x==n+1)return;
    printf("%d %d\n",x,d[x][y].k);
    work(d[x][y].i,d[x][y].j);
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            scanf("%d",&a[i][j]);
        }
    }
    for(int i=n;i>=1;i--){
        d[i][0].i=i+1;
        for(int j=1;j<=m;j++){
            for(int k=0;k<=j;k++){
                if(d[i][j].sum<d[i+1][j-k].sum+a[i][k]){
                    d[i][j].sum=d[i+1][j-k].sum+a[i][k];
                    d[i][j].i=i+1;
                    d[i][j].j=j-k;
                    d[i][j].k=k;
                }
            }
        } 
    }
//    for(int i=1;i<=m;i++){
//        if(ans<d[n][i].sum){
//            ans=d[n][i].sum;
//            ii=d[n][i].i;
//            jj=d[n][i].j;
//        }
//    }
//    printf("%d\n",ans);
//    work(ii,jj);
//    printf("%d %d\n",n,d[n][m].k);
    
    printf("%d\n",d[1][m].sum);
    printf("%d %d\n",1,d[1][m].k);
    work(d[1][m].i,d[1][m].j);
//    printf("%d %d\n",1,d[1][m].k);
    return 0;
}
/*
3 3
30 40 50
20 30 80
20 25 30
*/
勉强胡编乱造的背包(P2066)

 

8.10

组合数(n^2)

 

[本日运势:开门大吉,请吃汽车尾气~]

posted @ 2022-08-07 10:31  Chloris_Black  阅读(33)  评论(0编辑  收藏  举报