zoukankan      html  css  js  c++  java
  • Codeforces Global Round 7

    题目链接:https://codeforces.com/contest/1326
    A 输出5…3即可,一定不会整除5和3

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N=100010,inf=0x3f3f3f3f;
    #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int main()
    {
    	int t,n;
    	cin>>t;
    	while(t--)
    	{
    		cin>>n;
    		if(n==1) cout<<"-1"<<endl;
    		else 
    		{
    			cout<<5;
    			for(int i=1;i<n;i++)
    				cout<<3;
    			puts("");
    		}
    	}
    	return 0;
    }
    

    B 令a1=b1依次向后推即可

    #include<bits/stdc++.h>
     
    using namespace std;
    typedef long long ll;
    const int N=200010;
    const ll inf=0x3f3f3f3f3f3f3f3f;
    #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    ll a[N],b[N];
     
    int main()
    {
    	int t,n;
    	ll mn=-inf;
    	cin>>n;
    	for(int i=1;i<=n;i++) cin>>a[i],b[i]=b[i-1]+a[i];
    	cout<<a[1]<<' ';
    	mn=a[1];
    	for(int i=2;i<=n;i++) 
    	{
    		cout<<a[i]+mn<<' ';
    		if(a[i]>0) mn=a[i]+mn;
    	}
    	return 0;
    }
    

    C 长度为n的数组被划分为k个区间,使k个区间的最大值的和最大,问最大的和和这样划分的方案数。
    最大的和一定是最大的k个数的和,找到这k个数所在的位置再求方案数,假定这k个数的位置是 l1,l2…lk。
    k个区间共需要k-1个隔板,下面看各个隔板的位置,第一个区间要包含l1不超过l2,第一个隔板有(l2-l1)种放法,那么类比第二个有(l3-l2)种放法…
    所以答案就出来了,和并不用取模…

    #include<bits/stdc++.h>
     
    using namespace std;
    typedef long long ll;
    const int N=200010,mod=998244353;
    #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int n,k,a[N];
    pair<int,int> b[N];
    int main()
    {
    	cin>>n>>k;
    	for(int i=1;i<=n;i++) cin>>a[i],b[i]={a[i],i};
    	sort(b+1,b+n+1);
    	vector<int> st;
    	ll sum=0,cnt=1;
    	for(int i=n;n-i<k;i--) st.push_back(b[i].second),sum+=b[i].first;
    	sort(st.begin(),st.end());
    	for(int i=1;i<st.size();i++) cnt=cnt*(st[i]-st[i-1])%mod;
    	cout<<sum<<' '<<cnt%mod;
    	return 0;
    }
    

    D 已知字符串s,将s的前缀和后缀拼接,输出所得的字符串是回文串的且长度最大的串
    首先找s的最大首尾逆序的长度,那么除了这两部分剩下的串中分别找首尾最长的回文串,选择两个中长度大的哪一个再与首位逆序的两部分拼接就可以,D2的数据范围比较大就需要快速的判断回文串 哈希就可以了(选择合适的质数,被卡了好几个…)

    #include<bits/stdc++.h>
     
    using namespace std;
    typedef long long ll;
    const int N=2000010,mod=1e9+7;
    typedef unsigned long long ull;  
    const ll p=233;
    #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int n,t,k;
    string s;
     
    ll po[N];
    void init()
    {
    	po[0]=1;
    	for(int i=1;i<N;i++)
    		po[i]=po[i-1]*p%mod;
    	return ;
    }
    int main()
    {
    	init();
    	cin>>t;
    	while(t--)
    	{
    		cin>>s;
    		int l=-1,len1,len2;
    		for(int i=0;i<s.size();i++)
    			if(s[i]!=s[s.size()-1-i])
    			{
    				l=i-1;
    				break;
    			}
    		len1=l;
    		ll res1=0,res2=0;
    		for(int i=l+1;i<s.size()-l-1;i++)
    		{
    			res1=(res1+po[i-l-1]*(s[i]-'a')%mod)%mod;
    			res2=(res2*p+s[i]-'a')%mod;
    			if(res1==res2) len1=i;
    		}
    		len2=s.size()-l-1;
    		res1=res2=0;
    		for(int i=s.size()-l-2;i>l;i--)
    		{
    			res1=(res1+po[s.size()-l-1-i-1]*(s[i]-'a')%mod)%mod;
    			res2=(res2*p+s[i]-'a')%mod;
    			if(res1==res2) len2=i;
    		}
    		for(int i=0;i<=l;i++) cout<<s[i];
    		if(len1-l>=s.size()-l-1-len2) for(int i=l+1;i<=len1;i++) cout<<s[i];
    		else for(int i=len2;i<s.size()-l-1;i++) cout<<s[i];
    		for(int i=s.size()-l-1;i<s.size();i++) cout<<s[i];
    		puts("");
    	}
    	
    	return 0;
    }
    
  • 相关阅读:
    jmeter中设置线程数与设置集合点的区别
    在linux系统中如何通过shell脚本批量设置redis键值对
    服务器带宽上行与下行的区别
    性能测试之Jmeter插件安装
    sqlserver 启用邮箱服务
    sqlserver 自定义字符串分割函数.
    C# 重写思想
    CSS控制鼠标滑过时的效果
    js实现图片自动切换效果。
    SQL Server Management Studio 使用作业实现数据库备份
  • 原文地址:https://www.cnblogs.com/neflibata/p/12871778.html
Copyright © 2011-2022 走看看