首页 > 其他分享 >2023 ICPC 网络赛(1)

2023 ICPC 网络赛(1)

时间:2023-09-21 10:33:58浏览次数:50  
标签:aa int ll 网络 ICPC yy fx xx 2023

https://pintia.cn/problem-sets/1703372159713652736/exam/problems/type/7

I Pa?sWorD

分析:

每个字符必须得至少出现一次 立马想到容斥

转移就顺序转移就好 不过有空间限制 因为当前位置的所有状态都由上一个位置转移 所以我们用个滚动数组就好

含有字符串的写起来就是有点麻烦

#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) x&(-x)
#define ll long long
void solve();
const int maxn=1e5+5;
const ll mod=998244353;
int n;
ll dp[2][65];
ll dpsum[2];
ll ans=0;
string s;
int ver(char x){
	if('a'<=x&&x<='z')return x-'a'+1;
	if('A'<=x&&x<='Z')return x-'A'+27;
	if('0'<=x&&x<='9')return x-'0'+53;
	return 0;
}
int pd(char x,int num){
	if(x=='?')return 1;
	if('A'<=x&&x<='Z'){
		if(num==ver(x))
		return 1;
	}
	if('0'<=x&&x<='9'){
		if(num==ver(x))
		return 1;
	}
	if('a'<=x&&x<='z'){
		if(num==ver(x))
		return 1;
		char tp=x-'a'+'A';
		if(num==ver(tp))
		return 1;
	}
	return 0;
}
int main(){
	int T;T=1;
	while(T--)solve();
     return 0;
}
vector<int>q;
void solve(){
	cin>>n>>s;
	for(int K=1;K<1<<3;K++){
		q.clear();
		if(K&1==1)for(int i=1;i<=26;i++)q.push_back(i);
	    if((K>>1)&1)for(int i=27;i<=52;i++)q.push_back(i);
		if((K>>2)&1)for(int i=53;i<=62;i++)q.push_back(i);
		
		int m=q.size();
		for(int i=0;i<65;i++)dp[0][i]=0;
		dpsum[0] = dpsum[1]=0;
		
		if(s[0]=='?')for(int i=0;i<m;i++)dp[0][q[i]]=1;
		else if('A'<=s[0]&&s[0]<='Z'){
			int sig = ver(s[0]);
			for(int i=0;i<m;i++)
			if(q[i]==sig){
				dp[0][sig]=1;
				break;
			}
		}else if('0'<=s[0]&&s[0]<='9'){
			int sig = ver(s[0]);
			for(int i=0;i<m;i++)
			if(q[i]==sig){
				dp[0][sig]=1;
				break;
			}
		}
		else {
			int sig = ver(s[0]);
			for(int i=0;i<m;i++)
			if(q[i]==sig){
				dp[0][sig]=1;
				break;
			}
			char tp=s[0]-'a'+'A';
			sig=ver(tp);
			for(int i=0;i<m;i++)
			if(q[i]==sig){
				dp[0][sig]=1;
				break;
			}
		}
		for(int i=1;i<=65;i++)
			dpsum[0]+=dp[0][i];
		
		int id,pre;
		for(int i=2;i<=n;i++){
			if(i&1)id=0,pre=1;
			else id=1,pre=0;
			dpsum[id]=0;
			
			for(int j=0;j<m;j++){
				if(pd(s[i-1],q[j])){
				dp[id][q[j]]=(dpsum[pre]-dp[pre][q[j]]+mod)%mod;
				dpsum[id]=(dpsum[id]+dp[id][q[j]])%mod;
				}
				else {
						dp[id][q[j]]=0;
				}
			}
			
		}
	//	cout<<"K="<<K<<" sum="<<dpsum[id]<<endl;
		int res=__builtin_popcount(K);
		if(res&1)ans=(ans+dpsum[id])%mod;
		else ans=(ans-dpsum[id]+mod)%mod;
	}
	cout<<ans<<endl;
}


G Spanning Tree

分析:

每次合并的时候 如果两个集合之间没有目标连边 那么直接就是0

如果有目标连边 设两个集合的大小分别为sz1,sz2 那么概率是1/(sz1×sz2)

