链接

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

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. 关于S50卡密钥A和密钥B

    关于S50卡密钥A和密钥B 1. Mifare_Std 卡片的密钥属性取决于控制字.控制字的默认值是“FF078069”,此时 A密钥:不可被读出,有全部权限. B密钥:可被读出,没有任何权限. 2. ...

  2. eslintrc.js

    此插件主要就是规范前端程序员编写JS的规范,让代码看上去很优雅,也便于后期人员的重构和维护. 因为是用vue的cli搭建项目工程,使用了eslintrc.js ,但是在写JS时发现,首字母缩进一直报错 ...

  3. MSTAR SERVICE结构

    程序结构: 1.主线程的构建 appMain.c/appMain_Create(): 2.主线程服务构建  _appMain_Task() 清空服务: memset(_appMain.appList, ...

  4. POJ2823(优先队列)

    Sliding Window Time Limit: 12000MS   Memory Limit: 65536K Total Submissions: 50738   Accepted: 14590 ...

  5. redis sentinel(哨兵)配置解读

    1 port <sentinel-port> :哨兵实例运行所在的端口(默认26379) 2 sentinel announce-ip:哨兵将会在gossip hello消息中使用指定的i ...

  6. 3.javascript转换日期字符串为Date对象

    js中文网 阮一峰 1.求format“xxxx年xx月xx日 xx:xx”类型的两个日期天数差 var start = "2017年09月17日 13:51"; var end ...

  7. 网页中控制ActiveX插件高度

    说明:IE窗口中承载了一个ActiveX插件,试图使该插件充填窗口(自适应窗口的高度.宽度),且不出滚动条. 承载插件的代码如下: <body>    <form id=" ...

  8. iOS 中这些是否熟练掌握——(2)

    接上一篇博文,本篇博文是作者原创,用于记录从网上查阅的一些资料,并对自己的知识体系进行一下总结,成文以供学习使用. 1.Cocoa Touch 包含了什么?不包含什么?与 Cocoa 有什么区别? 相 ...

  9. eclipse项目从编程到打jar包到编写BashShell执行

    eclipse项目从编程到打jar包到编写BashShell执行 一.创建Java项目,并编写项目(带额外jar包) 二.打jar包 三.编写BashShell执行 其中一以及二可以参考我的博客 Ec ...

  10. Makefile研究(三) —— 实际应用

    转自:http://blog.csdn.net/jundic/article/details/17886637 前面讲了Makefile 的简单语法和简单的应用模板,但在实际项目应用中比这个肯定复杂很 ...