Lucky Transformation

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int n,k,cnt;
char s[];
int main(){
freopen("trans.in","r",stdin);freopen("trans.out","w",stdout);
//freopen("Cola.txt","r",stdin);
while(scanf("%d%d",&n,&k)!=EOF){
scanf("%s",s);cnt=;
int rest=;
for(int i=;i<n;i++){
if(s[i]==''&&s[i+]==''){
if(i>&&(i+)%==&&s[i-]==''&&s[i+]==''){
rest=k-cnt;break;
}
else if((i+)%==&&s[i+]==''&&s[i+]==''){
rest=k-cnt;break;
}
else{
if((i+)%==)s[i]='';
else s[i+]='';
cnt++;
if(cnt==k)break;
}
}
}
rest%=;
if(rest==||cnt==k){
printf("%s\n",s);
}
else{
for(int i=;i<n;i++){
if(s[i]==''&&s[i+]==''){
if((i+)%==)s[i]='';
else s[i+]='';
break;
}
}
printf("%s\n",s);
}
}
}

100分 规律

Snake vs Block

#include<iostream>
#include<cstdio>
#define maxn 210
using namespace std;
int n,m,map[maxn][],num,ans,head[maxn],edge[maxn*+][maxn*+];
struct node{
int to,pre,v;
}e[maxn**];
int make_id(int i,int j){return (i-)*+j;}
void Insert(int from,int to,int v){
e[++num].to=to;
e[num].v=v;
e[num].pre=head[from];
head[from]=num;
edge[from][to]=num;
}
void dfs(int x,int y,int sc,int len){
if(x>n){
ans=max(ans,sc);
return;
}
int now=make_id(x,y);
for(int i=head[now];i;i=e[i].pre){
int to=e[i].to;
if(e[i].v==)continue;
int xx=(to-)/+,yy=to%;
if(yy==)yy=;
e[i].v=;
if(map[xx][yy]>=){
int p=map[xx][yy];
map[xx][yy]=;
dfs(xx,yy,sc,len+p);
map[xx][yy]=p;
}
else {
if(len+map[xx][yy]<){ans=max(ans,sc);}
else {
int p=map[xx][yy];
map[xx][yy]=;
dfs(xx,yy,sc-p,len+p);
map[xx][yy]=p;
}
}
e[i].v=;
}
}
int main(){
freopen("snakevsblock.in","r",stdin);freopen("snakevsblock.out","w",stdout);
//freopen("Cola.txt","r",stdin);
scanf("%d",&n);
for(int i=;i<=n;i++)
for(int j=;j<=;j++){
int id=make_id(i,j);
if(j!=)Insert(id,make_id(i,j-),);//向左
if(j!=)Insert(id,make_id(i,j+),);//向右
Insert(id,make_id(i+,j),);//向下
scanf("%d",&map[i][j]);
}
scanf("%d",&m);
int x,y;
for(int i=;i<=m;i++){
scanf("%d%d",&x,&y);
int id1=make_id(x,y),id2=make_id(x,y+);
e[edge[id1][id2]].v=;
e[edge[id2][id1]].v=;
}
dfs(,,,);
printf("%d",ans);
}

30分 建图+dfs

