首页 > 其他分享 >10.6 QWJ专场

10.6 QWJ专场

时间:2022-10-09 07:55:23浏览次数:43  
标签:node 专场 QWJ power 10.6 int age dep include

T1 炼心

题面

算法之路中有 \(n\) 名同学,第 \(i\) 个同学有 \(a\) , 表示该名同学的程序设计能力 , \(b\) 表示该名同学的学历,它的名字是 \(s\) 为字符串。

天榜学历不超过 13 ,地榜学历不小于 14,满足学历要求的同学会分别在两个榜单中排名。

你需要分别输出,天榜地榜当中,程序设计能力最强的同学中,学历最小的名字,存在多个则输出字典序最小的那一个,如果榜上无人,输出 −1。

分析

排序
结构体存几个变量,\(string\) 存不了用个 \(id\) 打标记,用自带的字符串排序就行

点击查看代码
#include<cstring>
#include<cstdio>
#include<iostream>
#include<algorithm>
#define maxn 100010
#define int long long
using namespace std;
int a,b;
string name[maxn];
int power,n,age,tott,totd,d,N;
struct node{string s;int power,age,id;};
node ti[maxn],di[maxn];
bool cmp(node a,node b)
{
	if(a.power==b.power)
	{
		if(a.age==b.age)
		{
			return name[a.id]<name[b.id];
		}
		else return a.age<b.age;
	}
	else return a.power>b.power;
}
signed main()
{
	freopen("reheart.in","r",stdin);
	freopen("reheart.out","w",stdout);
	cin>>N;
	for(int i=1;i<=N;i++)
	{

		cin>>name[i]>>power>>age;

		if(age>=14)
		{
			di[++totd].id=i;
			di[totd].power=power;
			di[totd].age=age;
		}
		if(age<=13)
		{
			ti[++tott].id=i;
			ti[tott].power=power;
			ti[tott].age=age;
		}
	}
	sort(ti+1,ti+tott+1,cmp);

	sort(di+1,di+totd+1,cmp);

	if(!tott) cout<<-1<<'\n';
	else cout<<name[ti[1].id]<<'\n';
	if(!totd) cout<<-1<<'\n';
	cout<<name[di[1].id]<<'\n';
	return 0;
}
/*
5
cafeiin 18 11 
George_Plover 20 12 
Karshilov 19 12 
wzk 23 14 
Lenska 18 12
*/

T2 炼气

题面

有一长度为 \(n\) 的字符串 \(S\) ,这个字符串由小写字母组成 。

师傅说,这本书有千万种变化,如果对于一个区间 \([l,r] (1⩽l⩽r⩽n)\) ,如果字符串
\(A=S_lS_{l+1}...S_{r-1}S_r\) 满足,有不超过 1 种字符出现了奇数次,则这个区间是一个“法门”。

\(Cafeiin\) 想知道这本书总共有多少个“法门。

分析

状压,前缀
容易想到用前缀统计 \(26\) 个字母在每一位出现的次数,然后用 \(26n^2\) 进行枚举

事实上每一个状态可以用一个 \(26\) 位 \(2\) 进制表示 (1为奇,0为偶),以\(O(n)\) 递推
考虑每次枚举之前出现的次数,用一个前缀表示出现次数
考虑查询,因为是一个奇数,就考虑枚举这个奇数 (1)
对当前状态 \(A\) 每一位都 \(xor\) 1,得到之前状态 \(B\) ,就说明 \(A-B\) 之间是满足条件的
特殊情况,如果之前出现状态一模一样的,也要统计答案

点击查看代码
#include<iostream>
#include<cstdio>
#define int long long
#define maxn 1000010
using namespace std;
int n,ans,vis[(1<<27)],wow;
char s[maxn];
signed main()
{
	freopen("rebreth.in","r",stdin);
	freopen("rebreth.out","w",stdout);
	scanf("%lld",&n);
	scanf("%s",s+1);
	for(int i=1;i<=n;i++)
	{
		vis[wow]++;
		int tmp=s[i]-'a';
		wow^=(1<<tmp);
//		cout<<wow<<" "<<endl;;
//		if(!wow) ans++;
		ans+=vis[wow];
		for(int j=0;j<26;j++)
		{
			ans+=vis[wow^(1<<j)];
			
		}
//		cout<<endl;
	}
	printf("%lld\n",ans);
	return 0;
}
/*
4 
abab
a
1 0 
ab
1 1
aba
0 1
abab
0 0
*/

T3 炼体

题面

人体的经脉可以简化成一个有 \(n\) 个穴位的图,他们之间通过 \(n-1\) 条经络互相连通.每条经络长度
为 \(1\)
根据修行的炼体之术,一旦有一个穴位被打通,那么与它距离不超过 \(k\) 的穴位会被"活化"(包括自己)
\(Cafeiin\)想知道,最少需要打通自己多少个穴位,才能"活化"自己全身所有的穴位

分析

贪心,树形结构
容易想到从根节点开始打通,如果在该节点下未打通的距离为 \(k\) 则该节点必须打通
并且覆盖周围 \(k\) 个节点
具体看码

点击查看代码
#include<bits/stdc++.h>
#define N 200010
using namespace std;

int n,k,t,st,son,Ans;

