ACM-ICPC 2018 沈阳赛区网络预赛 D A*算法 F 有上下界的网络流 G分解质因数+公式 容斥 I 模拟 K讨论

本文主要是介绍ACM-ICPC 2018 沈阳赛区网络预赛 D A*算法 F 有上下界的网络流 G分解质因数+公式 容斥 I 模拟 K讨论,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

D
题意:找是否存在第k短路且判断长度是否小于等于T。
思路:A*算法裸题。

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
const int AX = 1e5+66;
const int MAXN = 1e4+66;
int n , m , k;
int s ,t ;
int tot ;
int retot ;
struct edge{int to , w ;int next1;
}G[AX] , RG[AX];
//f = g + h 
struct Node{int v;int f , h , g;bool operator < ( const Node &a ) const{if( f == a.f ){return g > a.g;}return f > a.f;}
};int dis[MAXN];
int head[MAXN];
int rehead[AX];
int vis[MAXN];
void addedge( int u , int v , int c ){G[tot].to = v;G[tot].w = c;G[tot].next1 = head[u];head[u] = tot++;RG[retot].to = u;RG[retot].w = c;RG[retot].next1 = rehead[v];rehead[v] = retot ++;
}
void SPFA(){for( int i = 1 ; i <= n ; i++ ){dis[i] = INF;}   dis[t] = 0;queue<int>Q;Q.push(t);while( !Q.empty() ){int u = Q.front();Q.pop();for( int i = rehead[u] ; ~i ; i = RG[i].next1 ){int v = RG[i].to ;int w = RG[i].w ;if( dis[v] > dis[u] + w ){dis[v] = dis[u] + w;Q.push(v);}}}   
}int Astar( Node a ){memset( vis , 0 ,sizeof(vis) );if( dis[s] == INF ) return -1;if( s == t ) k++;priority_queue<Node>Q;Q.push(a);while( !Q.empty() ){Node tmp = Q.top();Q.pop();int v = tmp.v;vis[v] ++ ;if( vis[t] == k ) return tmp.g;for( int i = head[v] ; ~i ; i = G[i].next1 ){Node p;p.v = G[i].to;p.h = dis[G[i].to];p.g = tmp.g + G[i].w;p.f = p.g + p.h;Q.push(p);}}return -1;
}int main(){int T;while( ~scanf("%d%d",&n,&m) ){scanf("%d%d%d%d",&s,&t,&k,&T);tot = 0 ;retot = 0;memset( head , -1 , sizeof(head) );memset( rehead , -1 , sizeof(rehead) );int x , y , w ;for( int i = 0 ; i < m ; i++ ){scanf("%d%d%d",&x,&y,&w);addedge( x , y , w );}SPFA();Node a;a.v = s ;a.g = 0;a.h = dis[s];a.f = a.g + a.h;int g = Astar(a);//printf("%d\n",g);if( g != -1 && g <= T ){printf("yareyaredawa\n");}else{printf("Whitesnake!\n");}} return 0 ;
}

F
思路:有源汇有上下界的网络流。限制是ss到每个点流量为[L,R],每个点到tt为[L,R]。
Code:

#include <bits/stdc++.h>
#define LL long long 
#define INF 0x3f3f3f3f
using namespace std;
const int AX = 1e5+66;int n , m ;
int sp , tp ;
int ss, tt ; 
int head[AX];
int d[AX];
int cur[AX];
int tot;struct Node{int u , v , flow , next1 ; Node( int u = 0 , int v = 0 , int flow = 0 , int next1 = 0 ):u(u),v(v),flow(flow),next1(next1){}
}G[20*AX];void addedge(int u,int v,int flow){G[tot] = Node( u , v , flow , head[u] ) ; head[u] = tot++ ;G[tot] = Node( v , u , 0 , head[v] ) ; head[v] = tot++ ;
}bool bfs( ){memset( d, -1 , sizeof(d) );d[sp] = 0 ;queue<int>q ;q.push( sp ) ;while( !q.empty() ){int u = q.front() ; q.pop();for( int i = head[u] ; ~i ; i = G[i].next1 ){int v = G[i].v ; if( d[v] == -1 && G[i].flow ) {d[v] = d[u] + 1 ;q.push(v) ;if( v == tp ) return true ; }}} return ~d[tp];
}int dfs( int u , int cap ){if( u == tp ) return cap ; int r = 0 ;for( int i = cur[u] ; ~i ; i = G[i].next1) {int v = G[i].v ; if( G[i].flow && d[v] == d[u] + 1 ){int tmp = min( G[i].flow , cap - r );cur[u] = i ;tmp = dfs(v,tmp);r += tmp ; G[i].flow -= tmp ;G[i^1].flow += tmp ; if( r == cap ) break;}}if( !r ) d[u] -= 2 ;return r ; 
}int Dinic( ){int cnt = 0 ;int t ;while( bfs() ){memcpy(cur,head,sizeof(head));while( t = dfs( sp, INF ) ) cnt += t ; }return cnt ; 
}int main(){int k , L , R ;int Case = 0 ;while( ~scanf("%d%d%d",&n,&m,&k) ){tot = 0 ;memset( head , -1 , sizeof(head) );sp = n + m + 1 ;  tp = n + m + 2 ; ss = n + m + 3 ;  tt = n + m + 4 ;scanf("%d%d",&L,&R);int u , v ; for( int i = 0 ; i < k ; i++ ){scanf("%d%d",&u,&v);addedge( u , v + n , 1 );}for( int i = 1 ; i <= n ; i++ ){addedge( ss , i , R - L ) ;addedge( sp , i , L ) ;addedge( ss , tp , L ) ;}for( int i = 1;  i <= m ; i++ ){addedge( i + n , tt , R - L ) ;addedge( sp , tt , L ) ;addedge( i + n , tp , L ) ;}addedge( tt , ss , INF ) ;printf("Case %d: ",++Case);if( Dinic() == ( n + m ) * L ) puts("Yes");else puts("No");}return 0 ; 
}

G
题意:an = n * n+n,求
这里写图片描述
思路:可以转化成
这里写图片描述
套容斥可以求得结果。
另:这里写图片描述
Code:

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define LL long long 
using namespace std;
const LL MOD = 1e9 + 7 ;
const int AX = 1e5 + 666 ;
const LL inv2 = 500000004;
const LL inv6 = 166666668;
LL m , n ;LL cal( LL n , LL x ){LL num = n / x ; return ( num * ( num + 1 ) %MOD * ( 2 * num + 1 )%MOD * inv6%MOD * x %MOD* x % MOD + num * ( num + 1 )%MOD * inv2 %MOD * x%MOD )%MOD ;
}
int fac[AX];
int tot ;void getFac( ){tot = 0 ;for( int i = 2 ; i * i <= m ; i++ ){if( ( m % i ) == 0 ){fac[tot++] = i ; while( m % i == 0 ) m /= i ;}}if( m > 1 ) fac[tot++] = m ;
}int main(){while( ~scanf("%d%d",&n,&m) ){getFac();LL ans = cal( n , 1 ) ;LL res = 0LL ;for( int i = 1 ; i < ( 1 << tot ) ; i++ ){int f = 0 ; LL tmp = 1LL ;int num = 0 ;for( int j = 0 ; j < tot ; j++ ){if( ( 1 << j ) & i ){tmp = tmp * fac[j] % MOD ;num ++ ;}}tmp = cal( n , tmp );if( num % 2 ){res = ( res + tmp % MOD ) % MOD;}else{res = ( res + MOD - tmp ) % MOD ;}}printf("%lld\n",(ans+MOD-res)%MOD);}return 0 ;
}

I
思路:模拟,16进制转2进制,然后奇偶校验,然后根据映射得出结果。
Code:

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define LL long long 
using namespace std;
map<char,string> mp; 
map<string , int > mp1; 
void init(){mp['0'] ="0000"; mp['1']="0001";mp['2']="0010";mp['3']="0011";mp['4']="0100";mp['5']="0101";mp['6']="0110";mp['7']="0111";mp['8']="1000";mp['9']="1001";mp['A']="1010";mp['B']="1011";mp['C']="1100";mp['D']="1101";mp['E']="1110";mp['F']="1111";mp['a']="1010";mp['b']="1011";mp['c']="1100";mp['d']="1101";mp['e']="1110";mp['f']="1111";
}
int main(){int T;init();ios_base::sync_with_stdio(false);cin.tie(0) ; cout.tie(0) ; cin >> T;int m , n ; while( T-- ){string a; string b; string c; cin >> m >> n ; mp1.clear();int asc ;string s ;  for( int i = 0 ; i < n ; i++ ){cin >> asc >> s ; mp1[s] = asc ; }b = "";cin >> a ; int len = a.size();for( int i = 0 ; i < len ; i++ ){b += mp[a[i]];}len = b.size();for( int i = 0 ; i + 8 < len ; i += 9 ){int num = 0 ; string tmp = "" ;int j ; for( j = i ; j < i + 8 ; j++ ){if( b[j] == '1' ){num ++ ; }tmp += b[j] ; }if( num % 2 ){if( b[j] == '0' ) c += tmp ; }else{if( b[j] == '1' ) c += tmp ; }}int size = c.size() ; string tmp = "" ; string res = "" ;int length = 0 ;for( int i = 0 ; i < size ; i ++ ){tmp += c[i] ; if( length == m ) break ; if( mp1[tmp] ){//cout << (char)mp1[tmp];res += (char)mp1[tmp];length ++ ;tmp = "";}}cout << res << endl;}   return 0 ;
}

K
题意:一个数为素数且任意子串为素数
思路:考虑到答案中任意一位都必须是1或质数,可知答案只可能由1、2、3、5、7构成。由于任意两个不为1的数字构成 的两位数一定可以被11整除,所以答案中除1外的数字只能出现一次;1最多出现2次,因为111可以被3整除;而 2、5、7三者一定不会有两者同时出现。因此满足条件的整数不会超过四位,全部预处理出来即可。
Code:

#include <bits/stdc++.h>
using namespace std;int a[21]={1,2,3,5,7,11,13,17,23,31,37,53,71,73,113,131,137,173,311,317,10000};int init(string s){int cnt = 0;for(int i=0;i<s.length();i++){cnt = cnt*10 + s[i]-'0';}return cnt;
}
int t;
int main(){cin>>t;for(int i=1;i<=t;i++){string s;cin>>s;cout<<"Case #"<<i<<": ";if(s.length()>=4){cout<<"317"<<endl;}else{int ans = init(s);for(int i=0;i<21;i++){if(a[i]>ans){cout<<a[i-1]<<endl;break;}}}}return 0;
}

这篇关于ACM-ICPC 2018 沈阳赛区网络预赛 D A*算法 F 有上下界的网络流 G分解质因数+公式 容斥 I 模拟 K讨论的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/368326

相关文章

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

SSID究竟是什么? WiFi网络名称及工作方式解析

《SSID究竟是什么?WiFi网络名称及工作方式解析》SID可以看作是无线网络的名称,类似于有线网络中的网络名称或者路由器的名称,在无线网络中,设备通过SSID来识别和连接到特定的无线网络... 当提到 Wi-Fi 网络时,就避不开「SSID」这个术语。简单来说,SSID 就是 Wi-Fi 网络的名称。比如

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象