链接

虽做出的很少,也记录下来,留着以后来补。。浙大题目质量还是很高的

B

并查集的一些操作,同类和不同类我是根据到根节点距离的奇偶判断的,删点是直接新加一个点,记得福大月赛也做过类似的,并差集的这类关系题目还是比较常见的,有空深究一下。

 #include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
#include<vector>
#include<cmath>
#include<queue>
#include<set>
using namespace std;
#define N 600010
#define LL long long
#define INF 0xfffffff
const double eps = 1e-;
const double pi = acos(-1.0);
const double inf = ~0u>>;
int fa[N],res[N],mp[N];
int dis[N];
int find(int x)
{
if(fa[x]!=x)
{
int ro = find(fa[x]);
dis[x]+=dis[fa[x]];
return fa[x] = ro;
}
else
return x;
}
int main()
{
int n,m,i;
char s[];
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i = ; i <= n+m; i++)
{
fa[i] = i;
res[i] = ;
mp[i] = i;
dis[i] = ;
}
int g = n+;
while(m--)
{
int x,y;
scanf("%s",s);
if(s[]=='L')
{
scanf("%d%d",&x,&y);
x = mp[x];
y = mp[y];
int tx = find(x);
int ty = find(y);
if(tx!=ty)
{
fa[tx] = ty;
dis[tx] = (dis[x]++dis[y]);//合并时应根据两树上的节点距离来确定两树的根节点距离
res[ty]+=res[tx];
}
}
else if(s[]=='Q')
{
scanf("%d%d",&x,&y);
x = mp[x];
y = mp[y];
int tx = find(x);
int ty = find(y);
//cout<<tx<<" "<<ty<<endl;
if(tx!=ty)
{
printf("Unknown\n");
continue;
}
if((dis[x]-dis[y])%==)
printf("Same\n");
else
printf("Different\n");
}
else if(s[]=='S')
{
scanf("%d",&x);
x = mp[x];
int tx = find(x);
printf("%d\n",res[tx]);
}
else
{
scanf("%d",&x);
int xx = mp[x];
int tx = find(xx);
res[tx]-=;
mp[x] = ++g;
}
}
}
return ;
}

C

离散化一下,枚举所有值所在的区间段,从左到右走一遍,采用边删边走的形式。

 #include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
#include<vector>
#include<cmath>
#include<queue>
#include<set>
#include<map>
using namespace std;
#define N 100010
#define LL long long
#define INF 0xfffffff
const double eps = 1e-;
const double pi = acos(-1.0);
const double inf = ~0u>>;
map<int,int>f;
vector<int>ed[N];
vector<int>dd[N];
int c[N];
int main()
{
int n,k,i,j;
while(scanf("%d%d",&n,&k)!=EOF)
{
f.clear();
int g = ;
for(i = ; i <= n; i++)
{
ed[i].clear();
dd[i].clear();
}
for(i = ; i <=n ;i++)
{
scanf("%d",&c[i]);
if(!f[c[i]]) f[c[i]] = ++g;
if(i==)
{
dd[f[c[i]]].push_back(i);
continue;
}
int tg = f[c[i-]];
if(c[i]!=c[i-])
{
ed[tg].push_back(i-);
dd[f[c[i]]].push_back(i);
}
}
ed[f[c[n]]].push_back(n);
int ans = ;
for(i = ; i <= g; i++)
{
int tk = ,st=,ss=;
ss += ed[i][]-dd[i][]+;
ans = max(ans,ss); for(j = ;j < ed[i].size() ; j++)
{
tk+=(dd[i][j]-ed[i][j-]-);
ss+=(ed[i][j]-dd[i][j]+);
while(tk>k&&st<j)
{
tk-=(dd[i][st+]-ed[i][st]-);
ss-=(ed[i][st]-dd[i][st]+);
st++;
} ans = max(ans,ss);
}
}
printf("%d\n",ans);
}
return ;
}

F

这题有点逗,看了半个多小时终于看懂了啥意思,然后。。一份更逗的AC代码,全部输出1.

 #include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
#include<vector>
#include<cmath>
#include<queue>
#include<set>
using namespace std;
#define N 100000
#define LL long long
#define INF 0xfffffff
const double eps = 1e-;
const double pi = acos(-1.0);
const double inf = ~0u>>;
int main()
{
int t,b,e;
cin>>t;
while(t--)
{
cin>>b>>e;
cout<<"1\n";
}
return ;
}

补坑

----------------------------------------------------------

D

dp,今天周赛鹏队把月赛题放出来了,上面3个都A过了,就去看这题。

这题着重点要放在有多少个不同的字母上面,用dp[i][g]表示有当前走了i步且有g个字母不同,往后递推步数,因为每次会变m个位置,那么可以枚举当前g个里面变了j个,那么len-g里面肯定要变m-j个。

那么久可以写出递推方程dp[i-g+m-g][j] = dp[i][j]*C(g,j)*C(len-g,m-j) 注意下边界问题。

 #include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