现在问题转化为如何快速判断两个集合是否有没有目标连边

因为这条边是在树上 所以两个集合一定是父子关系 所以只需要判断深度小的集合的父亲节点是否在深度大的集合上

#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) x&(-x)
#define ll long long
const int N = 1000005;
const ll mod=998244353;
int nextt[N << 1], to[N << 1], head[N], cnt = 0;
void add(int x, int y) {
	nextt[++cnt] = head[x];
	to[cnt] = y; head[x] = cnt;
}
int f[N], fa[N];
int find(int x) {
	while(x != f[x]) x = f[x] = f[f[x]];
	return f[x];
//if(x!=f[x])f[x]=find(f[x]);
//return x;
}
void solve();
ll fast_mi(ll aa,ll bb){
	ll res=1;
	while(bb){
	 if(bb&1)res=res*aa%mod;
	 bb>>=1;
	 aa=aa*aa%mod;
	}
	return res;
}
int n;
struct oper {
	int x, y;
} opt[N];
bool vis[N];
int dep[N];
vector <ll> ans;
ll son[N];
void bfs() {
	queue <int> q;
	vis[1] = true; q.push(1); dep[1] = 1; fa[1] = 1;
	while(q.size()) {
		int x = q.front(); q.pop();
		for(int i = head[x]; i; i = nextt[i]) {
			int y = to[i];
			if(!vis[y]) {
				dep[y] = dep[x] +1; fa[y] = x;
				vis[y] = true; q.push(y);
			} 
		}
	}
}
int main(){
//	freopen("data.in", "r", stdin);
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0); 
	int T;T=1;
	while(T--)solve();
     return 0;
}

void solve(){
	cin >> n;
	for(int i = 1; i <= n; i++) {
		f[i] = i; son[i] = 1;
	}
	for(int i = 1; i < n; i++) {
		cin >> opt[i].x >> opt[i].y; 
	}
	for(int i = 1, x, y; i < n; i++) {
		cin >> x >> y;
		add(x, y); add(y, x); 
	}
	bfs(); bool flag = true;
	for(int i = 1; i < n; i++) {
		int fx = find(opt[i].x), fy = find(opt[i].y);
		if(dep[fx] < dep[fy]) { //depx > depy
			swap(fx, fy);
		}
//		int fx = find(opt[i].x), fy = find(opt[i].y);
		if(find(fa[fx]) == fy) {
			ans.push_back(son[fx]); ans.push_back(son[fy]);
			f[fx] = fy; son[fy] += son[fx];
		} else {
			flag = false; break;
		}
	}
	if(!flag) {
		cout << 0 << endl;
		return ; 
	}
	ll anss = 1;
	for(int i = 0; i < ans.size(); i++) {
//		cout << "i = " << i << " ansi = " << ans[i] << endl;
		if(ans[i] != 1) anss = anss * fast_mi(ans[i], mod - 2) % mod;
	}
	cout << anss << endl;
	return ;
}


J Minimum Manhattan Distance

分析:

#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) x&(-x)
#define ll long long
const double pi=acos(-1);
void solve();
int main(){
	int T;cin>>T;
	while(T--)solve();
     return 0;
}
struct node{
	double xx,yy;
};
double dis(node p1,node p2){
	return sqrt((p1.xx-p2.xx)*(p1.xx-p2.xx)+(p1.yy-p2.yy)*(p1.yy-p2.yy));
}

void solve(){
	node a,aa,bb,b,y1,y2;
	double r1,r2,D,si,co;
	cin>>a.xx>>a.yy>>aa.xx>>aa.yy>>b.xx>>b.yy>>bb.xx>>bb.yy;
	y1.xx=(a.xx+aa.xx)/2;
	y1.yy=(a.yy+aa.yy)/2;
	y2.xx=(b.xx+bb.xx)/2;
	y2.yy=(b.yy+bb.yy)/2;
	D=dis(y1,y2);
	r1=dis(a,aa)/2;
	r2=dis(b,bb)/2;
	si=abs(y1.yy-y2.yy)/D;
	co=abs(y1.xx-y2.xx)/D;
	printf("%.10lf\n",D*(si+co)-sqrt(double(2))*r2);
}


