首页 > 其他分享 >CSP模拟11

CSP模拟11

时间:2023-08-01 21:24:25浏览次数:36  
标签:11 取模 ch int ll opt include CSP 模拟

看到题目就绷不住了。今天事故挺多的,心里活动也很复杂。
在一道题上浪费太多时间了……明知道做不出来还挺不甘……挺怪的。虽然中场改题面但T3其实依旧水但被T1绑住了,不知是不是对当时摆烂的后悔或弥补.果然时间是守恒的


数位DP.

数位DP刚好要做原题,但摆了没做。发现这一事实的时候心情挺复杂的……以后学知识点刷题不能摆!!!不能摆!!!不知道为什么一直在死磕这题。

1~9的最小公倍数为2520,状压出现过那些数,算每次选之后组成的数是啥,并对2520取模。合法取模后不会变成不合法。

要交CF能不取模就不取模,能不ll就不ll。

Code

#include<cstdio>
#include<cstring>

#define ll long long

using namespace std;
const ll mod=2520;

constexpr auto SIZE(1<<20);
char in[SIZE],out[SIZE],*p1=in,*p2=in,*p3=out;
#define getchar() (p1==p2&&(p2=(p1=in)+fread(in,1,SIZE,stdin),p1==p2)?EOF:*p1++)
#define flush() (fwrite(out,1,p3-out,stdout))
#define putchar(x) (p3==out+SIZE&&(flush(),p3=out),*p3++=(x))
class Flush{public:~Flush(){flush();}}_;
inline ll read(){
	ll x(0);bool f(0);char ch=getchar();
	for(;ch<'0'||ch>'9';ch=getchar()) f^=ch=='-';
	for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<1)+(x<<3)+(ch^48);
	return f?x=-x:x;
}
inline void write(ll x){
	x<0?x=-x,putchar('-'):0;static short Sta[50],top(0);
	do{Sta[++top]=x%10;x/=10;}while(x);
	while(top) putchar(Sta[top--]|48);
	putchar('\n');
}

ll T;
int a[25],len;
ll dp[25][2530][270];

inline int get(int x){
    return x<2?0:(1<<(x-2));
}

ll dfs(int x,int limit,ll num,int sta){
    if(x<=0){
        for(ll i=2;i<=9;i++){
            if((sta&get(i))&&num%i!=0){
                return 0;
            }
        }
        return 1;
    }

    if(!limit&&dp[x][num][sta]!=-1)
        return dp[x][num][sta];
    
    int res=limit?a[x]:9;
    ll sum=0;

    for(int i=0;i<=res;i++){
        sum+=dfs(x-1,limit&&i==res,(num*10+i)%mod,sta|get(i));
    }

    if(!limit)
        dp[x][num][sta]=sum;
    return sum;
}

inline ll solve(ll x){
    if(x==0)
        return 1;
    len=0;
    while(x){
        a[++len]=x%10;
        x/=10;
    }

    return dfs(len,1,0,0);
}

signed main(){
    T=read();

    memset(dp,-1,sizeof(dp));

    while(T--){
        ll l=read(),r=read();
        write(solve(r)-solve(l-1));
    }

    return 0;
}


AC自动机套数据结构

统计挺板子的,直接统计有多少以它结尾的就好。修改也就修改标记就好。
但暴力统计会变成\(n^2\)的所以我们有数据结构维护一下,运用欧拉序统计答案就好。

CF线段树会又T又M.

Code
#include<cstdio>
#include<string>
#include<iostream>
#include<queue>
#include<cstring>
#include<map>

#define lc (k<<1)
#define rc (k<<1|1)

#define ll long long

using namespace std;
const int N=1e5+5;
const int M=1e6+5;

int n,m;

int t[M][6],tot,fail[M];
int root[N];

vector <int> v[M];

void insert(string s,int j){
    int len=s.size();
    int now=0;

    for(int i=0;i<len;i++){
        if(!t[now][s[i]-'a']){
            t[now][s[i]-'a']=++tot;
        }
        now=t[now][s[i]-'a'];
    }

    root[j]=now;
}