#include<vector>
#include<cmath>
#include<queue>
#include<set>
using namespace std;
#define N 101
#define LL long long
#define INF 0xfffffff
#define mod 1000000009
const double eps = 1e-;
const double pi = acos(-1.0);
const double inf = ~0u>>;
char s1[N],s2[N];
LL dp[N][N],c[N][N];
void init()
{
for(int i=;i<=;i++)
for(int j=;j<=i;j++)
if(!j || i==j)
c[i][j]=;
else
c[i][j]=(c[i-][j-]+c[i-][j])%mod;
}
int main()
{
int n,m,k,i,j,g;
init();
while(scanf("%d%d%d",&n,&k,&m)!=EOF)
{
memset(dp,,sizeof(dp));
cin>>s1>>s2;
if(strlen(s1)!=strlen(s2)||strlen(s1)<m)
{
puts("");
continue;
}
int len = strlen(s1);
int num = ;
for(i = ;i < len ; i++)
if(s1[i]!=s2[i])
num++;
dp[][num] = ;
for(i = ; i <= k ; i++)
{
for(g = ; g <= len; g++)
for(j = ; j <= min(g,m) ;j++)
{
if(len-g<m-j) continue;
// cout<<i<<" "<<j<<endl;
dp[i][g-j+(m-j)]=(dp[i][g-j+(m-j)]+((dp[i-][g]*c[g][j])%mod*c[len-g][m-j])%mod)%mod;
// if(i==2&&j==0)
// {
// cout<<c[num-g][m-j]<<" "<<num-g<<" "<<m-j<<endl;
// cout<<i<<" "<<g-j+m-j<<" "<<dp[i][g-j+m-j]<<endl;
// }
}
}
cout<<dp[k][]<<endl;
}
return ;
}

H

tarjan缩点,然后找一个最长路,这个可以用topo思想来找最长的。

 #include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
#include<vector>
#include<cmath>
#include<queue>
#include<set>
#include<stack>
using namespace std;
#define N 100010
#define LL long long
#define INF 0xfffffff
const double eps = 1e-;
const double pi = acos(-1.0);
const double inf = ~0u>>;
vector<int>ed[N];
vector<int>dd[];
vector<int>ee[N];
int de[N],nn[N],dis[N];
bool vis[N];
int pre[N],lowlink[N],sccno[N],dfs_lock,scc_cnt;
stack<int>S;
void dfs(int u)
{
pre[u] = lowlink[u] = ++dfs_lock;
S.push(u);
for(int i = ;i < (int)ed[u].size() ; i++)
{
int v = ed[u][i];
if(!pre[v])
{
dfs(v);
lowlink[u] = min(lowlink[u],lowlink[v]);
}
else if(!sccno[v])
lowlink[u] = min(lowlink[u],pre[v]);
}
if(lowlink[u]==pre[u])
{
scc_cnt++;
int g = ;
for(;;)
{
int x = S.top();S.pop();
sccno[x] = scc_cnt;
g++;
if(x==u) break;
}
nn[scc_cnt] = g;
}
}
void find_scc(int n)
{
dfs_lock = scc_cnt = ;
memset(sccno,,sizeof(sccno));
memset(pre,,sizeof(pre));
for(int i = ;i < n; i++)
if(!pre[i]) dfs(i);
}
int find()
{
int i;
for(i = ;i <= scc_cnt ; i++)
dis[i] = ;
queue<int>q;
for(i = ;i <= scc_cnt ; i++)
{
if(de[i]==)
{
q.push(i);
dis[i] = nn[i];
}
}
while(!q.empty())
{
int tu = q.front();
q.pop();
for(i = ; i < ee[tu].size() ; i++)
{
int v = ee[tu][i];
dis[v] = max(dis[v],dis[tu]+nn[v]);
de[v]--;
if(de[v]==)
q.push(v);
}
}
int ans = ;
for(i = ; i <= scc_cnt ; i++)
ans = max(ans,dis[i]);
return ans;
}
int main()
{
int i,m,n,j;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(de,,sizeof(de));
for(i = ;i <= n ;i++)
{
ed[i].clear();
ee[i].clear();
}
dd[].clear();
dd[].clear();
for(i = ; i <= m ;i++)
{
int u,v;
scanf("%d%d",&u,&v);u--,v--;
ed[u].push_back(v);
}
find_scc(n);
for(i = ; i < n ;i++)
{
for(j = ;j < (int)ed[i].size() ; j++)
{
int v = ed[i][j];
if(sccno[i]!=sccno[v])
{
vector<int>::iterator it;
int tu = sccno[i],tv = sccno[v];
// it = lower_bound(ee[tu].begin(),ee[tu].end(),tv);
// if(it==ee[tu].end()||(*it)!=tv)
// {
ee[tu].push_back(tv);
de[tv]++;
// }
}
}
}
printf("%d\n",find());
}
return ;
}

