T1转圈游戏

十月のsecret

题解:快速幂

代码:

#include<iostream>
#include<cstring>
#include<cstdio>
#define LL long long
using namespace std; int n,m,k,x; void read(int &x){
char ch=getchar();x=;int f=;
for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';
x=x*f;
} LL ksm(int x,int y){
LL ret=%n;
while(y){
if(y&)ret=ret*x%n;
x=x*x%n;
y>>=;
}
return ret;
} int main(){
freopen("circle.in","r",stdin);
freopen("circle.out","w",stdout);
read(n);read(m);read(k);read(x);
cout<<(x%n+m*ksm(,k)%n)%n<<endl;
fclose(stdin);fclose(stdout);
return ;
}

AC

T2火柴排队

十月のsecret

题解:逆序对

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 100009
#define mod 99999997
using namespace std; int ans,n,c[maxn],tree[maxn]; struct F{
int h,id;
}a[maxn],b[maxn]; void read(int &x){
char ch=getchar();x=;int f=;
for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';
x=x*f;
} bool cmp(F a,F b){
return a.h<b.h;
} int lowbit(int x){
return x&(-x);
} void add(int x){
while(x<=n){
tree[x]++;
x+=lowbit(x);
}
} int sum(int x){
int ret=;
while(x){
ret+=tree[x];
x-=lowbit(x);
}
return ret;
} int main(){
freopen("match.in","r",stdin);
freopen("match.out","w",stdout);
read(n);
for(int i=;i<=n;i++)read(a[i].h),a[i].id=i;
for(int i=;i<=n;i++)read(b[i].h),b[i].id=i;
sort(a+,a+n+,cmp);sort(b+,b+n+,cmp);
for(int i=;i<=n;i++)c[a[i].id]=b[i].id;
for(int i=;i<=n;i++){
add(c[i]);
ans=(ans%mod+(i-sum(c[i])%mod)%mod);
}
cout<<ans<<endl;
fclose(stdin);fclose(stdout);
return ;
}

AC

T3货车运输

十月のsecret

题解:最大生成树+kruskal重构树

#include<iostream>
#include<cstdio>
#include<algorithm>
#define maxn 100009
#define maxm 500009
using namespace std; int n,m,tot,sumedge,nn,qx;
int head[maxn],dad[maxn],deep[maxn],size[maxn],top[maxn],w[maxn],fa[maxn]; struct E{
int x,y,z;
}e[maxm]; struct Edge{
int x,y,nxt;
Edge(int x=,int y=,int nxt=):
x(x),y(y),nxt(nxt){}
}edge[maxn<<]; void add(int x,int y){
edge[++sumedge]=Edge(x,y,head[x]);
head[x]=sumedge;
} bool cmp(E a,E b){
return a.z>b.z;
} int f(int x){
fa[x]==x?x:fa[x]=f(fa[x]);
} void dfs(int x){
size[x]=;deep[x]=deep[dad[x]]+;
for(int i=head[x];i;i=edge[i].nxt){
int v=edge[i].y;
if(v==dad[x])continue;
dad[v]=x;
dfs(v);
size[x]+=size[v];
}
} void dfs_(int x){
int s=;
if(!top[x])top[x]=x;
for(int i=head[x];i;i=edge[i].nxt){
int v=edge[i].y;
if(v!=dad[x]&&size[v]>size[s])s=v;
}
if(s){
top[s]=top[x];
dfs_(s);
}
for(int i=head[x];i;i=edge[i].nxt){
int v=edge[i].y;
if(v!=dad[x]&&v!=s)dfs_(v);
}
} int lca(int x,int y){
for(;top[x]!=top[y];){
if(deep[top[x]]>deep[top[y]])swap(x,y);
y=dad[top[y]];
}
if(deep[x]>deep[y])return w[y];
return w[x];
} int main(){
freopen("truck.in","r",stdin);
freopen("truck.out","w",stdout);
scanf("%d%d",&n,&m);nn=n;
for(int i=;i<=m;i++)scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].z);
sort(e+,e+m+,cmp);for(int i=;i<=n;i++)fa[i]=i;
for(int i=;i<=m;i++){
int fx=f(e[i].x),fy=f(e[i].y);
if(fx!=fy){
nn++;w[nn]=e[i].z;
add(fx,nn);add(nn,fx);
add(fy,nn);add(nn,fy);
fa[nn]=nn;fa[fx]=nn;fa[fy]=nn;
if(++tot==n-)break;
}
}
dfs(nn);dfs_(nn);
scanf("%d",&qx);
for(int i=;i<=qx;i++){
int x,y;
scanf("%d%d",&x,&y);
if(f(x)!=f(y))printf("-1\n");
else printf("%d\n",lca(x,y));
}
fclose(stdin);fclose(stdout);
return ;
}

AC

