链接:https://www.luogu.org/problem/lists?name=&orderitem=pid&tag=83%2C32

D1T1(magic)

题意:看题目。。

解题思路:纯模拟。。。

#include<stdio.h>
short f[][],n;
int main()
{
scanf("%d",&n);
int x=,y=n+>>;f[x][y]=;
for(int i=; i<=n*n; ++i){
if(x==&&y<n) x=n,++y;
else if(x>&&y==n) x--,y=;
else if(x==&&y==n) x++;
else if(!f[x-][y+])x--,y++;
else x++;
f[x][y]=i;
}
for(int i=; i<=n; i++){
printf("%d",f[i][]);
for(int j=; j<=n; j++)printf(" %d",f[i][j]);
putchar('\n');
}
return ;
}

D1T2(message)

题意:给你张图,找最小环。

解题思路:拓扑以后跑环即可。

#include <stdio.h>
#include<string.h>
#define MN 200005
#define inf 0x7fffffff
char B[<<],*S=B;
inline int in(){
for (;*S<''||*S>'';S++);
register int x=(*S++)-'';
for (;*S>=''&&*S<=''; x=(x<<)+(x<<)+(*S++)-'');
return x;
}
int r[MN],to[MN],que[MN],n,ans=inf,h,t;
void init(){fread(B,,<<,stdin);n=in();for (int i=; i<=n; ++i) to[i]=in(),++r[to[i]];}
inline void dfs(int s){
memset(que,,sizeof(que));
register int cnt=;que[s]=;--r[s];
while(!que[to[s]])
++cnt,--r[s=to[s]],que[s]=;;
ans=cnt<ans?cnt:ans;
}
void solve(){
for (register int i=; i<=n; ++i) if (!r[i]) que[++t]=i;
while(h<t){register int u=que[++h];--r[to[u]];if (!r[to[u]]) que[++t]=to[u];}
for (register int i=; i<=n; ++i) if (r[i]) dfs(i);
printf("%d",ans);
}
int main(){init();solve();return ;}

D1T3(landlords)

题意:就是简化版的斗地主。

解题思路:典型码农题,我们考虑dfs枚举各种顺的情况,然后贪心计算剩余的没有顺子的最小步数即可。