int head[N],nex[N],ver[N],tot;
void add(int u,int v) {ver[++tot]=v; nex[tot]=head[u]; head[u]=tot; }

struct node {int id,dep;}re[N];
int fat[N],dis[N],bui[N];
bool cmp(node a,node b){return a.dep>b.dep;}

void DFS(int x,int fa,int dep)
{
	re[x].dep=dep;//记录深度 
	fat[x]=fa;//记录父亲节点 
	for(int i=head[x];i;i=nex[i])
	{
		int v=ver[i];
		if(v==fa) continue;
		DFS(v,x,dep+1);
	}
}

signed main()
{
//	freopen("rebody.in","r",stdin);
//	freopen("rebody.out","w",stdout);
	
	scanf("%d%d%d",&n,&k);
	for(int i=1,u,v;i<n;i++) 
	{
		scanf("%d%d",&u,&v);
		add(u,v); add(v,u);
	}
	DFS(1,1,0);
	for(int i=1;i<=n;i++) re[i].id=i;
	memset(dis,0x3f,sizeof (dis));//没有穴位时,所有距离为极大值 
	sort(re+1,re+n+1,cmp);//根据策略, 按照深度排序 
	// 由于树形结构 ,每个点的相互距离是唯一的,且必然经过公共祖先,因此只需要覆盖 穴位 的 k 个父亲
	// 在剩余点进行统计即可 
	for(int i=1;i<=n;i++)
	{
		st=son=re[i].id;
		for(int j=1;j<=k;j++) 
		{
			st=fat[st];
			dis[son]=min(dis[son],dis[st]+j);//跳 k 个父亲,并维护 son 到最近穴位的距离 
		}
		if(dis[son]>k) //距离超过 k 
		{
			Ans++;
			dis[st]=0;// 打通该点 
//			dis[son]=k;
			for(int j=1;j<=k;j++)// 覆盖这条链 
			{
				st=fat[st];
				dis[st]=min(dis[st],j);
			}
		}
	}
/*	for(int i=1;i<=n;i++) cout<<i%10<<" ";
	cout<<endl;
	for(int i=1;i<=n;i++) cout<<bui[i]<<" ";*/
	printf("%d\n",Ans);
	return 0;
}
/*

26 2 1
1 2
2 3
3 4
3 5
2 6
6 7
7 8
8 9
9 10
10 11
1 12
12 13
13 14
13 15
14 16
14 17
12 18
18 19
19 20
20 21
21 22
19 23
23 24
19 25
25 26

4 1 3
1 2
1 3 
1 4

6 1 3
1 2 
2 3
3 4
4 5 
5 6
*/

标签:node,专场,QWJ,power,10.6,int,age,dep,include
From: https://www.cnblogs.com/llwwll/p/16770869.html

相关文章

  • 10.6题目大赏
    2022-10-6T1炼心题目背景\(Cafeiin\)神情认真,专心的听着老师讲话。“既然你已拜入算法门下,我便为你讲讲这算法的修炼之道,算法之道,分几重境界,初入编程,便是普及,普及之上......
  • 10.6
    inti=0;for(i=1;i<=33;i++){if(i==4){ break;}}printf("%d\n",i);......
  • 10.6闲话
    国庆的时候鸽了几天,今天又开始写闲话了。收到了最近机房里的猪国杀浪潮,今天下午我把我的猪国杀重构了一下,然后又调了一天。(悲)这是成果(放图)读61-65行。奈芙莲树据说还......
  • 10.6 闲话
    不知道写点什么,练习册也写不完了,就随便写写吧。今晚家长问我报不报中科大,想了想还是没报,毕竟相较于其他人我是没什么实力的,报了也就相当于体验高考而已,虽然有点想去体验一......
  • 10.6 模拟赛总结
    10.6模拟赛总结T1光大意:给定四个方块的需要的亮度值,有光的散射,每个方块对于另外三个有影响,问四个亮度值之和最小为多少。$n\le1500$思路:一眼看出是二分答案的判定性......
  • 闲话 22.10.6
    闲话所以为什么模拟赛都喜欢考后缀题啊前有一个SA后有一个广义SAM上树剖什么玩意我只会非字符串的科技(字符串能不能滚粗OIa大渣好,我四渣渣辉,点一下,玩一年,装备不花......
  • 2022.10.6
    考试,成绩一般。因为意外少了一小时时间,估计题目难度的时候出现错误,一直想巨大困难的T4(论文题)导致简单的T3没拿分,只有7、8名的样子。下午叶老心血来潮讲了笛卡尔树,运用到T3......
  • 10.6
    intn,m; doublei,j;n=2.0*5;m=5.0/6;i=56-23.1;j=99.3+55.2;printf("%d%d%f%f",n,m,i,j);intn,m; scanf_s("%d",&n); scanf_s("%d",&......
  • 10.6 noi(p) 模拟赛
    \(\rmNOIP\)模拟赛\(\rmDate:10.6\)去掉T1可以当省选练习题了(当然T4放T1)\(T1\)哈希即可,也有贪心的做法,但是自然溢出被卡了\(T2\)如果是一条链,那么这个操作......
  • 2022.10.6java分支结构
    HelloWorld打开idea,新建java文件,新建javaclass编写代码psvm自动生成publicstaticvoidmain(Stringsargs{}sout自动生成System.out.printlnpublicclass......