• Comet OJ


    传送门

    (A)

    咕咕咕

    const int N=1005;
    char s[N][N];int len[N],n,id;
    inline bool cmp(R int j,R int k){
    	R int l=min(len[j],len[k]);
    	fp(i,1,l)if(s[j][i]!=s[k][i])return s[j][i]<s[k][i];
    	return len[j]<len[k];
    }
    int main(){
    	scanf("%d",&n),id=1;
    	fp(i,1,n)scanf("%s",s[i]+1),len[i]=strlen(s[i]+1);
    	fp(i,1,n)if(cmp(i,id))id=i;
    	printf("%s
    ",s[id]+1);
    	return 0;
    }
    

    (B)

    咕咕

    const int N=1e5+5;
    typedef long long ll;
    int a[N],n;ll sum,sp,res;
    int main(){
    	scanf("%d",&n);
    	fp(i,1,n)scanf("%d",&a[i]),sum+=a[i],sp+=1ll*a[i]*a[i];
    	fp(i,1,n)printf("%lld ",sp+1ll*n*a[i]*a[i]-(sum*a[i]<<1));
    	return 0;
    }
    

    (C)

    首先把所有的(p_i=b_{i} imes a_{i+1})给取出来,并令(sum=sum p_i),那么如果对于一个区间([l,r])执行操作,答案就是(sum+(k-1)p_{l}+(k-1)p_{r+1}+(k^2-1)(sum_{i=l+1}^{r}p_i))

    那么我们枚举(r),并把后面那个东西拆成前缀和相减的形式,记录下使值最小的(l)对应的值即可

    typedef long long ll;
    const int N=1e5+5;
    int a[N],b[N],p[N],n,k;ll sum[N],res,mn,pmn;
    int main(){
    	scanf("%d%d",&n,&k);
    	fp(i,1,n)scanf("%d%d",&a[i],&b[i]);
    	fp(i,1,n+1)p[i]=b[i-1]*a[i];
    	fp(i,1,n+1){
    		sum[i]=sum[i-1]+p[i]*(k*k-1);
    		cmin(mn,pmn+sum[i-1]+p[i]*(k-1));
    		cmin(pmn,-sum[i]+p[i]*(k-1));
    	}
    	fp(i,1,n+1)mn+=p[i];
    	printf("%lld
    ",mn);
    	return 0;
    }
    

    (D)

    我是白痴……

    对于每一个(i),记录一个(mn_i)表示左边最大能选多少和(mx_i)表示右边最多能选多少,那么如果一个询问([l,r])满足(lin [mn_i,i])(rin [i,mx_i]),那么(a_i)就会对这个询问有贡献

    这就是个二维偏序问题了,离线之后可以变成一维,用树状数组维护即可

    //quming
    #include<bits/stdc++.h>
    #define R register
    #define pb push_back
    #define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
    #define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
    #define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
    template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
    template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
    using namespace std;
    char buf[1<<21],*p1=buf,*p2=buf;
    inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
    int read(){
        R int res,f=1;R char ch;
        while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
        for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
        return res*f;
    }
    typedef long long ll;
    const int N=1e6+5;
    struct node{
    	int u,v,w;
    	inline node(R int uu,R int vv,R int ww):u(uu),v(vv),w(ww){}
    };
    vector<node>p[N];int c[N],a[N],id[N],l[N],r[N],op[N],tid[N],ans[N],mn[N],mx[N];
    int n,m,q,top,sum;ll res;
    inline void add(R int x,R int y){for(;x<=n;x+=x&-x)c[x]+=y;}
    inline int query(R int x){R int res=0;for(;x;x-=x&-x)res+=c[x];return res;}
    inline bool cmp(const int &x,const int &y){return r[x]<r[y];}
    int main(){
    //	freopen("testdata.in","r",stdin);
    	n=read(),m=read(),q=read();
    	fp(i,1,n)a[i]=read(),mn[i]=1,mx[i]=n;
    	for(R int i=1,u,v;i<=m;++i){
    		u=read(),v=read();
    		u<v?cmin(mx[u],v-1):cmax(mn[u],v+1);
    	}
    	fp(i,1,n)p[i].pb(node(mn[i],i,a[i])),p[mx[i]+1].pb(node(mn[i],i,-a[i]));
    	fp(i,1,q)id[i]=i,l[i]=read(),r[i]=read();
    	sort(id+1,id+1+q,cmp);
    	for(R int i=1,j=1;i<=q;++i){
    		while(j<=n&&j<=r[id[i]]){
    			for(auto x:p[j])add(x.u,x.w),add(x.v+1,-x.w);
    			++j;
    		}
    		ans[id[i]]=query(l[id[i]]);
    	}
    	fp(i,1,q)res^=1ll*i*ans[i];
    	printf("%lld
    ",res);
    	return 0;
    }
    

    (E)

    不难发现,设(x)中质因子(p_i)的次数是(c_i),则(f(x))中质因子(p_i)的次数是(leftlfloor{c_iover 2} ight floor)(即每一个质因子的次数都是向下取整)

    那么我们枚举(f(x)),答案就是(sum_{i=1}^{sqrt{n}} i imes g(n/{i^2})),其中(g(n))表示(1)(n)中最多只有一个质因子的数的个数,也就是(sum_{i=1}^n mu^2(i))

    计算(g(n))的时候,我们可以用(mu)来容斥,所以(g(n)=sum_{i=1}^{sqrt(n)}mu(i){nover {i^2}})

    这两个东西都可以用整除分块优化,而且({nover {i^2}})的不同个数是(O(n^{1over 3}))个,所以复杂度是有保证的

    //quming
    #include<bits/stdc++.h>
    #define R register
    #define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
    #define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
    #define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
    #define gg(u) for(int &i=cur[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
    template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
    template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
    using namespace std;
    typedef long long ll;
    const int N=1e7+5;
    bitset<N>vis;int p[N],mu[N],sm[N],m;
    void init(int n=1e7){
    	mu[1]=1;
    	fp(i,2,n){
    		if(!vis[i])p[++m]=i,mu[i]=-1;
    		for(R int j=1;j<=m&&1ll*i*p[j]<=n;++j){
    			vis[i*p[j]]=1;
    			if(i%p[j]==0)break;
    			mu[i*p[j]]=-mu[i];
    		}
    	}
    	fp(i,1,n)sm[i]=sm[i-1]+(mu[i]<0?-mu[i]:mu[i]);
    	fp(i,1,n)mu[i]+=mu[i-1];
    }
    ll res=0,bin[25],n,t;int T;
    inline ll calc(R ll n){
    	if(n<=1e7)return sm[n];
    	R ll t=sqrt(n),res=0;
    	for(R ll l=1,r;l<=t;l=r+1)
    		r=sqrt(n/(n/(l*l))),res+=n/(l*l)*(mu[r]-mu[l-1]);
    	return res;
    }
    int main(){
    //	freopen("testdata.in","r",stdin);
    	init();
    	for(scanf("%d",&T);T;--T){
    		scanf("%lld",&n),res=0;
    		t=sqrt(n);
    		for(R ll l=1,r;l<=t;l=r+1)
    			r=sqrt(n/(n/(l*l))),res+=calc(n/(l*l))*(r-l+1)*(l+r)>>1;
    		printf("%lld
    ",res);
    	}
    	return 0;
    }
    

    (F)题咕了

  • 相关阅读:
    TCP传输粘包问题
    提取KIndle中每本书的笔记并单独保存
    # 可视化工具资源汇总
    抓取代理IP
    Linux 小工具学习之(1)——Wget十例[翻译]
    [转]关于矩阵的本质
    用2263份证件照图片样本测试how-old.net的人脸识别
    Python生成二维码脚本
    基于git的源代码管理模型——git flow
    使用Graphviz绘图(一)
  • 原文地址:https://www.cnblogs.com/yuanquming/p/11335803.html
Copyright © 2020-2023  润新知