• 个人简介

    道法三千六百门,而人人各执一苗根

    //二分版子
    int l=1,r=n,mid,res;
    while(l<=r)
    {
    	mid=(l+r>>1);
    	if(check(mid)) res=mid,r=mid-1;
    	else l=mid+1;
    }
    cout<<res<<"\n";
    

    外网

    欧拉函数|(扩展)欧拉定理|欧拉反演

    欧拉函数及欧拉定理

    查错
    说出错误点并说出如何改证
    不能用以上未出现的代码
    保持原有代码框架
    请提供完整的修正后的代码
    超时
    

    https://www.cnblogs.com/275307894a/p/15950577.html

    int gcd(int a, int b)
    {
        if(a==0) return b;
        if(b==0||a==b) return a;
        if(a%2==0&&b%2==0) return 2*gcd(a>>1,b>>1);
        else if(a%2==0)  return gcd(a>>1,b);
        else if(b%2==0) return gcd(a,b>>1);
        else return gcd(abs(a-b),min(a,b));
    }
    

    线段树详解 (原理,实现与应用)

    「笔记」DP从入土到入门

    DP从入门到出门

    Latex数学公式符号大全


    该用户太懒,这里啥也没写 (´・ω・`)

    __int128

    template<typename T>void read(T &x)
    {
        x=0;
        char ch=getchar();
        while(ch<'0'||ch>'9')ch=getchar();
        while(ch>='0'&&ch<='9')
        {
            x=(x<<3)+(x<<1)+(ch^48);
            ch=getchar();
        }
    }
    void write(int x) // __int128_t 需要快读快写
    {
        if(x>9)write(x/10);
        putchar(x%10+'0');
    }
    
    read(n),read(m);
    
    write(e[i].b);
    putchar(' ');
    write(e[i].a);
    putchar('\n');
    
    
    int jie[N+5],ni[N+5],pow2[N*N+5],c[N+5][N+5];
    void CCF()
    {
        for(int i=0;i<=N;i++) 
    	{
    		c[i][0]=c[i][i]=c[0][i]=1;
    		for(int j=1;j<i;j++) c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod;
    	}
    }
    int quick(int x,int a)
    {
        int ans=1;
        while(a)
        {
            if(a&1) ans=(ans*x)%mod;
            (x*=x)%=mod;
            a>>=1;
        }
        return ans;
    }
    inline int C(int n,int m)
    {
    	if(n<m||n<0||m<0) return 0;
        else if(n<=mod&&m<=mod) return (jie[n]*ni[m]%mod)*ni[n-m]%mod;
        else return C(n%mod,m%mod)*C(n/mod,m/mod)%mod;
    }
    void JN()
    {
    	jie[0]=1;
        for(int i=1;i<=N;i++) jie[i]=jie[i-1]*i%mod;
        ni[N]=quick(jie[N],mod-2);
        for(int i=N-1;i>=0;i--) ni[i]=ni[i+1]*(i+1)%mod;
        pow2[0]=1;
        for(int i=1;i<=N*N;i++) pow2[i]=(pow2[i-1]<<1)%mod;
    
    }
    int Catalan(int n)
    {
    	if(n&1) return 0;
        return C(2*n,n)*quick(1+n,mod-2)%mod;
    }
    void init(int n)
    {
    	ni[1]=1;
    	for(int i=2;i<n;i++) ni[i]=(mod-mod/i)*ni[mod%i]%mod;
    }
    

    https://atrating.baoshuo.dev/rating?username=shenchen_2030

    洛谷

    图论

    exit(0); //退出整个程序
    
    #pragma GCC optimize("O3")
    #pragma GCC optimize("Ofast")
    #pragma GCC target("avx,avx2,fma")
    
    1、3221225477:访问越界,一般是读或写了野指针指向的内存。
    
    2、3221225725:堆栈溢出,一般是无穷递归造成的。
    
    3、3221225620:除0错误,一般发生在整型数据除了0的时候。
    
    4、3221226356:在 Windows 平台上通常是由于程序发生了访问非法内存的错误,也就是所谓的“段错误”(Segmentation Fault)。
    
    
    return value 3:断言失败
    return value 3221225620 :除零错误
    return value 3221225477 :访问越界,是最常见的一种,例如数组 下标越界
    return value 3221225725 :堆栈溢出,一般都是无限递归
    

    如果您认为您的代码时间复杂度正确但是 TLE,可以尝试使用快速读入:

    inline int read()
    {
    	int x=0,f=1;char ch=getchar();
    	while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
    	while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
    	return x*f;
    }
    

    函数返回值为读入的第一个整数。

    int fa[200010],num[200010];
    int find(int x)
    {
    	return fa[x]==x?x:fa[x]=find(fa[x]);
    }
    void unite(int a,int b)
    {
    	int a1=find(a),b1=find(b);
    	if(a1==b1) return ;
    	if(num[a1]<num[b1])
    	{
    		fa[a1]=b1;
    		num[b1]+=num[a1];
    	}
    	else 
    	{
    		fa[b1]=a1;
    		num[a1]+=num[b1];
    	}
    }
    

    for(int i=1;i<=n;i++)
      ls.push_back(a[i]);
    sort(ls.begin(),ls.end());
    ls.erase(unique(ls.begin(),ls.end()),ls.end());
    for(int i=1;i<=n;i++)
      a[i]=lower_bound(ls.begin(),ls.end(),a[i])-ls.begin()+1;
    

    沈宸_2030 的博客

    OI-wiki

    与图相关的题(想提高的入看)

    2025CSP-J心得

    //树 
    struct treenode
    {
    	bool top;//是否为顶点 
    	int count_ans=0;//当前点所包含最大子树的点权和
    	int count_max=0;//当前点所包含最大子树的最大点权
    	vector<int> count;//孩子节点 
    	int data;//点权
    	int num=0;//孩子节点数量 
    	int rudu=0;//入度数量
    	int chudu=0;//出度数量
    	int father;//父节点
    	int deep=0;//深度 
    }
    

    -std=c++14 -Wl,--stack=12345678 -O2
    
    

    QY博客园

    哈希

    unordered_map<int,int> r;
    int num=0;
    int get(int x)
    {
    	if(r.find(x)!=r.end()) return r[x];
    	else 
    	{
    		r[x]=++num;
    		return r[x];
    	}
    }
    


    单点更新和区间查询

    #include <bits/stdc++.h>
    #define int long long 
    using namespace std;
    inline int read()
    {
    	int x=0,f=1;char ch=getchar();
    	while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
    	while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
    	return x*f;
    }
    int n,m;
    vector<int> b;
    inline int lowbit(int x){return x&(-x);}
    void add(int p,int x)
    {
    	while(p<=n)
    	{
    		b[p]+=x;
    		p+=lowbit(p);
    	}
    }
    /*
    void add(int x,int k)
    {
    	for(;x<=n;x+=lowbit(x)) b[x]+=k;
    } 
    */
    int count(int p)
    {
    	int num=0;
    	while(p)
    	{
    		num+=b[p];
    		p-=lowbit(p);
    	}
    	return num;
    }
    int sum(int l,int r){return count(r)-count(l-1);}
    signed main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0); 
        cout.tie(0);
        n=read(),m=read();
        b.resize(n+10);
        for(int i=1;i<=n;i++) add(i,read());//构建树状数组
        for(int i=1;i<=m;i++)
        {
            int a=read(),c=read(),d=read();
            if(a==1) add(c,d);//单点更新
            else cout<<sum(c,d)<<"\n";//区间查询
        }
        return 0;
    }
    

    区间更新 + 单点查询(差分思想)

    #include <bits/stdc++.h>
    #define int long long 
    using namespace std;
    inline int read()
    {
    	int x=0,f=1;char ch=getchar();
    	while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
    	while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
    	return x*f;
    }
    int n,m;
    vector<int> b;
    inline int lowbit(int x){return x&(-x);}
    void add(int p,int x)
    {
    	while(p<=n)
    	{
    		b[p]+=x;
    		p+=lowbit(p);
    	}
    }
    int count(int p)
    {
    	int num=0;
    	while(p)
    	{
    		num+=b[p];
    		p-=lowbit(p);
    	}
    	return num;
    }
    int sum(int l,int r){return count(r)-count(l-1);}
    // 区间 [l, r] 增加 val
    void Add(int l,int r,int a) 
    {
        add(l,a);
        add(r+1,-a);
    }
    //单点查询位置p的值
    int Q(int p){return count(p);}
    signed main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0); 
        cout.tie(0);
        n=read(),m=read();
        int num=0;
        b.resize(n+10);
        for(int i=1;i<=n;i++) 
    	{
    		int cnt=read();
    		add(i,cnt-num);
    		num=cnt;
    	}
        for(int i=1;i<=m;i++)
        {
            int a=read();
            if(a==1) 
    		{
    			int l=read(),r=read(),x=read();
    			Add(l,r,x);//区间修改
    		}
            else 
    		{
    			int I=read();
    			cout<<Q(I)<<"\n";//单点查询
    		}
        }
        return 0;
    }
    

    #include <bits/stdc++.h>
    using namespace std;
    int main()
    {
        long long a[10];
        memset(a,-0x3f,sizeof(a));cout<<a[1]<<"\n";//-4485090715960753727
        memset(a,-2,sizeof(a));cout<<a[1]<<"\n";//-72340172838076674
        memset(a,-1.9,sizeof(a));cout<<a[1]<<"\n";//-1
        memset(a,-1,sizeof(a));cout<<a[1]<<"\n";//-1
        memset(a,0,sizeof(a));cout<<a[1]<<"\n";//0
        memset(a,1,sizeof(a));cout<<a[1]<<"\n";//72340172838076673
        memset(a,2,sizeof(a));cout<<a[1]<<"\n";//144680345676153346
        memset(a,3,sizeof(a));cout<<a[1]<<"\n";//217020518514230019
        memset(a,4,sizeof(a));cout<<a[1]<<"\n";//289360691352306692
        memset(a,5,sizeof(a));cout<<a[1]<<"\n";//361700864190383365
        memset(a,6,sizeof(a));cout<<a[1]<<"\n";//434041037028460038
        memset(a,7,sizeof(a));cout<<a[1]<<"\n";//506381209866536711
        memset(a,8,sizeof(a));cout<<a[1]<<"\n";//578721382704613384
        memset(a,9,sizeof(a));cout<<a[1]<<"\n";//651061555542690057
        memset(a,10,sizeof(a));cout<<a[1]<<"\n";//723401728380766730
        memset(a,100,sizeof(a));cout<<a[1]<<"\n";//7234017283807667300
        return 0;
    }
    
    

    ST表

    #include <bits/stdc++.h>
    #define int long long
    using namespace std;
    class ST 
    {
    private:
        vector<vector<int>> st;  // ST表
        vector<int> log2;        // 预处理的log2值
        int n;
    public:
        ST(const vector<int>& arr) 
    	{
            n = arr.size();
            log2.resize(n+1);
            log2[1]=0;
            for(int i=2;i<=n;i++) log2[i]=log2[i/2]+1;
            int K=log2[n]+1;// 确定k的最大值
            st.resize(n,vector<int>(K));
            for(int i=0;i<n;i++) st[i][0]=arr[i];
            for(int k=1;k<K;k++) for(int i=0;i+(1<<k)<=n;i++) st[i][k]=max(st[i][k-1],st[i+(1<<(k-1))][k-1]);
        }
        //区间最大值
        int Max(int l,int r) 
    	{
            int k=log2[r-l+1];
            return max(st[l][k],st[r-(1<<k)+1][k]);
        }
        //区间最小值
        int Min(int l,int r) 
    	{
            int k=log2[r-l+1];
            return min(st[l][k],st[r-(1<<k)+1][k]);
        }
        //打印ST表(调试用)
        void print() 
    	{
            int K=st[0].size();
            cout<<"ST表内容:"<<endl;
            for(int k=0;k<K;k++) 
    		{
                cout<<"k="<<k<<" (长度="<<(1<<k)<<"): ";
                for(int i=0;i+(1<<k)<=n;i++) cout << st[i][k] << " ";
                cout<<endl;
            }
        }
    };
    signed main() 
    {
    	ios::sync_with_stdio(false);
        cin.tie(0);
        cout.tie(0);
        // 示例使用
        vector<int> arr={5,3,7,2,8,1,4,6};
        ST st(arr);
        st.print();
        cout<<"\n查询结果:"<<endl;
        cout<<"[2,5]的最大值: "<<st.Max(2,5)<<endl;  // 区间[7,2,8,1] -> 8
        cout<<"[0,7]的最大值: "<<st.Max(0,7)<<endl;  // 整个数组 -> 8
        cout<<"[3,6]的最小值: "<<st.Min(3,6)<<endl;  // 区间[2,8,1,4] -> 1
        return 0;
    }
    

    使用方法:将这段代码放置于头文件之前,会极大加快代码运行速度,但有小部分可能代码更慢,有时30pts暴力加了之后可以AC 正式比赛千万不能用

    !!禁忌力量!!

    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cin.tie(false); 
    cout.tie(false);
    //可以加快运行速度
    
    #include <bits/stdc++.h>
    #define int long long
    using namespace std;
    int mod;
    int q(int a,int b)
    {
        if(b==0) return 1;
        else if(b&1) return a*q(a,b-1)%mod;
        else
        {
            int qq=q(a,b/2);
            return qq*qq%mod;
        }
    }
    signed main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cout.tie(0);
        int n,m;
        cin>>n>>m>>mod;
        cout<<n<<"^"<<m<<" mod "<<mod<<"="<<q(n,m);
        return 0;
    }
    

    逆元

    int qwe(long long a,long long b)
    {
    	long long res=1;
    	a=a%mod;
    	while(b)
    	{
    		if(b&1) res=res*a%mod;
    		a=a*a%mod;
    		b/=2;
    	}
    	return res%mod;
    }
    void init() 
    {
    	fac[0]=1;
    	for(int i=1;i<N;++i) fac[i]=fac[i-1]*i%mod;
    	invfac[N-1]=qwe(fac[N-1],mod-2);
    	for(int i=N-2;i>=0;--i) invfac[i]=invfac[i+1]*(i+1)%mod;
    }
    int C(int n,int k)  
    {
    	if(k<0||k>n) return 0;
    	return fac[n]*invfac[k]%mod*invfac[n-k]%mod;
    }
    

    AC=Accepted 通过 Answer Cubi 粗鄙的答案

    WA=Wrong Answer 答案错误 Wonderful Answer 优美的答案

    TLE=Time Limit Exceed 超出时间限制 Time Limit Enough 时间充裕

    OLE=Output Limit Exceed 超出输出限制 Output Limit Enough 输出足够

    MLE=Memory Limit Exceed 超出内存限制 Memory Limit Enough 内存充裕

    RE=Runtime Error 程序运行时错误 Runtime Excellent 运行时(过于)优秀

    PE=Presentation Error 格式错误 Pretty Excellent 十分优秀

    CE=Compile Error 编译错误 Compile Easily 轻松通过编译

    UKE=Unknown Error 未知错误 Unbelievable Keeping Excellent 难以置信的保持优秀

    出现AC时你需要将你的答案变得更优美才能通过;

    而TLE、OLE、MLE、ER经常同时出现,可以给予你少量的额外分数;

    PE、CE都能给予你大量的额外分数;

    UKE这个标签非常稀有,可以让你直接通过这次比赛并名列前茅。

    评测状态

    Waiting 评测:评测请求正在等待被评测机抓取

    Fetched 评测:评测请求已被评测机抓取,正在准备开始评测

    Compiling 评测:正在编译中

    Judging 评测:编译成功,正在评测中

    Accepted 通过:程序输出完全正确

    Wrong Answer 不通过:程序输出与标准答案不一致(不包括行末空格以及文件末空行)

    Time Limit Exceeded 不通过:程序运行时间超过了题目限制

    Memory Limit Exceeded 不通过:程序运行内存空间超过了题目限制

    Runtime Error 不通过:程序运行时错误(如数组越界、被零除、运算溢出、栈溢出、无效指针等)

    Compile Error 不通过:编译失败

    System Error 错误:系统错误(如果您遇到此问题,请及时在讨论区进行反馈)

    Canceled 其他:评测被取消

    Unknown Error 其他:未知错误

    Ignored 其他:被忽略

    有“成绩取消”字样则说明管理员手动标记此记录为取消,可能违反了服务条款,比如代码被发现与其他用户的代码十分相似。

    比赛

    按照赛制不同,有不同的递交、排名规则。

    OI 赛制所有题目均以最后一次递交为准,特别地,请避免编译错误。

    OI 赛制排名规则为:总分高的排在前面,总分相等则排名相同。

    ACM/ICPC 赛制所有题目递交后立即评测,以是否通过为准。

    ACM/ICPC 赛制排名规则为:通过题目数多的排在前面,通过题目数相同的做题耗时(含罚时)少的排在前。

    乐多 赛制下,选手可以多次提交一道题目,并获得实时评测结果。

    乐多 赛制下,多次提交会导致选手的得分被扣除,排行榜将显示用户的最高得分。

    乐多 赛制下,每道题的最终得分为: s * max(0.95^n^,0.7)。 s,n 分别代表本次得分和本次提交前的尝试次数

    乐多 排名规则为:按照如上规则折算后的分数从高到低排名。

    IOI(严格) 赛制下,不同于IOI赛制,排行榜将被关闭至比赛结束。

    IOI(严格) 赛制下,每道题的排行榜得分将为用户每个子任务在所有提交中的最大得分的和。

    #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    const int N=1e2+5;
    int n,m,p,k,g[210][41],dp[210][41];
    string s,a[10];
    int sum(int l,int r){
    	int t=0;
    	for(int i=l;i<=r;i++){
    		for(int j=1;j<=m;j++){
    			if(g[i][j]&&r-i+1>=a[j].size()){
    				t++;
    				break;
    			}
    		}
    	}
    	return t;
    }
    int main(){
    	cin>>p>>k;
    	for(int i=1;i<=p;i++){
    		string zzz;
    		cin>>zzz;
    		s+=zzz;
    	}
    	n=s.size();
    	s=' '+s; 
    	cin>>m;
    	for(int i=1;i<=m;i++)cin>>a[i];
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=m;j++){
    			if(n-i+1<a[j].size()){
    				g[i][j]=0;
    			}else{
    				for(int t=0;t<a[j].size();t++){
    					if(s[i+t]!=a[j][t]){
    						g[i][j]=0;
    						break;
    					}else{
    						g[i][j]=1;
    					}
    				}	
    			}
    		}
    	}
    	memset(dp,0xef,sizeof(dp));
    	dp[0][0]=0;
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=min(k,i);j++){
    			for(int l=1;l<=i;l++){
    				dp[i][j]=max(dp[i][j],dp[l-1][j-1]+sum(l,i));
    			}
    		}
    	}
    	cout<<dp[n][k];
    }
    

    edge://surf/ https://www.cnblogs.com/FPGAmaster/p/20185601

    #include <bits/extc++.h>

    using namespace __gnu_pbds;

    tree<long long,null_type,less<long long>,rb_tree_tag,tree_order_statistics_node_update> tre;

  • 最近活动