BestCoder Round #74
身败名裂啊。。。。。。
T1WA了半天,30min才A。
T2又WA了一发,然后Hack刚2min就被别人叉了。
T3做完后最后40min不知所措。
去叉别人,看到一个人写D题判m=0很奇怪,随手把他叉了:
1
3 0
然后发现,标程输出1.
奥妙重重
嘿嘿嘿,我竟然又去叉了吉利。
T1的SB错误是,答案可能是|x-y|。
T2的SB错误是,一个[1,10^5]的数异或[1,10^5]的数可能是[1,131072]的数。
x到y的路径可能有几种:
1.x->y
2.x->i->j>y
其中i和j是新边里的节点(称为关键节点)
将六个关键点连起来跑一下Floyd,然后每次询问时枚举一下i,j。
#include<cstdio>
#include<cstring>
#include<cctype>
#include<map>
#include<algorithm>
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
using namespace std;
inline int read() {
int x=,f=;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-;
for(;isdigit(c);c=getchar()) x=x*+c-'';
return x*f;
}
const int maxn=;
int n,m,u[],v[],A[],cnt;
int W[][];
map<int,int> M;
int find(int x) {
if(!M.count(x)) M[x]=++cnt,A[cnt]=x;
return M[x];
}
const int mod=;
int main() {
dwn(T,read(),) {
n=read();m=read();M.clear();cnt=;
rep(i,,) rep(j,,) W[i][j]=;
rep(i,,) W[i][i]=;
rep(i,,) u[i]=read(),v[i]=read(),W[find(u[i])][find(v[i])]=W[find(v[i])][find(u[i])]=;
rep(i,,cnt) rep(j,,cnt) W[i][j]=min(W[i][j],abs(A[i]-A[j]));
rep(k,,cnt) rep(i,,cnt) rep(j,,cnt) W[i][j]=min(W[i][j],W[i][k]+W[k][j]);
long long res=;
rep(i,,m) {
int x=read(),y=read(),ans=abs(x-y);
rep(k,,cnt) rep(j,,cnt) ans=min(ans,abs(A[k]-x)+abs(A[j]-y)+W[k][j]);
(res+=(long long)i*ans)%=mod;
}
printf("%I64d\n",res);
}
return ;
}
T2 Transform
x -> y <=> 0 -> x xor y
所以从0BFS一下就好了。
然后应该搜到[1,131072]。QAQ(AQ)*
#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
#include<queue>
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
using namespace std;
inline int read() {
int x=,f=;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-;
for(;isdigit(c);c=getchar()) x=x*+c-'';
return x*f;
}
const int maxn=;
const int mod=;
typedef long long ll;
int n,m,A[maxn],vis[maxn],d[maxn];
queue<int> Q;
void bfs() {
memset(vis,,sizeof(vis));d[]=;vis[]=;Q.push();
while(!Q.empty()) {
int x=Q.front();Q.pop();
rep(i,,) {
int v=x^(<<i);
if(v<=&&!vis[v]) {
vis[v]=;d[v]=d[x]+;Q.push(v);
}
}
rep(i,,n) {
int v=x^A[i];
if(v<=&&!vis[v]) {
vis[v]=;d[v]=d[x]+;Q.push(v);
}
}
}
}
int main() {
dwn(T,read(),) {
n=read();m=read();
rep(i,,n) A[i]=read();
bfs();ll ans=;
rep(i,,m) (ans+=(ll)i*d[read()^read()])%=mod;
printf("%I64d\n",ans);
}
return ;
}
T3 Toposort
我们逐位考虑,那么我们需要一个数据结构完成这样的功能。
1.找到当前权值<=k的最小节点。
2.将一个节点的权值-1。
显然线段树就行了。
我懒得写线段树,于是STL大法好。
用一个堆来维护一下在某次操作前权值<=k的节点,不行就把它踢出去。
然后拓扑的时候再判判能不能扔到堆里。
因为最多有n+m个节点进入堆,所以时间复杂度为O((n+m)logn)。
#include<cstdio>
#include<cstring>
#include<cctype>
#include<queue>
#include<algorithm>
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
using namespace std;
inline int read() {
int x=,f=;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-;
for(;isdigit(c);c=getchar()) x=x*+c-'';
return x*f;
}
const int mod=;
const int maxn=;
const int maxm=;
typedef long long ll;
int n,m,k,first[maxn],Next[maxm],to[maxm],in[maxn],is[maxn],e;
void AddEdge(int u,int v) {
to[++e]=v;Next[e]=first[u];first[u]=e;in[v]++;
}
int main() {
dwn(T,read(),) {
n=read();m=read();k=read();
rep(i,,n) in[i]=first[i]=is[i]=;e=;
rep(i,,m) {
int u=read(),v=read();
AddEdge(u,v);
}
priority_queue<int> Q;
rep(i,,n) if(in[i]<=k) is[i]=,Q.push(-i);
ll ans=;
rep(j,,n) {
int x;
while(Q.size()) {
x=-Q.top();Q.pop();is[x]=;
if(in[x]<=k) break;
}
(ans+=(ll)j*x)%=mod;k-=in[x];in[x]=;is[x]=;
for(int i=first[x];i;i=Next[i]) if(in[to[i]]) {
in[to[i]]--;
if(in[to[i]]<=k&&!is[to[i]]) is[to[i]]=,Q.push(-to[i]);
}
}
printf("%I64d\n",ans);
}
return ;
}
T4 Deletion
比赛时并没有想出来QAQ(AQ)*
这道题想法很妙,考虑题目说的“要求选出来的边构成的子图的每个连通块最多只有一个环”其实就是环套树。
而如果对一个无向图进行定向,满足所有节点的出边最多只有1,那么这个无向图可以一次选出。
所以问题转化成对一个无向图进行定向,让出边最多的节点出度最少,那么二分答案后就是一个分配模型了。
#include<cstdio>
#include<cctype>
#include<queue>
#include<cstring>
#include<algorithm>
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define ren for(int i=first[x];i!=-1;i=Next[i])
using namespace std;
typedef long long ll;
inline int read() {
int x=,f=;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-;
for(;isdigit(c);c=getchar()) x=x*+c-'';
return x*f;
}
const int maxn=;
const int maxm=;
const int inf=1e9;
struct Dinic {
int n,m,s,t,first[maxn],Next[maxm];
void init(int n) {
m=;this->n=n;
memset(first,-,sizeof(first));
}
struct Edge {int from,to,flow;}edges[maxm];
void AddEdge(int u,int v,int w) {
edges[m]=(Edge){u,v,w};Next[m]=first[u];first[u]=m++;
edges[m]=(Edge){v,u,};Next[m]=first[v];first[v]=m++;
}
int d[maxn],vis[maxn],cur[maxn];
int BFS() {
memset(vis,,sizeof(vis));
queue<int> Q;Q.push(s);vis[s]=;
while(!Q.empty()) {
int x=Q.front();Q.pop();cur[x]=first[x];
ren {
Edge& e=edges[i];
if(!vis[e.to]&&e.flow) {
vis[e.to]=;
d[e.to]=d[x]+;
Q.push(e.to);
}
}
}
return vis[t];
}
int DFS(int x,int a) {
if(x==t||!a) return a;
int flow=,f;
for(int& i=cur[x];i!=-;i=Next[i]) {
Edge& e=edges[i];
if(d[e.to]==d[x]+&&(f=DFS(e.to,min(a,e.flow)))) {
e.flow-=f;edges[i^].flow+=f;
a-=f;flow+=f;if(!a) break;
}
}
return flow;
}
int solve(int s,int t) {
this->s=s;this->t=t;int flow=;
while(BFS()) flow+=DFS(s,inf);
return flow;
}
}sol;
int n,m,u[maxn],v[maxn];
int check(int x) {
int s=n+m+,t=n+m+;sol.init(t);
rep(i,,n) sol.AddEdge(s,i,x);
rep(i,,m) sol.AddEdge(i+n,t,);
rep(i,,m) sol.AddEdge(u[i],i+n,),sol.AddEdge(v[i],i+n,);
return sol.solve(s,t)==m;
}
void solve() {
n=read();m=read();
rep(i,,m) u[i]=read(),v[i]=read();
if(!m) {puts("");return;}
int l=,r=m,mid;
while(l<r) if(check(mid=l+r>>)) r=mid; else l=mid+;
printf("%d\n",l);
}
int main() {
dwn(T,read(),) solve();
return ;
}
BestCoder Round #74的更多相关文章
- hdu5635 BestCoder Round #74 (div.2)
LCP Array Accepts: 131 Submissions: 1352 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 13 ...
- hdu 5636 搜索 BestCoder Round #74 (div.2)
Shortest Path Accepts: 40 Submissions: 610 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: ...
- bestcoder round 74 div2
随便看了一场以前的bestcoder,然后顺便写了一下,都不码的样子 有中文题面,这里就不写题目大意了 T1. 刚开始想复杂了,T1可能是4道题里面想的最久的 我们大概弄一下就可以发现,如果a[i]& ...
- BestCoder Round #74 (div.2)
组合 1001 LCP Array 第一题就小难,出题的好像是浙大的大牛? 找到一个规律:a[i] = x, s[i..i+x]都想同.a[i] = a[i+1] + 1 (a[i] > 0), ...
- hdu 5637 BestCoder Round #74 (div.2)
Transform Accepts: 7 Submissions: 49 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072 ...
- BestCoder Round #74 (div.1) 1002Shortest Path(hdoj5636)
哈哈哈哈,我就知道这道题目再扔给我,我还是不会,就是这么菜,哈哈哈 一开始官方题解就没搞懂-然后就看了一下别人的代码,水水过就算了.今天拿到-GG: 题意: 一开始,有一张原图,有一条长度为n的链. ...
- HDU5638 / BestCoder Round #74 (div.1) 1003 Toposort 线段树+拓扑排序
Toposort 问题描述 给出nn个点mm条边的有向无环图. 要求删掉恰好kk条边使得字典序最小的拓扑序列尽可能小. 输入描述 输入包含多组数据. 第一行有一个整数TT, 表示测试数据组数. 对 ...
- Bestcoder round #65 && hdu 5592 ZYB's Premutation 线段树
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submissio ...
- hdu5634 BestCoder Round #73 (div.1)
Rikka with Phi Accepts: 5 Submissions: 66 Time Limit: 16000/8000 MS (Java/Others) Memory Limit: ...
随机推荐
- 南洋理工 OJ 115 城市平乱 dijstra算法
城市平乱 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 南将军统领着N个部队,这N个部队分别驻扎在N个不同的城市. 他在用这N个部队维护着M个城市的治安,这M个城市 ...
- 基础知识《零》---Java程序运行机制及运行过程
Java运行机制 Java虚拟机(Java Virtual Machine):Java虚拟机可以理解成一个以字节码为机器指令的CPU:对于不同的运行平台,有不同的虚拟机:Java虚拟机机制屏蔽了底层运 ...
- javascript的事件监听与捕获和冒泡
在前端开发中,我们经常需要对某些事件进行监听.这样只要在指定的元素上触发了该事件,就会执行一个回调来进行相关的操作. 而js中事件监听方法总共有三种,分别如下所示: element.addEventL ...
- 21.左旋转字符串[LeftRotateString]
[题目] 定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部.如把字符串AB1234 左旋转2位得到字符串1234AB.请实现字符串左旋转的函数.要求时间对长度为n的字符串操作的复杂度 ...
- 【转】Linux Shell脚本调试技术
本文转载自:https://www.ibm.com/developerworks/cn/linux/l-cn-shell-debug/ Shell脚本调试技术 本文全面系统地介绍了shell脚本调试技 ...
- iOS 中不同的modalPresentationStyle对parent view 的影响
今天写程序时,突然发现当 用 UIModalPresentationPageSheet 弹出一个controller时,parrent view的viewWillDisappear 不会调用.而当用默 ...
- BM算法 Boyer-Moore高质量实现代码详解与算法详解
Boyer-Moore高质量实现代码详解与算法详解 鉴于我见到对算法本身分析非常透彻的文章以及实现的非常精巧的文章,所以就转载了,本文的贡献在于将两者结合起来,方便大家了解代码实现! 算法详解转自:h ...
- HDU 3835 R(N)
R(N) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- ios 7.1.2 拍照声音
打开进入文件系统(越狱)目录:/System/Library/Frameworks/MediaToolbox.framework , 重命名文件 RegionalSystemSoundsThatSha ...
- 山峰(codevs 1531)
1531 山峰 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description Rocky山脉有n个山峰,一字排开,从 ...