#include<stdio.h>
#include<string.h>
#define inf 0x7fffffff
int s[],a[],ans,n,T;
inline int min(int a,int b){return a<b?a:b;}
inline int in(){
int x=;char ch=getchar();
while(ch<''||ch>'') ch=getchar();
while(ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
return x;
}
inline int calc(){
register int cnt=;
a[]=a[]=a[]=a[]=;
for (register int i=; i<=; ++i) ++a[s[i]];
if (s[]&&s[]) ++cnt,a[]-=;
while(a[]&&a[]>) ++cnt,--a[],a[]-=;
while(a[]&&a[]>) ++cnt,--a[],a[]-=;
while(a[]&&a[]) ++cnt,--a[],--a[];
while(a[]&&a[]) ++cnt,--a[],--a[];
return cnt+a[]+a[]+a[]+a[];
}
inline void dfs(int k){
if (k>=ans) return;
ans=min(ans,k+calc());
register int j;
for (register int i=; i<; ++i){
j=i;
while(j<&&s[j]>){
s[j++]-=;
if (j-i>=) dfs(k+);
}
while(j-i)s[--j]+=;
}
for (register int i=; i<; ++i){
j=i;
while(j<&&s[j]>){
s[j++]-=;
if (j-i>=) dfs(k+);
}
while(j-i)s[--j]+=;
}
for (register int i=; i<; ++i){
j=i;
while(j<&&s[j]){
--s[j++];
if (j-i>=) dfs(k+);
}
while(j-i)++s[--j];
}
}
inline int getno(int x){
register int y=in();
if (!x) return y+;
if (x<) return x+;
return x-;
}
void work(){
memset(s,,sizeof(s));ans=inf;
for (register int i=; i<=n; ++i) ++s[getno(in())];
dfs();printf("%d\n",ans);
}
int main(){T=in();n=in();while(T--) work();return ;}

D2T1(stone)

题意:给你N个石头,问你拿走任意M块之后使得任意2点之间距离最小的最大是多少。

解题思路:正难则反,我们可以考虑给定最小的距离最大的值,如何求出拿走了多少块。显然这样只需要\(O(n)\)扫描一下即可,继续观察对于答案的递增,m会随之递增,故答案满足某种单调性,我们可以考虑二分答案+check解决此题,时间效率\(O(n \lg L)\)。

#include<stdio.h>
#define MN 50005
#define mid (l+r+1>>1)
int L,n,a[MN],m,l,r;
inline int in(){
int x=,f=;char ch=getchar();
while(ch<''||ch>'') f=ch=='-'?-:,ch=getchar();
while(ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
return x*f;
}
bool check(int l){
register int ans=,x=;
for (register int i=; i<=n; ++i)
if (a[i]-a[i-]+x<l) {
++ans;x+=a[i]-a[i-];
if (ans>m) return ;
}
else x=;
return ;
}
int main(){
L=in(),n=in(),m=in();
for (int i=; i<=n; ++i) a[i]=in();a[++n]=r=L;
for (; l<r; check(mid)?l=mid:r=mid-);
printf("%d",l);
}

D2T2(substring)

题意:给你一个原串A,和一个目标串B,叫你求A中任取K个不相交子串等于B串的方法数。

解题思路:十分难想的DP可以用前缀和优化一下,转移方程见std,理由就不写了,参考各路大神的标程吧。。。

#include<stdio.h>
#define ll long long
#define mod 1000000007
ll f[][]={},sum[][];
int n,m,kk;
char a[],b[];
int main(){
scanf("%d%d%d%s%s",&n,&m,&kk,a,b);
for(int i=; i<=n; ++i)
for(int j=m; j; --j)
for(int k=kk; k; --k)
f[j][k]=(f[j][k]+(sum[j][k]=a[i-]==b[j-]?sum[j-][k]+f[j-][k-]:))%mod;
printf("%d",f[m][kk]);
}

D2T3(transport)

题意:给你一棵有边权的树。你可以任选一条边令其边权为0,现在有m个东西以相同的速度从s[i]移到t[i],问你最后一个结束的时间最小是多少。

解题思路:首先,我们知道,题目给出了棵树,接下来,我们容易发现,对于一个任务,这个任务所需要花费的时间为dis[s]+dis[t]-dis[lca(s,t)]*2,接下来我们可以发现,题意只要求找出最小时间,显然答案是满足单调性的,因此我们可以二分答案,接下来考虑如何check。首先我们容易得知,对于所有任务花费时间大于mid的任务,必然存在一条公共边能够使得最大花费时间任务减去这条公共边的时间能够不大于mid,这样才能够保证mid是可行的,因此我们考虑差分然后O(n)遍历所有边计算出边的使用次数,对于满足公共边条件的边作如上判断即可。时间效率\(O((n+m) \lg ans)\)。

#include<stdio.h>
#include<string.h>
#include<algorithm>
#define MN 300005
#define mid (l+r>>1)
char B[<<],*S=B,C;int X;
inline int in(){
while((C=*S++)<''||C>'');
for(X=C-'';(C=*S++)>=''&&C<='';)X=(X<<)+(X<<)+C-'';
return X;
}
struct zxy{int to,nxt;}lk[MN<<];
struct e{int to,nxt,v;}edge[MN<<];
struct plans{int s,t,tim,lca;}plan[MN];
int sum[MN],dis[MN],n,m,cnt,q[MN],lc,h[MN],fa[MN],f[MN],ans,cf[MN];
inline void ins(int x,int y,int v){edge[++cnt].to=y,edge[cnt].nxt=h[x],edge[cnt].v=v,h[x]=cnt;}
inline void insq(int x,int y){lk[++lc].to=y,lk[lc].nxt=q[x],q[x]=lc;}
inline int getfa(int x){return fa[x]?fa[x]=getfa(fa[x]):x;}
inline bool cmp(plans a,plans b){return a.tim>b.tim;}
inline void tjlca(int u,int len){
dis[u]=len;
for (register int i=h[u]; i; i=edge[i].nxt)
if (edge[i].to!=f[u]) f[edge[i].to]=u,tjlca(edge[i].to,len+edge[i].v),fa[edge[i].to]=u;
for (register int i=q[u]; i; i=lk[i].nxt)
if (plan[lk[i].to].lca) plan[lk[i].to].lca=getfa(plan[lk[i].to].lca);
else plan[lk[i].to].lca=u;
}
inline void dfs(int u){
sum[u]=cf[u];
for (register int i=h[u]; i; i=edge[i].nxt)
if (edge[i].to!=f[u]){
dfs(edge[i].to),sum[u]+=sum[edge[i].to];
}
}
inline bool check(int max_time){
if (plan[].tim>max_time+) return ;
if (plan[].tim<=max_time)return ;
int cnt,max;cnt=max=;
memset(cf,,sizeof(cf));
for (register int i=; i<=m&&plan[i].tim>max_time; ++i) {
++cnt;max=plan[i].tim>max?plan[i].tim:max;
++cf[plan[i].t],++cf[plan[i].s],cf[plan[i].lca]-=;
}dfs();int p=;
for (register int i=; i<=n; ++i)
if (sum[i]==cnt&&dis[i]-dis[f[i]]>dis[p]-dis[f[p]]) p=i;
if (!p) return ;
return max-dis[p]+dis[f[p]]<=max_time;
}
void init(){//checked
fread(B,,<<,stdin);
n=in(),m=in();int x,y,v;
for (int i=; i<n; ++i){
x=in(),y=in(),v=in();
ins(x,y,v);ins(y,x,v);
}
for (register int i=; i<=m; ++i){
x=in(),y=in();
plan[i].s=x,plan[i].t=y;
insq(x,i);insq(y,i);
}
}
void solve(){
tjlca(,);
for (register int i=; i<=m; ++i)
plan[i].tim=dis[plan[i].s]+dis[plan[i].t]-(dis[plan[i].lca]<<);
std::sort(plan+,plan+m+,cmp);int l=,r=;
for (; l<=r; check(mid)?ans=mid,r=mid-:l=mid+);
printf("%d",ans);
}
int main(){init();solve();return ;}

【NOIP2015TG】solution的更多相关文章

  1. about家庭智能设备部分硬件模块功能共享【协同工作】solution

    本人设备列表: Onda tablet {Android} wifi Desktop computer {win7.centos7} 外接蓝牙adapter PS interface 键盘.鼠标{与同 ...

  2. 【leetcode】solution in java——Easy1

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6409067.html 1:Hamming distance The Hamming distance betw ...

  3. 【436】Solution for LeetCode Problems

    Coding everyday. ^_^ 1. Two Sum 重点知识:指针可以存储数值,通过 malloc 新建数组 int* returnSize:Size of the return arra ...

  4. 【NOIP2012TG】solution

    D1T1(Vigenere) 题意:给你一个原串与一个密码串,问你按照题意规则加密后的密文. 解题思路:暴力模拟. #include <stdio.h> ],c[],u1[],u2[]; ...

  5. 【NOIP2014TG】solution

    链接:https://www.luogu.org/problem/lists?name=&orderitem=pid&tag=83|31 D1T1(rps) 题意:给你一个周期,以及胜 ...

  6. 【NOIP2016TG】solution

    传送门:https://www.luogu.org/problem/lists?name=&orderitem=pid&tag=83%7C33 D1T1(toys) 题意:有n个小人, ...

  7. 【NOIP2013TG】solution

    链接:https://www.luogu.org/problem/lists?name=&orderitem=pid&tag=83%2C30 D1T1:转圈游戏(circle) 题意: ...

  8. 【NOIP2011TG】solution

    老师最近叫我把NOIPTG的题目给刷掉,于是就开始刷吧= = 链接:https://www.luogu.org/problem/lists?name=&orderitem=pid&ta ...

  9. 【leetcode】solution in java——Easy5

    转载请注明原文地址: 21:Assign Cookies Assume you are an awesome parent and want to give your children some co ...

随机推荐

  1. 项目Beta冲刺预热

    Beta准备 1. 讨论组长是否重选的议题和结论. 经过讨论,我们认为,经过一段时间的磨合,现任组长是不需要更换的. 2. 下一阶段需要改进完善的功能. 增加关于征信的功能,贴近选题主题 美化界面,尽 ...

  2. ajax 返回Json方法

    public static void sendJsonData(String data) { ActionContext ac = ActionContext.getContext(); HttpSe ...

  3. Linux kernel 的 sendfile 是如何提高性能的

    Linux kernel 的 sendfile 是如何提高性能的 现在流行的 web 服务器里面都提供 sendfile 选项用来提高服务器性能,那到底 sendfile 是什么,怎么影响性能的呢? ...

  4. Swift - 使用导航条和导航条控制器来进行页面切换并传递数据

    转自:http://www.hangge.com/blog/cache/detail_586.html

  5. 面试必问---HashMap原理分析

    一.HashMap的原理 众所周知,HashMap是用来存储Key-Value键值对的一种集合,这个键值对也叫做Entry,而每个Entry都是存储在数组当中,因此这个数组就是HashMap的主干.H ...

  6. ebtables和iptables与linux bridge的交互

    本文为翻译文,不一定是逐字逐句的翻译,而且中间会加上自己的一点见解,如有理解错误的地方,还请大家指出,我定虚心学习.原文见链接 其中斜体字是自己的理解,建议和ebtables手册和iptables手册 ...

  7. zookeeper 入门系列-理论基础 – zab 协议

    上一章讨论了paxos算法,把paxos推到一个很高的位置.但是,paxos有没有什么问题呢?实际上,paxos还是有其自身的缺点的: 1. 活锁问题.在base-paxos算法中,不存在leader ...

  8. 2018年东北农业大学春季校赛-wyh的吃鸡

    BFS: 1. 从起点开始BFS,遇到X点则return: 2. vis[px][py][0]代表经过pxpy这点前还没有找到车: vis[px][py][1]代表经过pxpy这点前已经找到车: 3. ...

  9. plsql启动提示监听服务无法连接

    话说现在用的oracle少了,本人菜鸟一个,但是我真心的没有感觉到它用的少了,今天入了一个新项目,数据库使用的还是oracle,经理二话不说的给了一些东西,说了让一句你把环境啥地 配置一下,然后走人了 ...

  10. jmeter入门(02)测试报告各项指标含义

    一.名词定义(时间单位ms) 1.聚合报告 Sample:本次测试场景共运行多少个请求: Average:平均响应时间: Median:统计意义上的响应时间中值: 90% line:所有线程中90%的 ...