K Minimum Euclidean Distance

分析:

计算几何的代码不咋会写

标签:aa,int,ll,网络,ICPC,yy,fx,xx,2023
From: https://www.cnblogs.com/wzxbeliever/p/17719267.html

相关文章

  • 基于FasterRCNN深度学习网络的车辆检测算法matlab仿真
    1.算法运行效果图预览 Tttttttttttttt123   2.算法运行软件版本MATLAB2022A 3.算法理论概述       车辆检测是计算机视觉和人工智能领域的重要研究方向,它在交通管理、智能驾驶和安防等领域具有广泛的应用。FasterR-CNN是一种常用的目标检测算法,结合了深度......
  • 2023/09/20 动手动脑
     package示例;importjava.util.Random;importjava.util.Scanner;publicclassthourandom{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);System.out.println("请输入你要生成随机数的数量");int......
  • 2023/9/19
    6-2两个有序链表序列的合并分数 10全屏浏览题目切换布局作者 DS课程组单位 浙江大学本题要求实现一个函数,将两个链表表示的递增整数序列合并为一个非递减的整数序列。函数接口定义: ListMerge(ListL1,ListL2);其中List结构定义如下: ......
  • docker-网络
    当你在浏览器中输入一个网址(比如www.baidu.com)并敲回车,这个过程后面都发生了什么?   你在Chrome的地址栏输入baidu.com1.DNS解析2.建立TCP连接3.发送HTTP请求4.服务器处理请求并返回响应5.接收HTTP响应6.浏览器渲染页面7.执行JavaScript代码 ......
  • Python中TensorFlow的长短期记忆神经网络(LSTM)、指数移动平均法预测股票市场和可视化
    原文链接:http://tecdat.cn/?p=23689最近我们被客户要求撰写关于LSTM的研究报告,包括一些图形和统计输出。本文探索Python中的长短期记忆(LSTM)网络,以及如何使用它们来进行股市预测 ( 点击文末“阅读原文”获取完整代码数据)。在本文中,你将看到如何使用一个被称为长短时记忆的时间......
  • 日常记录--day7--2023-9月20日--周三
    日程:今天只有上午有节英语课,8点30起床,吃了个早饭去上课。中午小睡一个小时,下午没课,起来学习了一会Javaweb,今天主要学了HTML,自己写了个简单的,晚上7-9点继续javaweb,今天没有力扣。学了什么:Javaweb让人头疼,复习了之前的力扣题,继续学习Javaweb。PS:不想学习,想要成为充电线;......
  • 2023.9.20——每日总结
    学习所花时间(包括上课):9h代码量(行):0行博客量(篇):1篇今天,上午上课,下午做任务。我了解到的知识点:1.了解了关于模型训练的一些知识和注意事项;2.了解了关于软件构造的一些知识,明日计划:1.上课;2.比赛;......
  • 2023.9.20
    学习了java的方法,提出新的方法,解决的将是影响做事成效的根本原因。就是将一个大的模块分成小的模块,再把小模块分成更细的把小小模块,一个模块对应于一个单元。学会了软件工程的模块化原则,把一个复杂的系统划分为子模块,方便设计实现和维护。动手又动脑编写一个方法,使用以上算法生......
  • linux网络配置
    linux网络配置一:网络配置的相关概念1:网关网关就是连接不同网段的,可以让不同网段的主机进行通信,就相当于是一个网段鹅出口,必须通过这个出口出去,才能与外界进行通信,在linux中有默认的网关,NAT模式中默认的网关就是以.2结尾比如Ip为192.168.10.10它的网关就是192.168.10.2......
  • 应用层-在IP网络中经常使用的应用层协议和服务包括哪些?主要提供哪些功能?对应的端口号
    1.TELNET远程登录主机,端口号TCP232.FTP文件传输协议。客户端首先连接到FTP服务器的TCP21端口,进行用户的认证,认证成功后,当我们要传输文件时,服务器会开一个端口为TCP20来进行传输数据文件。3.TFTP简单文件传输协议,FTP的简化版,端口号TCP694.NFS文件共享协议,让两种不同的文件......