[原博客] POI系列(1)
正规、严谨、精妙。 -POI
发现POI(波兰信息学奥赛)的题都很有意思。于是开刷bzoj上的poi题目(按ac人数降序。。)。顺手写一写题解,加深印象。
为了防止一篇文章过于长,打算每五道题另起一篇文章。
BZOJ 1103 : [POI2007]大都市meg
给一棵树,每次可以把树上的一些边标记了,问一个点与根之间需要走多少没有标记的边。
这个可以把这颗树遍历得到一个dfs序每第一次经过一个点的时候记录为+1,第二次经过一个点的时候记录为-1,然后记录每个点第一次经过时在序列里的位置f[i]和第二次经过在序列里的位置l[i],对于查询(x)就是序列中一直到f[x]-1的前缀和,因为真正没走的那些边都+1-1消掉了,只剩下真正要统计的边了。对于每次标记(a,b) 设a<b 就是序列里 f[b]的位置-1,l[b]的位置+1,就相当于消掉了这条边。另外这道题得手写栈dfs,否则会爆栈。
/**************************************************************
Problem: 1103
User: zrts
Language: C++
Result: Accepted
Time:4484 ms
Memory:9596 kb
****************************************************************/
#include<cstdio>
#include<cstring>
#include<algorithm>
#define lowbit(x) (x&-x)
//by zrt
//problem:
using namespace std;
typedef long long ll;
);
int n,m;
];
],P[],X[],tot;
],l[];
];
int tim;
],top;
void add(int pos,int x){
for(;pos<=n;pos+=lowbit(pos)){
c[pos]+=x;
}
}
int ask(int pos){
;
;pos-=lowbit(pos)){
ret+=c[pos];
}
return ret;
}
inline void Add(int x,int y){
P[++tot]=y;X[tot]=H[x];H[x]=tot;
}
int main(){
#ifdef LOCAL
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
scanf("%d",&n);
,x,y;i<n;i++){
scanf("%d%d",&x,&y);
if(x<y) Add(x,y);
else Add(y,x);
}
stk[top++]=;
int k;
){
k=stk[--top];
if(f[k]){
l[k]=++tim;
c[tim]=-;
continue;
}else{
f[k]=++tim;
c[tim]=;
stk[top++]=k;
for(int i=H[k];i;i=X[i]){
stk[top++]=P[i];
}
continue;
}
}
n*=;
;i<n;i++){
if(i+lowbit(i)<=n){
c[i+lowbit(i)]+=c[i];
}
}
scanf("%d",&m);
m=n/+m-;
,x,y;i<m;i++){
scanf("%s",s);
]=='W'){
scanf("%d",&x);
printf();
}else{
scanf("%d%d",&x,&y);
if(x>y){
add(f[x],-);
add(l[x],);
}else{
add(f[y],-);
add(l[y],);
}
}
}
;
}
BZOJ 1121 : [POI2008]激光发射器SZK
刚看完觉得不可做。
因为光线都是沿45°,所以从一个点发射光线必有一个点接收,又因为光路是可逆的,不可能有不同的点出发的光路重合的现象,所以输出n/2(原题让输出方案。。);
/**************************************************************
Problem: 1121
User: zrts
Language: C++
Result: Accepted
Time:0 ms
Memory:804 kb
****************************************************************/
#include<cstdio>
#include<cstring>
#include<algorithm>
//by zrt
//problem:
using namespace std;
typedef long long ll;
);
int main(){
#ifdef LOCAL
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
int n;
scanf("%d",&n);
printf();
;
}
BZOJ 1113 : [Poi2008]海报PLA
显然单调栈啊,相等的时候处理一下。没了。
/**************************************************************
Problem: 1113
User: zrts
Language: C++
Result: Accepted
Time:1496 ms
Memory:1780 kb
****************************************************************/
#include<cstdio>
#include<cstring>
#include<algorithm>
//by zrt
//problem:
using namespace std;
typedef long long ll;
);
],top;
int main(){
#ifdef LOCAL
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
int n;
scanf("%d",&n);
;
,x;i<n;i++){
scanf("%*d%d",&x);
&&x<=stk[top-]) {
top--,ans++;
if(stk[top]==x) ans--;
}
stk[top++]=x;
}
printf("%d\n",ans+top);
;
}
BZOJ 1529 : [POI2005]ska Piggy banks
一堆存钱罐,每个存钱罐的钥匙在另一个存钱罐里,问最少砸烂多少个存钱罐。
如果A罐的钥匙在B罐里,我们连边B->A,表示只要开了B就能开A。然后得到一张无向图,显然在一个强连通分量中的罐子最多只用砸烂一个,而每个强连通分量的罐子有可能被别的强连通分量的罐子打开,所以将这张图缩点,得到一个DAG,显然我们只用砸那些入度为0的强连通分量并且每个分量砸一个就ok了,也就是DAG的叶子节点。
(原来tarjan中,dfn没有记录的必要啊,详见程序。)
/**************************************************************
Problem: 1529
User: zrts
Language: C++
Result: Accepted
Time:2316 ms
Memory:63620 kb
****************************************************************/
#include<cstdio>
#include<cstring>
#include<algorithm>
//by zrt
//problem:
using namespace std;
typedef long long ll;
);
int n;
],X[],P[],tot;
inline void add(int x,int y){
P[++tot]=y;X[tot]=H[x];H[x]=tot;
}
],stk[],top;
];
int cnt;
];
void tarjan(int x){
int dfn=low[x]=++tim;
instack[x]=;stk[top++]=x;
for(int i=H[x];i;i=X[i]){
if(!low[P[i]]) tarjan(P[i]),low[x]=min(low[x],low[P[i]]);
else if(instack[P[i]]) low[x]=min(low[x],low[P[i]]);
}
if(low[x]==dfn){
cnt++;
int k;
do{
k=stk[--top];
instack[k]=;
belong[k]=cnt;
}while(k!=x);
}
}
];
int main(){
#ifdef LOCAL
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
scanf("%d",&n);
,x;i<=n;i++){
scanf("%d",&x);
add(x,i);
}
;i<=n;i++){
if(!low[i]) tarjan(i);
}
;i<=n;i++){
for(int j=H[i];j;j=X[j]){
;
}
}
;
;i<=cnt;i++){
if(!ind[i]) ot++;
}
printf("%d\n",ot);
;
}
BZOJ 1532 : [POI2005]Kos-Dicing
网络流里这个模型太熟了。
首先求最大值最小先二分,然后判定是否可以相互制约使得都在ans场内决出冠军。具体连边就是S向每场比赛连边容量为1,每场比赛向两个人分别连边,容量1。然后每个人向T连边,容量为ans。看看最大流S是否满载。搞定。
/**************************************************************
Problem: 1532
User: zrts
Language: C++
Result: Accepted
Time:576 ms
Memory:2764 kb
****************************************************************/
#include<cstdio>
#include<cstring>
#include<algorithm>
//by zrt
//problem:
using namespace std;
typedef long long ll;
);
int n,m;
],X[],P[],flow[],d[],tot;
],h,t;
],b[];
int S,T;
inline void add(int x,int y,int z){
P[++tot]=y;X[tot]=H[x];H[x]=tot;flow[tot]=z;
}
bool bfs(){
memset(d,,;
d[S]=;q[t++]=S;
int k;
while(h!=t){
k=q[h++];
for(int i=H[k];i;i=X[i]){
&&(!d[P[i]])){
q[t++]=P[i];
d[P[i]]=d[k]+;
}
}
}
return d[T];
}
int dfs(int x,int a){
||x==T) return a;
int f=a,tmp;
for(int i=H[x];i&&a;i=X[i]){
&&flow[i]>){
tmp=dfs(P[i],min(a,flow[i]));
a-=tmp;
flow[i]-=tmp;
flow[i^]+=tmp;
}
}
;
return f-a;
}
int dinic(){
);
while(bfs()){
f+=dfs(S,<<);
}
return f;
}
bool judge(int x){
memset(H,,;
;i<m;i++){
add(S,i,);add(i,S,);
add(i,a[i]+m,);add(a[i]+m,i,);
add(i,b[i]+m,);add(b[i]+m,i,);
}
;i<=n;i++) add(i+m,T,x),add(T,i+m,);
if(dinic()>=m) return true;
else return false;
}
int main(){
#ifdef LOCAL
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
scanf("%d%d",&n,&m);
;i<m;i++){
scanf("%d%d",&a[i],&b[i]);
}
),R(m),M;
S=,T=;
){
M=(L+R)>>;
if(judge(M)){
R=M;
}else L=M;
}
printf("%d\n",R);
;
}
以上。
[原博客] POI系列(1)的更多相关文章
- [原博客] POI系列(3)
正规.严谨.精妙. -POI BZOJ 1131 : [POI2008]Sta 树形dp吧,让求找一个点使以这个点深度和最小.首先可以随便整出来一棵树,对于每个节点记录down[i]以i为根下面的点的 ...
- [原博客] POI系列(5)
正规.严谨.精妙. -POI BZOJ 2213 : [Poi2011]Difference 如果我们每次枚举两个字母最大最小情况时,很容易想到写出代码里注释的样子.这样是26*26*n的,我们发现枚 ...
- [原博客] POI系列(4)
正规.严谨.精妙. -POI BZOJ 1531 : [POI2005]Bank notes 裸的背包,可以二进制拆分一下.一个物品比如说有n个,可以拆成 1,2,4,8,16...个. OJ上没有样 ...
- [原博客] POI系列(2)
正规.严谨.精妙. -POI bzoj 1098 : [POI2007]办公楼biu 如果把互相有手机号的建边得到一个无向图,那么这个图的补图的连通分量个数就是答案了.因为互相没手机号的必然在同一个连 ...
- 原博客地址http://blog.chinaunix.net/uid/20656672.html弃用
原博客地址http://blog.chinaunix.net/uid/20656672.html弃用
- [原博客] BZOJ 2242 [SDOI2011] 计算器
题目链接 noip级数论模版题了吧.让求三个东西: 给定y,z,p,计算`Y^Z Mod P` 的值. 给定y,z,p,计算满足`xy≡ Z ( mod P )`的最小非负整数. 给定y,z,p,计算 ...
- 【全网最全的博客美化系列教程】08.自定义地址栏Logo
全网最全的博客美化系列教程相关文章目录 [全网最全的博客美化系列教程]01.添加Github项目链接 [全网最全的博客美化系列教程]02.添加QQ交谈链接 [全网最全的博客美化系列教程]03.给博客添 ...
- 原博客地址http://blog.chinaunix.net/uid/20656672.html不再维护(10年前数百篇oracle/teradata性能优化、故障处理案例)
原博客地址http://blog.chinaunix.net/uid/20656672.html不再维护(数百篇oracle/teradata性能优化.故障处理原创文章) 858871 top 500 ...
- 【全网最全的博客美化系列教程】01.添加Github项目链接
全网最全的博客美化系列教程相关文章目录 [全网最全的博客美化系列教程]01.添加Github项目链接 [全网最全的博客美化系列教程]02.添加QQ交谈链接 [全网最全的博客美化系列教程]03.给博客添 ...
随机推荐
- 解锁Dagger2使用姿势(二) 之带你理解@Scope
关于Dagger2使用的基础如果你还不了解,可以参考我的上一篇文章解锁Dagger2使用姿势(一),这有助于你理解本篇文章. OK,我们在上篇文章介绍另外Dagger2使用过程中四个基本的注解,分别是 ...
- ArcPy 函数列表(按字母顺序)
Function name Category AddError Messages and error handling AddFieldDelimiters Fields AddIDMessage M ...
- 从数组中随机取n条不重复的数据
工作中经常遇到有关数组的一些操作 1. 从数据中随机取n条不重复的数据 (PS:下面的S.each是KISSY.each方法,大家可以改为for循环) /* 1 从数组arr中随机取n条不重复的数据 ...
- Linux基础1之磁盘与分区
Linux上面设备皆文件,目前需要知道的,比如U盘和SARA硬盘的在Linux上面的文件名,/dev/sd[a-p].与IDE接口不同的是,SATA/USB接口的磁盘没有一定的顺序,这里就根据Linu ...
- Solr使用初探——SolrJ的使用
二.SolrJ的使用 SolrJ覆盖了solr的全部功能,下面将自己在实际开发中所使用的程序粘贴出来并适当加以解释,由于本人比较菜,代码书写不是那么的精练,还请见谅. 1. 创建solrserver ...
- ios fixed属性bug解决方法
在内容层外面包一个div 加上样式:position:fixed;top:0px; bottom:50px;overflow:scroll; 就可以完美解决
- Fxcop 初体验
代码质量对于软件项目的成败很重要,这点我想大家都明白.那么在一个软件团队中如何保证代码质量呢?对于这个问题不同的人可能会有不同的答案,对于我而言我觉得做好两点代码质量基本就可以保证了: 1.代码规范( ...
- mysql笔记之主从切换
一. 正常切换 1)从服务器检查SHOW PROCESSLIST语句的输出,直到你看到Has read all relaylogwaiting for the slave I/O thread to ...
- MyEclipse 多项目对应配置多个Tomcat
在MyEclipse的安装目录下,有D:\Program Files\MyEclipse 6.5\myeclipse\eclipse\plugins 的插件路径. 里边很多插件的配置文件包. 找到 ...
- IOS 学习笔记 2015-03-27 我理解的OC-代理模式
案例1 KCButton.h // // KCButton.h // Protocol&Block&Category // // Created by Kenshin Cui on 1 ...