void build(){
    queue <int> q;

    for(int i=0;i<4;i++){
        if(t[0][i]){
            v[0].push_back(t[0][i]);
            q.push(t[0][i]);
        }
    }

    while(!q.empty()){
        int now=q.front();
        q.pop();

        for(int i=0;i<4;i++){
            if(t[now][i]){
                fail[t[now][i]]=t[fail[now]][i];
                v[fail[t[now][i]]].push_back(t[now][i]);
                q.push(t[now][i]);
            }else{
                t[now][i]=t[fail[now]][i];
            }
        }
    }
}

int in[M],out[M],dfntot;
ll sum[M<<2];

void dfs(int x,int fa){
    in[x]=++dfntot;

    for(int i=0;i<v[x].size();i++){
        dfs(v[x][i],x);
    }
    out[x]=++dfntot;
}

int lowbit(int x){
    return x&(-x);
}

ll c[M<<1];

void update(int x,ll val){
    while(x<=dfntot){
        c[x]+=val;
        x+=lowbit(x);
    }
}
ll query(int x){
    ll ans=0;
    while(x){
        ans+=c[x];
        x-=lowbit(x);
    }
    return ans;
}

void solve(){
    string s;
    cin>>s;

    int len=s.size();
    int now=0;
    ll ans=0;

    for(int i=0;i<len;i++){
        now=t[now][s[i]-'a'];
        // printf("%d ",in[now]);
        ans+=query(in[now]);
    }
    cout<<ans<<endl;
}

bool vis[N];

signed main(){
    freopen("in","r",stdin);
	// freopen("eldenring.in","r",stdin);
	// freopen("eldenring.out","w",stdout);
	
    cin>>n>>m;

    for(int i=1;i<=n;i++){
        string s;
        vis[i]=1;
        insert(s,i);
    }    

    // for(int i=1;i<=n;i++){
    //     printf("%d ",root[i]);
    // }

    build();
    dfs(0,0);

    // for(int i=1;i<=tot;i++){
    //     printf("%d %d\n",in[i],out[i]);
    // }

    for(int i=1;i<=n;i++){
        sum[in[root[i]]]++;
        sum[out[root[i]]]--;
    }
    // for(int i=1;i<=dfntot;i++){
    //     printf("%d ",sum[i]);
    // }

    for(int i=1;i<=dfntot;i++){
        update(i,sum[i]);
    }

    for(int i=1;i<=m;i++){
        char opt;

        cin>>opt;

        if(opt=='?'){
            solve();
        }else if(opt=='+'){
            int x;
            cin>>x;
            if(!vis[x]){
                vis[x]=1;
                update(in[root[x]],1);
                update(out[root[x]],-1);
            }
        }else if(opt=='-'){
            int x;
            cin>>x;
            if(vis[x]){
                vis[x]=0;
                update(in[root[x]],-1);
                update(out[root[x]],1);
            }
        }
    }

    return 0;
}


最水的一道……
若选 \(i\) 比 选 \(j\) 好 则 $ a_i-b_j>a_j-b_i 则 a_i+b_i>a_j+b_j$
按和排序就好.

Code

···cpp
n=read();

for(int i=1;i<=n;i++){
    a[i].a=read(),a[i].b=read();
    a[i].sum=a[i].a+a[i].b;
}

sort(a+1,a+1+n,cmp);

int ans1=0,ans2=0;
int now=1;

for(int i=1;i<=n;i++){
    if(now==1){
        ans1+=a[i].a;
    }else{
        ans2+=a[i].b;
    }
    now^=1;
}

printf("%lld ",ans1-ans2);

···


$ f_i=min(f_j+a_i*b_j) $
set启发式合并/李超线段树维护凸包/甚至还有神奇的淀粉质和CDQ分治

