抽空在vjudge上做了这套题。剩下FZU 2208数论题不会。

FZU 2205

这是个想法题,每次可以在上一次基础上加上边数/2的新边。

 #include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <string.h>
#include <stdio.h>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <cmath>
#include <ctime>
#include <cassert>
#include <sstream>
using namespace std; const int N=; int f[N];
int main () {
f[]=;
for (int i=;i<=;i++) {
f[i]=f[i-]+i/;
}
int T;
cin>>T;
while (T--) {
int n;
cin>>n;
cout<<f[n]<<endl;
}
return ;
}

FZU 2206

乍看不知道什么东西,直接在机器上跑几个数字可以试出来结论。

 #include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <string.h>
#include <stdio.h>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <cmath>
#include <ctime>
#include <cassert>
#include <sstream>
using namespace std; const int N=;
const int INF=0x3f3f3f3f; int main () {
//freopen("out.txt","r",stdin);
int T;
scanf("%d",&T);
for (int cas=;cas<=T;cas++) {
long long n;
scanf("%I64d",&n);
if (n<20150001LL) cout<<n+<<endl;
else cout<<<<endl;
}
return ;
}

FZU 2207

会用倍增算LCA的话,这题也肯定会做。

 #include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <string.h>
#include <stdio.h>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <cmath>
#include <ctime>
#include <cassert>
#include <sstream>
using namespace std; const int N=; vector<int>e[N];
int fa[N][];
int dep[N];
void dfs(int u,int f,int d) {
dep[u]=d;
for (int i=;i<e[u].size();i++) {
int v=e[u][i];
if (v==f) continue;
dfs(v,u,d+);
fa[v][]=u;
}
} void calc(int n) {
for (int j=;j<=;j++) {
for (int i=;i<=n;i++) {
fa[i][j]=fa[fa[i][j-]][j-];
}
}
} int kthA(int u,int k) {
for (int i=;i>=;i--) {
if (k>=(<<i)){
k-=(<<i);
u=fa[u][i];
}
}
return u;
} int lca(int u,int v) {
if (dep[u]<dep[v]) swap(u,v);
int d=dep[u]-dep[v];
u=kthA(u,d);
if (u==v) return u;
for (int i=;i>=;i--) {
if (fa[u][i]==fa[v][i])
continue;
u=fa[u][i];
v=fa[v][i];
}
return fa[u][];
}
int main () {
int T;
scanf("%d",&T);
while (T--) {
int n,m;
scanf("%d %d",&n,&m);
for (int i=;i<=n;i++)
e[i].clear();
for (int i=;i<n;i++) {
int u,v;
scanf("%d %d",&u,&v);
e[u].push_back(v);
e[v].push_back(u);
}
dfs(,-,);
calc(n);
static int cas=;
printf("Case #%d:\n",cas++);
while (m--) {
int u,v,k;
scanf("%d %d %d",&u,&v,&k);
int ans=lca(u,v);
if (k==) {
printf("%d\n",u);
continue;
}
else if (k==dep[u]-dep[ans]+dep[v]-dep[ans]+) {
printf("%d\n",v);
continue;
}
if (dep[u]-dep[ans]+>=k) {
int ret=kthA(u,k-);
printf("%d\n",ret);
}
else {
int to=dep[u]-dep[ans]+dep[v]-dep[ans]+-k;
int ret=kthA(v,to);
printf("%d\n",ret);
}
}
}
return ;
}

FZU 2208

数论题,不会

FZU 2209

分层图。

 #include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <string.h>