记次浙大月赛 134 - ZOJ Monthly, June 2014的更多相关文章

  1. ZOJ Monthly, June 2014 月赛BCDEFGH题题解

    比赛链接:点击打开链接 上来先搞了f.c,,然后发现状态不正确,一下午都是脑洞大开,, 无脑wa,无脑ce...一样的错犯2次.. 硬着头皮搞了几发,最后20分钟码了一下G,不知道为什么把1直接当成不 ...

  2. ZOJ Monthly, June 2014 解题报告

    A.Another Recurrence Sequence problemId=5287">B.Gears 题目大意:有n个齿轮,一開始各自为一组.之后进行m次操作,包含下面4种类型: ...

  3. 浙大月赛ZOJ Monthly, August 2014

    Abs Problem Time Limit: 2 Seconds Memory Limit: 65536 KB Special Judge Alice and Bob is playing a ga ...

  4. 135 - ZOJ Monthly, August 2014

    135 - ZOJ Monthly, August 2014 A:构造问题,推断序列奇偶性.非常easy发现最小值不是1就是0.最大值不是n就是n - 1,注意细节去构造就可以 E:dp.dp[i][ ...

  5. ZOJ Monthly, June 2018 Solution

    A - Peer Review Water. #include <bits/stdc++.h> using namespace std; int t, n; int main() { sc ...

  6. ZOJ Monthly, November 2014

    做了一次月赛,没想到这么难,加上后来补上的题目也只有3个题.第一名也只有4个题啊啊啊啊~.其中两道还是水题.留坑慢慢补上来. 3832 Tilt Cylinder 给定如图所示有盖圆柱体,R,H,水面 ...

  7. ZOJ Monthly, August 2014

    A Abs Problem http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5330 找规律题,构造出解.copyright@ts ...

  8. 137 - ZOJ Monthly, November 2014 - J Poker Face

    Poker Face Time Limit: 2 Seconds      Memory Limit: 65536 KB As is known to all, coders are lack of ...

  9. Incircle and Circumcircle(二分+几何)浙大月赛zoj3806(详解版)图

    Incircle and Circumcircle Time Limit: 2 Seconds Memory Limit: 65536 KB Special Judge A triangle is o ...

随机推荐

  1. tomcat启动项目被重新加载,导致资源初始化两遍

    之前没有遇到过这个问题,配了三天的项目了,惊人啊!!!各种怪问题全被我赶上了.真有种骂人的冲动. tomcat启动项目时,项目资源被加载两遍. 原因:配置虚拟目录导致,项目被重新加载. <Hos ...

  2. jquery回顾part1——选择器

    jQuery 选择器 选择器 实例 选取 * $("*") 所有元素 #id $("#lastname") id="lastname" 的元 ...

  3. 洛谷p1007独木桥

    P1007独木桥 题目背景 战争已经进入到紧要时间.你是运输小队长,正在率领运输部队向前线运送物资.运输任务像做题一样的无聊.你希望找些刺激,于是命令你的士兵们到前方的一座独木桥上欣赏风景,而你留在桥 ...

  4. Python之Numpy详细教程

    NumPy - 简介 NumPy 是一个 Python 包. 它代表 “Numeric Python”. 它是一个由多维数组对象和用于处理数组的例程集合组成的库. Numeric,即 NumPy 的前 ...

  5. 洛谷 1079 Vigenère 密码——模拟水题

    题目:https://www.luogu.org/problemnew/show/P1079 大水题. #include<iostream> #include<cstdio> ...

  6. 2.1-2.2 HBase数据存储

    一.HBase数据检索流程 一篇介绍HBase数据读写流程的解析的博文:http://hbasefly.com/2016/12/21/hbase-getorscan/?wsfatm=uqvhl3 1. ...

  7. POJ - 2676 Sudoku 数独游戏 dfs神奇的反搜

    Sudoku Sudoku is a very simple task. A square table with 9 rows and 9 columns is divided to 9 smalle ...

  8. HDU4973 【几何。】

    题意: 给你一个以原点为圆心的两个圆,一个大圆,一个小圆,然后给你一个硬币和他的速度,问你经过大圆的时间: 思路: 直接杠.. 然后wa的怀疑人生,后面wa在了速度的方向,如果我说一个点在两个圆的左上 ...

  9. 一个高效的A-star寻路算法(八方向)(

    这种写法比较垃圾,表现在每次搜索一个点要遍历整个地图那么大的数组,如果地图为256*256,每次搜索都要执行65535次,如果遍历多个点就是n*65535,速度上实在是太垃圾了 简单说下思路,以后补充 ...

  10. [Xcode 实际操作]九、实用进阶-(14)使用富文本CoreText框架创建丰富多彩的文本

    目录:[Swift]Xcode实际操作 本文将演示如何使用富文本CoreText框架创建丰富多彩的文本图形. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] imp ...