参考:
(https://www.cnblogs.com/CQzhangyu/p/8456770.html)(https://www.cnblogs.com/Itst/p/10328668.html)

Code
咕……

标签:11,取模,ch,int,ll,opt,include,CSP,模拟
From: https://www.cnblogs.com/yszy/p/17599073.html

相关文章

  • 禁用Win10更新,禁用Win11更新,更彻底的关闭系统更新
    新建一个bat文件填充以下内容::WindowsauomaticupdatesregaddHKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU/vAutoInstallMinorUpdates/tREG_DWORD/d1/fregaddHKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU/vNoAutoUpda......
  • 信奥赛例题——1132,1166,1167,1186
    //1132//#include<iostream>//usingnamespacestd;//intmain(intargc,char**argv){// intN;// cin>>N;// stringS1,S2;// stringx="Rock",y="Scissors",z="Paper";// for(inti=0;i<N;i++){// cin>&g......
  • 在 浏览器中的找到 span 标签中内容是 “加入购物车” 的按钮 并用js代码模拟点击
    在浏览器中的找到span标签中内容是“加入购物车”的按钮并用js代码模拟点击functionsimulateButtonClick(){//找到包含“加入购物车”文本的所有span标签constspanElements=document.getElementsByTagName("span");//遍历所有的span标签for(leti=0;i......
  • 提供高达400MHz性能ADBF704WCCPZ411、ADBF705WCBCZ411嵌入式处理器(DSP)
    这些器件是ADSP-BF70xBlackfin数字信号处理器(DSP)产品系列中的一员。新款Blackfin+处理器内核将16位双MAC、32位MAC和16位复杂MAC结合为先进的信号处理引擎。它还将干净且正交的RISC式微处理器指令集的优势和单指令、多数据流(SIMD)多媒体能力结合为一个指令集架构。而且Blac......
  • 电脑Windows 10/11中如何设置HTTP代理
     嗨,亲爱的网络探索者!是否曾遇到无法访问特定网站或慢如蜗牛的网络速度?别担心!今天我将与你分享一个简单而有效的方法——设置HTTP代理,让你畅享网络的自由与速度。让我们一起来学习,在Windows10/11中如何设置HTTP代理。 第一步:找到网络设置 首先,我们需要前往电脑的网络设置......
  • 学习Java的第11天
    运算符算数运算符:+,-,*,/,%,++,--赋值运算符:=关系运算符:>,<,>=,<=,==,!=instanceof逻辑运算符:&&,||,!位运算符:&,|,^,~,>>,<<,>>>(了解!!!)条件运算符?:扩展赋值运算符:+=,-=,*=,/=packageoperator;publicclassDemo03{publicstaticv......
  • Windows 11 22H2 中文版、英文版 (x64、ARM64) 下载 (updated Jul 2023)
    Windows1122H2中文版、英文版(x64、ARM64)下载(updatedJul2023)Windows11,version22H2,2023年7月更新请访问原文链接:https://sysin.org/blog/windows-11/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org全新推出Windows11全新Windows体验,让您与热......
  • CS5801国产HDMI转DP/edp(4k60)转换器方案芯片 可替代LT6711
    CS5801是HDMI2.0b到DP1.4a转换器方案IC。CS5801有一个HDMI2.0b.输入,带宽高达18Gbps.它支持辨别率是4k@60Hz。对于DP1.4输出,由4条数据通道组成,支持1.62Gbps、2.7Gbps、5.4Gbps链路速率。内置可选SSC功能可降低EMI影响。嵌入式MCU基于32位RISC-V内核,带有内部串行闪存。CS5801参数......
  • ️Centos7下安装Oracle11GR2
    安装Oracle一直以来是比较头疼的事情,于是本文以图文并茂的方式进行安装步骤展示,参考知乎一位博主的安装:https://zhuanlan.zhihu.com/p/111710672,本文还额外提供了安装以及最后的一些数据库自启动配置操作。Oracle软件包地址:https://pan.baidu.com/s/1rQFXCsL44Nl-cXaLWVY9jQ?pwd......
  • Win11:添加用户
    学习自:Win11如何添加用户Win11添加用户账户的方法【详解】-太平洋IT百科提示网上还有别的教程,例如Win11如何创建新用户-百度经验,使用该方法我找不到设备管理器下的本地用户和组,遂作罢。过程1)按住WIN+R,输入netplwiz,进入用户账户页面; 2)添加,不使用Microsoft账户登录3)输入......