#include <stdio.h>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <cmath>
#include <ctime>
#include <cassert>
#include <sstream>
using namespace std; const int N=;
const int INF=0x3f3f3f3f;
int get(int n,int u,int k) {
return k*n+u;
}
struct Edge {
int to,next,len;
Edge() {}
Edge(int _to,int _next,int _len):to(_to),next(_next),len(_len) {}
} edge[];
int idx=,head[N];
inline void addedge(int u,int v,int l) {
edge[++idx]=Edge(v,head[u],l);
head[u]=idx;
}
int dis[N][N],in[N];
bool vis[N];
bool spfa(int s,int n,int *dis) {
fill(dis,dis+N,INF);
memset(vis,false,sizeof(vis));
memset(in,,sizeof(in));
dis[s]=;
vis[s]=true;
queue<int> que;
que.push(s);
in[s]=;
while (!que.empty()) {
int u=que.front();
que.pop();
vis[u]=false;
for (int k=head[u];k;k=edge[k].next) {
int v=edge[k].to;
if (dis[v]>dis[u]+edge[k].len) {
dis[v]=dis[u]+edge[k].len;
if (!vis[v]) {
vis[v]=true;
in[v]++;
if (in[v]>n) return false;
que.push(v);
}
}
}
}
return true;
}
int main () {
//freopen("out.txt","r",stdin);
int T;
scanf("%d",&T);
for (int cas=;cas<=T;cas++) {
int n,m,k;
scanf("%d %d %d",&n,&m,&k);
idx=;memset(head,,sizeof head);
for (int i=;i<=m;i++) {
int u,v;
scanf("%d %d",&u,&v);
int d;
for (int i=;i<;i++) {
scanf("%d",&d);
int uu=get(n,u,i);
int vv=get(n,v,(i+d)%);
addedge(uu,vv,d);
uu=get(n,v,i);
vv=get(n,u,(i+d)%);
addedge(uu,vv,d);
}
}
for (int i=;i<;i++) {
spfa(get(n,,i),n*,dis[i]);
}
printf("Case #%d:",cas);
while (k--) {
int v,s;
scanf("%d %d",&v,&s);
//cout<<"from "<<get(n,1,s)<<endl;
int ret=0x3f3f3f3f;
for (int i=;i<;i++) {
int p=get(n,v,i);
ret=min(ret,dis[s][p]);
}
if (ret==0x3f3f3f3f) ret=-;
printf(" %d",ret);
}
puts("");
}
return ;
}

FZU 2210

建立一个虚拟节点,连向所有粮仓,枚举所有禁止的城市,从虚拟节点dfs,更新答案。

 #include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <string.h>
#include <stdio.h>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <cmath>
#include <ctime>
#include <cassert>
#include <sstream>
using namespace std; const int N=; vector<int>e[N];
int in[N];
bool vis[N];
int fob;
int cnt;
void dfs(int u) {
if (u==fob||vis[u]) return;
vis[u]=true;cnt++;
for (int i=;i<e[u].size();i++) {
int v=e[u][i];
dfs(v);
}
}
int main () {
int n,m;
while (scanf("%d %d",&n,&m)!=EOF) {
for (int i=;i<=n;i++){
e[i].clear();
in[i]=;
}
for (int i=;i<=m;i++) {
int u,v;
scanf("%d %d",&u,&v);
e[u].push_back(v);
in[v]++;
}
for (int i=;i<=n;i++) {
if (in[i]==)
e[].push_back(i);
}
int ret=n+,val=;
for (int i=n;i>=;i--) {
fob=i;
memset(vis,false,sizeof vis);
cnt=;
dfs();
cnt--;
if (n-cnt>=val) {
val=n-cnt;
ret=i;
}
}
cout<<ret<<endl;
}
return ;
}

FZU 2211

费用流,把所有蘑菇拆成两个点,根据时间关系,互相连边。农田的限制在于源点出来的流的大小。

 #include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <string.h>