树链剖分

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define inf 100000000
#define maxn 10009
using namespace std; int n,m,q,sumedge,cnt,tot,qx;
int head[maxn],dad[maxn],deep[maxn],size[maxn],fe[maxn];
int w[maxn],top[maxn],re[maxn],tpos[maxn],fa[maxn];
struct E{
int x,y,z;
}e[maxn*];
struct Tree{
int l,r,mn;
}tr[maxn<<]; struct Edge{
int x,y,z,nxt;
Edge(int x=,int y=,int z=,int nxt=):
x(x),y(y),z(z),nxt(nxt){}
}edge[maxn<<]; void add(int x,int y,int z){
edge[++sumedge]=Edge(x,y,z,head[x]);
head[x]=sumedge;
} bool cmp(E a,E b){
return a.z<b.z;
} int f(int x){
return fa[x]==x?x:fa[x]=f(fa[x]);
} void dfs(int x){
size[x]=;deep[x]=deep[dad[x]]+;
for(int i=head[x];i;i=edge[i].nxt){
int v=edge[i].y;
if(v==dad[x])continue;
dad[v]=x;
dfs(v);
size[x]+=size[v];
}
} void dfs_(int x,int v){
int s=,t=;tpos[x]=++cnt;re[cnt]=x;fe[x]=v;
if(!top[x])top[x]=x;
for(int i=head[x];i;i=edge[i].nxt){
int v=edge[i].y;
if(v!=dad[x]&&size[v]>size[s])s=v,t=edge[i].z;
}
if(s){
top[s]=top[x];
dfs_(s,t);
}
for(int i=head[x];i;i=edge[i].nxt){
int v=edge[i].y;
if(v!=dad[x]&&v!=s)dfs_(v,edge[i].z);
}
} int lca(int x,int y){
for(;top[x]!=top[y];){
if(deep[top[x]]>deep[top[y]])swap(x,y);
y=dad[top[y]];
}
if(deep[x]>deep[y])return y;
return x;
} void pushup(int rt){
tr[rt].mn=min(tr[rt<<].mn,tr[rt<<|].mn);
} void build(int rt,int l,int r){
tr[rt].l=l;tr[rt].r=r;
if(l==r){
tr[rt].mn=fe[re[l]];
return ;
}
int mid=(l+r)>>;
build(rt<<,l,mid);build(rt<<|,mid+,r);
pushup(rt);
} int query(int rt,int l,int r,int ql,int qr){
if(l>=ql&&r<=qr){
return tr[rt].mn;
}
int ans=inf,mid=(l+r)>>;
if(ql<=mid)ans=min(ans,query(rt<<,l,mid,ql,qr));
if(qr>mid)ans=min(ans,query(rt<<|,mid+,r,ql,qr));
return ans;
} int query_mn(int x,int y){
int ret=inf;
for(;top[x]!=top[y];){
if(deep[top[x]]>deep[top[y]])swap(x,y);
ret=min(ret,query(,,n,tpos[top[y]],tpos[y]));
y=dad[top[y]];
}
if(deep[x]>deep[y])swap(x,y);
ret=min(ret,query(,,n,tpos[x]+,tpos[y]));
printf("%d\n",ret);
} int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].z);
for(int i=;i<=n;i++)fa[i]=i;
sort(e+,e+m+,cmp);
for(int i=m;i>=;i--){
int x=e[i].x,y=e[i].y;
int fx=f(x),fy=f(y);
if(fx!=fy){
fa[fx]=fy;tot++;
add(x,y,e[i].z);
add(y,x,e[i].z);
if(tot==n-) break;
}
}
for(int i=;i<=n;i++){
if(size[i]==){
dfs(i);dfs_(i,);
}
}
build(,,n);
scanf("%d",&qx);
for(int i=;i<=qx;i++){
int x,y;
scanf("%d%d",&x,&y);
if(f(x)!=f(y))printf("-1\n");
else
query_mn(x,y);
}
return ;
}

AC

NOIP2013DAY1题解的更多相关文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  9. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

随机推荐

  1. 20145219 《Java程序设计》第04周学习总结

    20145219 <Java程序设计>第04周学习总结 教材学习内容总结 继承 继承就是避免多个类间重复定义共同行为. 面向对象中,子类继承父类,就是把程序中相同的代码部分提升为父类. R ...

  2. tinyxml优化之一

    原文链接:http://www.cnblogs.com/zouzf/p/4154569.html 最近在搞XML解析优化,公司引擎用了tinyxml1和tinyxml2两个XML库,后者的效率比前者高 ...

  3. Linux图形化界面下使用命令进行截图的方法

    以前在LINUX里面截图都是直接按print screen键或者 alt + print screen. 但是print screen是整个屏幕, alt + print screen是当前窗口. 想 ...

  4. JAVA基础补漏--内部类

    成员内部类 public class InnerClass { public static void main(String[] args) { System.out.println("++ ...

  5. sem学习

    关键字的选取搜索引擎营销的关键字选取是非常重要的一步,合适的关键字可以为企业带来可观的咨询量.关键字一般分4种,品牌词,产品词,行业词,竞品词,对于这四类词不同的推广策略有着不同的侧重点,根据市场情况 ...

  6. java中HashMap集合的常用方法

    public Object clone() 返回hashMap集合的副本 其余的方法都是实现Map集合的 https://www.cnblogs.com/xiaostudy/p/9510763.htm ...

  7. Java值传递还是引用传递?

    回顾: 在程序设计语言中,将参数传递分为按值调用和按引用调用.按值调用:表示方法接收的是调用者提供的值.而按引用调用表示方法接收的是调用者提供的变量地址.一个方法可以修改传递引用所对应的变量值,而不能 ...

  8. JNI_Z_04_属性的操作(非String类型的属性)

    1.步骤 : (1).获取 jclass (2).获取 类属性字段的id(最后一个参数是 属性字段 的签名) (3).获取/设置 类属性字段的值 ZC: 貌似 JNI里面 操作 类属性字段,完全是 无 ...

  9. define用于条件编译

    格式: #ifndef _test.h_ //这里放不想被重复包含的代码 #define _test.h_ #endif define用于条件编译的意思是不想让头文件重复编译,头文件重复编译会造成的结 ...

  10. 英语发音规则---A字母

    英语发音规则---A字母 一.总结 一句话总结:本文所有//的音标为英音音标,[]的音标为美音音标 1.A在开音节中发/eɪ/ [e]? age /eɪdʒ/ [edʒ] 年龄 ape /eɪp/ [ ...