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

相关文章

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

SpringBoot使用OkHttp完成高效网络请求详解

《SpringBoot使用OkHttp完成高效网络请求详解》OkHttp是一个高效的HTTP客户端,支持同步和异步请求,且具备自动处理cookie、缓存和连接池等高级功能,下面我们来看看SpringB... 目录一、OkHttp 简介二、在 Spring Boot 中集成 OkHttp三、封装 OkHttp

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

Linux系统之主机网络配置方式

《Linux系统之主机网络配置方式》:本文主要介绍Linux系统之主机网络配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、查看主机的网络参数1、查看主机名2、查看IP地址3、查看网关4、查看DNS二、配置网卡1、修改网卡配置文件2、nmcli工具【通用

使用Python高效获取网络数据的操作指南

《使用Python高效获取网络数据的操作指南》网络爬虫是一种自动化程序,用于访问和提取网站上的数据,Python是进行网络爬虫开发的理想语言,拥有丰富的库和工具,使得编写和维护爬虫变得简单高效,本文将... 目录网络爬虫的基本概念常用库介绍安装库Requests和BeautifulSoup爬虫开发发送请求解

MySQL中闪回功能的方案讨论及实现

《MySQL中闪回功能的方案讨论及实现》Oracle有一个闪回(flashback)功能,能够用户恢复误操作的数据,这篇文章主要来和大家讨论一下MySQL中支持闪回功能的方案,有需要的可以了解下... 目录1、 闪回的目标2、 无米无炊一3、 无米无炊二4、 演示5、小结oracle有一个闪回(flashb

利用Python实现添加或读取Excel公式

《利用Python实现添加或读取Excel公式》Excel公式是数据处理的核心工具,从简单的加减运算到复杂的逻辑判断,掌握基础语法是高效工作的起点,下面我们就来看看如何使用Python进行Excel公... 目录python Excel 库安装Python 在 Excel 中添加公式/函数Python 读取

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.