#include <stdio.h>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <cmath>
#include <ctime>
#include <cassert>
#include <sstream>
using namespace std; const int N=;
const int INF=0x3f3f3f3f; struct Edge{
int to,next,f;
long long c;
Edge(){}
Edge(int _to,int _nxt,int _f,long long _c):to(_to),next(_nxt),f(_f),c(_c){}
}edge[N<<]; int head[N],idx;
bool vis[N];
long long dis[N];
int pree[N],prev[N];
void addedge(int u,int v,int flow,long long cost){
edge[++idx]=Edge(v,head[u],flow,cost);
head[u]=idx;
edge[++idx]=Edge(u,head[v],,-cost);
head[v]=idx;
}
bool spfa(int s,int e){
memset(vis,,sizeof(vis));
memset(pree,-,sizeof(pree));
memset(prev,-,sizeof(prev));
for (int i=;i<N;i++) dis[i]=~0ULL>>;
dis[s]=;
vis[s]=true;
queue<int>que;
que.push(s);
while (!que.empty()){
int cur=que.front();
que.pop();
vis[cur]=false;
for (int k=head[cur];k;k=edge[k].next){
if (edge[k].f){
int n=edge[k].to;
if (dis[n]>dis[cur]+edge[k].c){
dis[n]=dis[cur]+edge[k].c;
prev[n]=cur;
pree[n]=k;
if (!vis[n]){
vis[n]=true;
que.push(n);
}
}
}
}
}
if (dis[e]>=INF) return ;
return ;
}
long long minCostMaxFlow(int src,int sink){
long long cur,min_val;
long long ansf=,ansc=;
while (spfa(src,sink)){
cur=sink;
min_val=INF;
while (prev[cur]!=-){
if (min_val>edge[pree[cur]].f)
min_val=edge[pree[cur]].f;
cur=prev[cur];
}
cur=sink;
while (prev[cur]!=-){
edge[pree[cur]].f-=min_val;
edge[pree[cur]^].f+=min_val;
cur=prev[cur];
}
ansc+=dis[sink]*min_val;
ansf+=min_val;
}
return ansc;
} int s[N],t[N],v[N];
int main () {
int T;
scanf("%d",&T);
for (int cas=;cas<=T;cas++) {
int n,m;
scanf("%d %d",&n,&m);
for (int i=;i<=m;i++) {
scanf("%d %d %d",s+i,t+i,v+i);
}
idx=;memset(head,,sizeof head);
for (int i=;i<=m;i++) {
for (int j=;j<=m;j++) {
if (t[i]<s[j]) {
addedge(i+m,j,INF,);
}
}
}
int s=m+m+,t=m+m++;
for (int i=;i<=m;i++) {
addedge(,i,INF,);
addedge(i,i+m,,-v[i]);
addedge(i+m,t,INF,);
}
addedge(s,,n,);
long long ret=-minCostMaxFlow(s,t);
cout<<ret<<endl;
}
return ;
}

