【NOIP2015TG】solution
链接: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的更多相关文章
- about家庭智能设备部分硬件模块功能共享【协同工作】solution
本人设备列表: Onda tablet {Android} wifi Desktop computer {win7.centos7} 外接蓝牙adapter PS interface 键盘.鼠标{与同 ...
- 【leetcode】solution in java——Easy1
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6409067.html 1:Hamming distance The Hamming distance betw ...
- 【436】Solution for LeetCode Problems
Coding everyday. ^_^ 1. Two Sum 重点知识:指针可以存储数值,通过 malloc 新建数组 int* returnSize:Size of the return arra ...
- 【NOIP2012TG】solution
D1T1(Vigenere) 题意:给你一个原串与一个密码串,问你按照题意规则加密后的密文. 解题思路:暴力模拟. #include <stdio.h> ],c[],u1[],u2[]; ...
- 【NOIP2014TG】solution
链接:https://www.luogu.org/problem/lists?name=&orderitem=pid&tag=83|31 D1T1(rps) 题意:给你一个周期,以及胜 ...
- 【NOIP2016TG】solution
传送门:https://www.luogu.org/problem/lists?name=&orderitem=pid&tag=83%7C33 D1T1(toys) 题意:有n个小人, ...
- 【NOIP2013TG】solution
链接:https://www.luogu.org/problem/lists?name=&orderitem=pid&tag=83%2C30 D1T1:转圈游戏(circle) 题意: ...
- 【NOIP2011TG】solution
老师最近叫我把NOIPTG的题目给刷掉,于是就开始刷吧= = 链接:https://www.luogu.org/problem/lists?name=&orderitem=pid&ta ...
- 【leetcode】solution in java——Easy5
转载请注明原文地址: 21:Assign Cookies Assume you are an awesome parent and want to give your children some co ...
随机推荐
- 2017-2018-1 Java演绎法 第六七周 作业
团队任务:修改完善<需求规格说明书>等 团队组长:袁逸灏 本次编辑:刘伟康 修改完善上周提交的需求规格说明书 [markdown 链接] [pdf 链接] 不足之处:仅就现在的问题来看,结 ...
- Alpha冲刺No.3
冲刺Day3 一.站立式会议 终于我们遇到了我们最艰难的时候,组员也反映每天做的事情越来越少,出现了问题越来越多. 人太少,时间太少,我们没有办法一个人花足够多的时间去钻研统一个问题,或许是所以组员的 ...
- B-dya6
1.昨天的困难,今天解决的进度,以及明天要做的事情 昨天的困难:在导入导出方面遇到了困难,导出的文件不能直接导入. 今天解决的进度:完成了登录页面的背景设计,并再次测试了整个系统的功能. 明天要做的事 ...
- Beta冲刺Day2
项目进展 李明皇 今天解决的进度 优化了信息详情页的布局:日期显示,添加举报按钮等 优化了程序的数据传递逻辑 明天安排 程序运行逻辑的完善 林翔 今天解决的进度 实现微信端消息发布的插入数据库 明天安 ...
- Node入门教程(5)第四章:global 全局变量
global - 全局变量 全局对象(global object),不要和 全局的对象( global objects )或称标准内置对象混淆.这里说的全局的对象是说在全局作用域里的内的对象.全局作用 ...
- LeetCode题型分类及索引
目录 这是一个对LeetCode题目归类的索引,分类标准参考了July大神的<编程之法>以及LeetCode的tag项.分类可能还不太合理,逐步完善,请见谅~ 题主本人也在一点一点的刷题, ...
- python 中os.path.join 双斜杠的解决办法
这两天在写东西的时候遇到了这个问题,主要是上传图片之后,无法在页面展示,原因就出在用join 拼接的路径中出现了"\"而造成的. >>> import os &g ...
- python中 return 的用法
return 语句就是讲结果返回到调用的地方,并把程序的控制权一起返回 程序运行到所遇到的第一个return即返回(退出def块),不会再运行第二个return. 要返回两个数值,写成一行即可: de ...
- React中路由传参及接收参数的方式
注意: 路由表改变后要重启服务 方式 一: 通过params 1.路由表中 <Route path=' /s ...
- keepalive配置支持ipv6、ipv4双棧支持
因公司业务需要,keepalived需要同时支持ipv6和ipv4 keepalived版本1.2.23. keepalived 配置: 重点:ipv6的虚IP配置在 virtual_ipaddres ...