NOIP2013DAY1题解
T1转圈游戏
题解:快速幂
代码:
- #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火柴排队
题解:逆序对
- #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货车运输
题解:最大生成树+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题解的更多相关文章
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
- CF100965C题解..
求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...
随机推荐
- 基于jQuery和Bootstrap的手风琴垂直菜单
在线演示 本地下载
- MySQL数据库表分区功能详解
1.什么是表分区? mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下面(可以通过my.cnf中的datadir来查看),一张表主要对应着三个文件,一个是frm存放表 ...
- Asp.net Core, 基于 claims 实现权限验证 - 引导篇
什么是Claims? 这个直接阅读其他大神些的文章吧,解释得更好. 相关文章阅读: http://www.cnblogs.com/JustRun1983/p/4708176.html http://w ...
- AtCoder Regular Contest 095
AtCoder Regular Contest 095 C - Many Medians 题意: 给出n个数,求出去掉第i个数之后所有数的中位数,保证n是偶数. \(n\le 200000\) 分析: ...
- 文件(2)--IO流
IO流 输入流和输出流 Java中的IO流根据功能划分为:输入流和输出流.输入流:用于读取数据.输出流:用于写出数据.输入输出的参照方向是根据我们的程序的. 字节流和字符流 Java中的IO流根据处理 ...
- SPFA算法 - Bellman-ford算法的进一步优化
2017-07-27 22:18:11 writer:pprp SPFA算法实质与Bellman-Ford算法的实质一样,每次都要去更新最短路径的估计值. 优化:只有那些在前一遍松弛中改变了距离点的 ...
- Service的理解
转自 原文 Service的理解 Service是什么?Service是一种可以在后台运行相关任务的组件.没有界面.其存在的线程是主线程,一般会通过启动子线程来执行耗时操作.Service有什么用?可 ...
- Java通过JDBC操作Hive
http://www.cnblogs.com/netbloomy/p/6688670.html 0.概述 使用的都是CLI或者hive –e的方式仅允许使用HiveQL执行查询.更新等操作.然而Hiv ...
- 转 : Java的版本特性与历史
Java Versions, Features and History This article gives you a highlight of important features added i ...
- Linux 设备驱动之 UIO 机制
一个设备驱动的主要任务有两个: 1. 存取设备的内存 2. 处理设备产生的中断 对于第一个任务.UIO 核心实现了mmap()能够处理物理内存(physical memory),逻辑内存(logica ...