FOJ 11月月赛题解的更多相关文章

  1. 洛谷11月月赛题解(A-C)

    心路历程 辣鸡T3卡我1.5h题意,要不是最后nlh跟我解释了一下大样例估计这次是真凉透了.. A P4994 终于结束的起点 打出暴力来发现跑的过最大数据?? 保险起见还是去oeis了一波,然后被告 ...

  2. csu-2018年11月月赛Round2-div1题解

    csu-2018年11月月赛Round2-div1题解 A(2191):Wells的积木游戏 Description Wells有一堆N个积木,标号1~N,每个标号只出现一次 由于Wells是手残党, ...

  3. csu-2018年11月月赛Round2-div2题解

    csu-2018年11月月赛Round2-div2题解 A(2193):昆虫繁殖 Description 科学家在热带森林中发现了一种特殊的昆虫,这种昆虫的繁殖能力很强.每对成虫过x个月产y对卵,每对 ...

  4. BZOJ5091 摘苹果 BZOJ2017年11月月赛 概率,期望

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ5091 11月月赛B题 题意概括 题解 代码 #include <cstring> #i ...

  5. BZOJ5090 组题 BZOJ2017年11月月赛 二分答案 单调队列

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ5090 11月月赛A题 题意概括 给出n个数. 求连续区间(长度大于等于k)最大平均值. 题解 这题 ...

  6. 「P4996」「洛谷11月月赛」 咕咕咕(数论

    题目描述 小 F 是一个能鸽善鹉的同学,他经常把事情拖到最后一天才去做,导致他的某些日子总是非常匆忙. 比如,时间回溯到了 2018 年 11 月 3 日.小 F 望着自己的任务清单: 看 iG 夺冠 ...

  7. 「P4994」「洛谷11月月赛」 终于结束的起点(枚举

    题目背景 终于结束的起点终于写下句点终于我们告别终于我们又回到原点…… 一个个 OIer 的竞赛生涯总是从一场 NOIp 开始,大多也在一场 NOIp 中结束,好似一次次轮回在不断上演.如果这次 NO ...

  8. 「LuoguP4995」「洛谷11月月赛」 跳跳!(贪心

    题目描述 你是一只小跳蛙,你特别擅长在各种地方跳来跳去. 这一天,你和朋友小 F 一起出去玩耍的时候,遇到了一堆高矮不同的石头,其中第 ii 块的石头高度为 h_ihi​,地面的高度是 h_0 = 0 ...

  9. LG 11 月 月赛 II T4

    LG 11 月 月赛 II T4 看到膜数和 $ 10^5 $ 以及 $ n^2 $ 的部分分想到很可能是 NTT 于是开始推式子 首先看到式子可以化作, 如果 \(k = 0\) , $ f(l , ...

随机推荐

  1. 从零开始部署小型企业级虚拟桌面 -- Vmware Horizon View 6 For Linux VDI -- 概念简介

    什么是桌面虚拟化? 桌面虚拟化有很多概念,此处谈论的,是指的一般企业使用的“服务器 + 虚拟机 + 云终端”的方式来实现的. 桌面虚拟化的原理是什么? 桌面虚拟化看上去高大上,实际上原理非常的简单.拿 ...

  2. 【阿里聚安全技术公开课】移动APP漏洞风险与解决方案

    阿里云·云栖社区携手阿里聚安全打造阿里安全技术公开课,带你一探互联网安全的风采 关于移动APP安全 移动App是大家使用手机每天接触最多的东西,然而在移动APP开发中,由于一些开发工程师对安全的不重视 ...

  3. Python round() 函数

    round() 方法返回浮点数x的四舍五入值. 以下是 round() 方法的语法: round( x [, n] )x为浮点数,n为保留的小数点位. 以下展示了使用 round() 方法的实例: p ...

  4. vue单文件组件的构建

    在很多Vue项目中,我们使用 Vue.component 来定义全局组件,这种方式在很多中小规模的项目中运作的很好. 但当在更复杂的项目中,就有了很大的弊端. 我们就可以用文件扩展名 .vue的单文件 ...

  5. Django通用视图执行过程

    使用通用视图后,Django请求处理过程(以ListView为例):在我们自定义的视图中: class IndexView(ListView): template_name = 'blog/index ...

  6. Intellij Idea自动加载改动文件和自动自动热部署加载

    1:准备原料 我的Intellij Idea的版本是15. 之后tomcat自动加载修,你只需要在浏览器刷新一下页面即可. ************************************** ...

  7. Array对象

    1.    Array定义 Array是可以保存任意变量的.也就是说,第一项可以是一个基本类型,第二项就可以是一个引用类型,长度也是根据内容动态增加的 var arr = new Array(); 当 ...

  8. (转)Zabbix Agent-Windows平台配置指导

      原地址:http://blog.itpub.net/26739940/viewspace-1169538/   zabbix是一个CS结构的监控系统,支持ping,snmp等很多的监控,但是大部分 ...

  9. python之smtplib发邮件

    第一版: 认证发信,不支持附件 #!/usr/bin/env python # --------------------------------------- # author : Geng Jie ...

  10. 数位dp初步——数位dp的两种方式

    数位dp:一类统计区间[L,R]内某种符合规定的数字个数的题目.特征是R的范围会很大,O(N)范围内无法完成. 一般而言,解决这类题目有两种方式,一种是递推,另一种是记忆化搜索. 递推: 1)利用dp ...