/*
把豆豆和砖块丢在一起dp
f[i][j][k]:到第i行,蛇的长度还剩下j,从k位置出第i行的最大得分
g[j][l][r]:蛇的长度剩下j,从当前行l到r区间内仍为死亡的最大得分
初始化:对于每个i,g[j][k][k]=f[i-1][j-a[i][k]][k]+max(-a[i][k],0) 为初始状态
方程g[j][l][r] = max(g[j-a[i][l]][l+1][r] + max(-a[i][j],0),g[j-a[i][r]][l][r-1]+max(-a[i][k],0));
最后f[i][j][k] = max{g[j][l][r](1≤l≤k ≤r ≤5)}
*/
#include<iostream>
#include<cstdio>
#include<cstring> #define N 207
#define M 10005 using namespace std;
int a[N][],f[N][M][],g[M][][];
bool flag[N][];
int n,m,maxi,ans,val; inline int read()
{
int x=,f=;char c=getchar();
while(c>''||c<''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} int main()
{
freopen("snakevsblock.in","r",stdin);
freopen("snakevsblock.out","w",stdout);
n=read();int x,y;
for(int i=;i<=n;i++) for(int j=;j<;j++)
a[i][j]=read();
m=read();
for(int i=;i<=m;i++)
{
x=read();y=read();
flag[x][y-]=;
}
memset(f,-0x7f7f7f,sizeof f);
f[][][]=;maxi=n*; for(int i=;i<=n;i++)
{
memset(g,-0x7f7f7f,sizeof g);
for(int j=;j<=maxi;j++)
for(int k=;k<;k++)
if(j-a[i][k]>= && j-a[i][k]<=maxi)
f[i][j][k]=g[j][k][k]=f[i-][j-a[i][k]][k]+max(-a[i][k],); for(int l=;l<=;l++)
for(int j=,k=j+l;k<;j++,k++)
for(int v=;v<=maxi;v++)
{
if(!flag[i][j] && (val=v-a[i][j])>= && val<=maxi) g[v][j][k] = g[val][j + ][k] + max(-a[i][j], );//g[v][j][k]=max(g[v][j][k],g[val][j+1][k]+max(-a[i][j],0));
if(!flag[i][k-]&& (val=v-a[i][k])>= && val<=maxi) g[v][j][k]=max(g[v][j][k],g[val][j][k-]+max(-a[i][k],));
for(int to=j;to<=k;to++) f[i][v][to]=max(f[i][v][to],g[v][j][k]);
}
} for(int i=;i<=n;i++)
for(int j=;j<=maxi;j++)
for(int k=;k<;k++)
ans=max(f[i][j][k],ans); printf("%d\n",ans);
return ;
}

100分 动态规划

Ping

#include<iostream>
#include<cstring>
#include<cstdio>
#define maxn 100010
using namespace std;
int n,m,k,num,head[maxn],fa[maxn],dep[maxn],h[maxn],cnt;
bool vis[maxn],v[maxn];
int c[][<<];
struct node{
int to,pre;
}e[maxn*];
struct Node{
int l,r;
}p[];
void Insert(int from,int to){
e[++num].to=to;
e[num].pre=head[from];
head[from]=num;
}
int count(int x){
int res=;
while(x){
if(x&)res++;
x>>=;
}
return res;
}
void dfs(int now,int father){
fa[now]=father;dep[now]=dep[father]+;
for(int i=head[now];i;i=e[i].pre){
int to=e[i].to;
if(to==father)continue;
dfs(to,now);
}
}
int sta;
bool lca(int a,int b){
if(vis[a]||vis[b])return ;
if(dep[a]<dep[b])swap(a,b);
while(dep[a]>dep[b]){
a=fa[a];
if(vis[a])return ;
}
while(a!=b){
a=fa[a];b=fa[b];
if(vis[a]||vis[b])return ;
}
return ;
}
bool ok(int s){
memset(vis,,sizeof(vis));
int pos=;
while(s){
pos++;
if(s&)vis[h[pos]]=;
s>>=;
}
for(int i=;i<=k;i++){
int a=p[i].l,b=p[i].r;
if(lca(a,b))continue;
else return ;
}
return ;
}
bool check(int x){
for(int i=;i<=c[x][];i++){
int s=c[x][i];
if(ok(s)){
sta=s;
return ;
}
}
return ;
}
int main(){
freopen("ping.in","r",stdin);freopen("ping.out","w",stdout);
//freopen("Cola.txt","r",stdin);
scanf("%d%d",&n,&m);
for(int i=;i<=(<<n)-;i++){
int nu=count(i);
c[nu][++c[nu][]]=i;
}
int x,y;
for(int i=;i<=m;i++){
scanf("%d%d",&x,&y);
Insert(x,y);Insert(y,x);
if(!v[x])h[++cnt]=x,v[x]=;
if(!v[y])h[++cnt]=y,v[y]=;
}
dfs(,);
scanf("%d",&k);
for(int i=;i<=k;i++)
scanf("%d%d",&p[i].l,&p[i].r);
int l=,r=cnt,ans=;
while(l<=r){
int mid=(l+r)>>;
if(check(mid))ans=mid,r=mid-;
else l=mid+;
}
printf("%d\n",ans);
int pos=;
while(sta){
pos++;
if(sta&)printf("%d ",h[pos]);
sta>>=;
}
return ;
}

30分 二分答案

#include <bits/stdc++.h>
using namespace std;
int n, m, P, u, v, to[], nxt[], p[], deep[], q[][];
int son[], fa[], size[], top[], dfsx[], cnt, ans;
int lca[], Q[], lr[][];
int sta[];
bool flag[];
void dfs(int x)
{
size[x] = ;
for (int i = p[x]; i != -; i = nxt[i])
if (to[i] != fa[x])
{
fa[to[i]] = x;
deep[to[i]] = deep[x] + ;
dfs(to[i]);
if (son[x] == - || size[to[i]] > size[son[x]]) son[x] = to[i];
size[x] += size[to[i]];
}
}
void dfs1(int x)
{
dfsx[x] = ++cnt;
if (son[x] != -) top[son[x]] = top[x], dfs1(son[x]);
for (int i = p[x]; i != -; i = nxt[i])
if (to[i] != fa[x] && to[i] != son[x])
top[to[i]] = to[i], dfs1(to[i]);
}
int findlca(int x, int y)
{
while ()
{
if (top[x] == top[y]) return deep[x] > deep[y]? y : x;
if (deep[top[x]] > deep[top[y]]) x = fa[top[x]];
else y = fa[top[y]];
}
}
bool query(int x, int l, int r, int ll, int rr)
{
if (l == ll && r == rr) return flag[x];
int mid = (l + r) >> , L = x << , R = L | ;
if (rr <= mid) return query(L, l, mid, ll, rr);
else if (ll > mid) return query(R, mid + , r, ll, rr);
else return query(L, l, mid, ll, mid) | query(R, mid + , r, mid + , rr);
}
void modify(int x, int l, int r, int to)
{
flag[x] = true;
if (l == r) return;
int mid = (l + r) >> , L = x << , R = L | ;
if (to <= mid) modify(L, l, mid, to);
else modify(R, mid + , r, to);
}
bool Query(int x, int y)
{
while ()
{
if (top[x] == top[y])
{
if (deep[x] < deep[y]) return query(, , cnt, dfsx[x], dfsx[y]);
else return query(, , cnt, dfsx[y], dfsx[x]);
}
if (deep[top[x]] > deep[top[y]])
if (query(, , cnt, dfsx[top[x]], dfsx[x])) return true;
else x = fa[top[x]];
else
{
if (query(, , cnt, dfsx[top[y]], dfsx[y])) return true;
else y = fa[top[y]];
}
}
}
void work(int x)
{
for (int i = p[x]; i != -; i = nxt[i])
if (to[i] != fa[x])
work(to[i]);
for (int i = lr[x][]; i <= lr[x][]; i++)
if (!Query(q[Q[i]][], q[Q[i]][]))
{
modify(, , cnt, dfsx[x]);
sta[++ans] = x;
return;
}
}
bool cmp(int x, int y) {return lca[x] < lca[y];}
int main()
{
freopen("ping.in","r",stdin);
freopen("ping.out","w",stdout);
scanf("%d%d", &n, &m);
for (int i = ; i <= n; i++) p[i] = son[i] = -, top[i] = size[i] = fa[i] = deep[i] = ;
for (int i = ; i <= n * ; i++) flag[i] = false;
for (int i = ; i <= m; i++)
{
scanf("%d%d", &u, &v);
u--, v--;
to[i * - ] = v;
nxt[i * - ] = p[u];
p[u] = i * - ;
to[i * ] = u;
nxt[i * ] = p[v];
p[v] = i * ;
}
deep[] = ;
dfs();
cnt = ;
dfs1();
scanf("%d", &P);
for (int i = ; i <= P; i++)
{
scanf("%d%d", &u, &v);
u--, v--;
q[i][] = u, q[i][] = v;
lca[i] = findlca(u, v);
Q[i] = i;
}
sort(Q + , Q + P + , cmp);
for (int i = ; i <= n; i++) lr[i][] = P + , lr[i][] = ;
for (int i = ; i <= P; i++)
{
lr[lca[Q[i]]][] = min(lr[lca[Q[i]]][], i);
lr[lca[Q[i]]][] = max(lr[lca[Q[i]]][], i);
}
ans = ;
work();
printf("%d\n", ans);
for (int i = ; i <= ans; i++) printf("%d ", sta[i] + );
return ;
}

100分

2017-10-20 NOIP模拟赛的更多相关文章

  1. 2017 10.25 NOIP模拟赛

    期望得分:100+40+100=240 实际得分:50+40+20=110 T1 start取了min没有用,w(゚Д゚)w    O(≧口≦)O T3 代码3个bug :数组开小了,一个细节没注意, ...

  2. 10.16 NOIP模拟赛

    目录 2018.10.16 NOIP模拟赛 A 购物shop B 期望exp(DP 期望 按位计算) C 魔法迷宫maze(状压 暴力) 考试代码 C 2018.10.16 NOIP模拟赛 时间:2h ...

  3. 10.17 NOIP模拟赛

    目录 2018.10.17 NOIP模拟赛 A 咒语curse B 神光light(二分 DP) C 迷宫maze(次短路) 考试代码 B 2018.10.17 NOIP模拟赛 时间:1h15min( ...

  4. 2018.10.16 NOIP模拟赛解题报告

    心路历程 预计得分:\(100 + 100 + 20 = 220\) 实际得分:\(100 + 100 + 30 = 230\) 辣鸡模拟赛.. T1T2都是一眼题,T3考验卡常数还只有一档暴力分. ...

  5. 2017.5.27 NOIP模拟赛(hzwer2014-5-16 NOIP模拟赛)

    期望得分:100+100+60+30=290 实际得分:100+20+60+0=180 当务之急:提高一次正确率 Problem 1 双色球(ball.cpp/c/pas) [题目描述] 机房来了新一 ...

  6. 2018.10.30 NOIp模拟赛 T1 改造二叉树

    [题目描述] 小Y在学树论时看到了有关二叉树的介绍:在计算机科学中,二叉树是每个结点最多有两个子结点的有序树.通常子结点被称作“左孩子”和“右孩子”.二叉树被用作二叉搜索树和二叉堆.随后他又和他人讨论 ...

  7. 【2019.7.20 NOIP模拟赛 T1】A(A)(暴搜)

    打表+暴搜 这道题目,显然是需要打表的,不过打表的方式可以有很多. 我是打了两个表,分别表示每个数字所需的火柴棒根数以及从一个数字到另一个数字,除了需要去除或加入的火柴棒外,至少需要几根火柴棒. 然后 ...

  8. 2016.10.30 NOIP模拟赛 day2 PM 整理

    满分:300分 直接全部爆零,真的是很坑啊! 10.30的题目+数据:链接:http://pan.baidu.com/s/1jHXLace 密码:i784 T1: 题目中的难点就是每次折叠的点可能应经 ...

  9. 2016.10.30 NOIP模拟赛 day2 AM 整理

    题目+数据:链接:http://pan.baidu.com/s/1gfBg4h1 密码:ho7o 总共得了:130分, 1:100分  2:30分(只会这30分的暴力) 3:0(毫无思路) 虽然不高, ...

  10. 2018.10.20 NOIP模拟 蛋糕(线段树+贪心/lis)

    传送门 听说是最长反链衍生出的对偶定理就能秒了. 本蒟蒻直接用线段树模拟维护的. 对于第一维排序. 维护第二维的偏序关系可以借助线段树/树状数组维护逆序对的思想建立权值线段树贪心求解. 代码

随机推荐

  1. Python习题-一个函数实现读写功能

    def new_op_file(filename,content=None): f = open(filename,'a+') f.seek(0) if content: #非空即真,如果有内容就往下 ...

  2. linux命令学习笔记(57):ss命令

    ss是Socket Statistics的缩写.顾名思义,ss命令可以用来获取socket统计信息,它可以显示和netstat 类似的内容.但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的 ...

  3. ffmpeg推流命令参数记录

    列出我们本机的设备:ffmpeg -list_devices true -f dshow -i dummy .\ffmpeg -r 25 -f dshow -s 640*480 -i video=&q ...

  4. IntelliJ手记

    1. 配置JDK:File - Project Structure - SDKs,点击“+”即可: 2. 配置远程调试,对于azkaban的远程调试,在azkaban-solo-start.sh里面的 ...

  5. Poj_1008--Maya Calendar

    一.Description 上周末,M.A. Ya教授对古老的玛雅有了一个重大发现.从一个古老的节绳(玛雅人用于记事的工具)中,教授发现玛雅人使用了一个一年有365天的叫做Haab的历法.这个Haab ...

  6. 第二次C语言实验报告

    #一.设计题目,设计思路,实现方法 ##设计题目 15-10 找最长的字符串,14-5 指定位置输出字符串,13-6 数组循环右移,12-5 查找指定字符,11-5 打印杨辉三角. ##设计思路 15 ...

  7. JAVA 1.5 并发之 ReentrantLock

    在文章里我不打算具体讲Lock的实现,对此有兴趣的请点击这篇博文 http://www.blogjava.net/BucketLi/archive/2010/09/30/333471.html 我是一 ...

  8. Velocity下面的Velocimacros设置

    Velocimacros #macro script element允许模板设计者定义一段可重用的VTL template.Velocimacros广泛用于简单和复杂的行列.Velocimacros的 ...

  9. Python-RabbitMQ消息队列实现rpc

    客户端通过发送命令来调用服务端的某些服务,服务端把结果再返回给客户端 这样使得RabbitMQ的消息发送端和接收端都能发送消息 返回结果的时候需要指定另一个队列 服务器端 # -*- coding:u ...

  10. Jenkins配置邮件SMTP(使用QQ邮箱)

    一.QQ邮箱中开启SMTP服务 进入QQ邮箱的设置页面,选择开启POP3/SMTP服务 需要发送一条短信开启服务,成功后,会收到一个密码,一定要截图.复制密码保存好 二.Jenkins中配置SMTP ...