2022 CCPC江苏省赛

A PENTA KILL!

题意:给定一个击杀序列 判断是否有一个人连续击杀五个不同的人

分析:

开始很容易走到一个误区 出现连续相同的就舍去从零开始计数

但是比如 A C B C A D 遇到两个C 舍去从零开始 但是实际上 可以是后面四个组成

数据允许n方 所以枚举每个五杀开头 判断能否成立即可

#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) x&(-x)
#define ll long long
const int maxn=2e3+5; 
int n,cnt,pd;
string s[maxn],t[maxn];
map<string,int>mp;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>s[i]>>t[i];
	for(int i=1;i<=n;i++){
		if(pd)break;
		set<string>Q;
		Q.insert(t[i]);
		for(int j=i+1;j<=n;j++){
			if(s[i]!=s[j])continue;
			if(Q.find(t[j])!=Q.end())
				break;
			else Q.insert(t[j]);
			if(Q.size()==5)pd=1;
		}
	}
	if(pd)cout<<"PENTA KILL!"<<endl;
	else cout<<"SAD:("<<endl;
     return 0;
}

C. Jump and Treasure

题意:

分析:

很容易写出方程 dp[i]=max(dp[j])+q[i] 暴力转移肯定会超时

求这种连续滑动的最大最小值可以用单调队列优化

#include <bits/stdc++.h>
#define endl '\n'
#define IOS ios::sync_with_stdio(false);
using namespace std;

typedef long long ll;
const ll INF = 0x3f3f3f3f;
const ll MAXN = 1e6 + 10;
ll n, q, p;
struct Node
{
    ll val, pos;
} a[MAXN];
ll dp[MAXN];
int main()
{
    cin >> n >> q >> p;
    for (int i = 1; i <= n; ++i)
    {
        cin >> a[i].val;
        a[i].pos = i;
    }
    while (q--)
    {
        ll x;
        cin >> x;

        if (x > p)
        {
            cout << "Noob" << endl;
            continue;
        }

        dp[0] = 0;
        vector<ll> v;
        v.push_back(0); 
        for (int i = x; i <= n; i += x)
        {
            v.push_back(i);
        }
        v.push_back(n + 1); 

        deque<ll> dq;
        dq.push_back(0);  

        for (int i = 1; i < v.size(); ++i)
        {
            while (dq.size() && v[i] - dq.front() > p)
                dq.pop_front();
            dp[v[i]] = dp[dq.front()] + a[v[i]].val;
            while (dq.size() && dp[dq.back()] < dp[v[i]])
                dq.pop_back();
            dq.push_back(v[i]);        
        }
        cout << dp[n+1]<< endl;
    }
	return 0;
}


I. Cutting Suffix

题意:

签到题没啥说的

#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) x&(-x)
#define ll long long
string s;
int main(){
	cin>>s;
	int len=s.size();
	int pd=1;
	for(int i=1;i<s.size();i++)
		if(s[i]!=s[0]){
			pd=0;break;
	}
	if(pd)cout<<len-1<<endl;
	else cout<<0<<endl;
     return 0;
}

J. Balanced Tree

题意:

分析:

#define ll unsigned long long int

ll dfs(ll x, ll a, ll b, ll c)
{
	if (x == 0) return 0;
	if (x == 1) return c;
	if (x & 1) return dfs(x >> 1, a * 2 + b, b, c + b);
	else return dfs(x >> 1, a, a + b * 2, c + a);
}
 
int main()
{
	IOS;
	int T; cin >> T;
	while (T--)
	{
		ll ans = 1;
		ll n; cin >> n;													
		ll c = dfs(n, 1, 0, 0);
		if (c >= 64) ans = 0;
		else ans <<= c;
		cout << ans << endl;
	}
 
 
	return 0;
}

K. aaaaaaaaaaA heH heH nuN

题意:

分析:
好气啊 明明思路和题解一模一样 但是我写出来就是re

#include<bits/stdc++.h>
 
using namespace std;
int cnt[42];
typedef long long ll;
ll pow2[40];
void init()
{
    pow2[0]=1;
    for(int i=1;i<=31;i++)
        pow2[i]=pow2[i-1]*2;
        return;
}
int main(){
  
  init();
  int t;
  cin>>t;
 
  while(t--){
      int n,ans=0;
      cin>>n;
      for(int i=31;i>0;i--)
          cnt[i]=0;
      for(int i=31;i>0;i--)
      {
          if(n>=pow2[i])
          {
              cnt[i]++;
              n-=(pow2[i]);
              cnt[1]++;
          }
      }
      if(n%2)
          cnt[1]++;
      cout<<"nunhehhe";
      for(int i=31;i>0;i--)
      {
          for(int j=0;j<cnt[i];j++)
              cout<<"h";
          cout<<"a";
      }
      cout<<"\n";
  }
 
 
  
}
posted @ 2022-10-09 15:27  wzx_believer  阅读(113)  评论(0编辑  收藏  举报